From 356edec0243f11d4f6d3b914aa8ed12e627f8b2a Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sat, 25 Nov 2023 11:43:18 -0500 Subject: [PATCH 01/73] Noodle Begins --- .../Nyanotrasen/Lamiae/ClientLamiaeSystem.cs | 36 ++ .../Nyanotrasen/Lamiae/LamiaSystem.cs | 151 ++++++++ .../Nyanotrasen/Lamiae/LamiaComponent.cs | 14 + .../Lamiae/LamiaSegmentComponent.cs | 18 + .../Nyanotrasen/Lamiae/SharedLamiaeSystem.cs | 11 + .../Mobs/Customization/Markings/lamia.yml | 8 + .../Entities/Mobs/Player/lamia.yml | 36 ++ .../Entities/Mobs/Species/lamia.yml | 339 ++++++++++++++++++ .../Objects/Specific/Species/lamia.yml | 78 ++++ .../Prototypes/Nyanotrasen/Species/lamia.yml | 38 ++ .../equipped-OUTERCLOTHING-LamiaSegment.png | Bin 0 -> 921 bytes .../lamia_masking_helpers.rsi/female_full.png | Bin 0 -> 673 bytes .../lamia_masking_helpers.rsi/female_none.png | Bin 0 -> 632 bytes .../lamia_masking_helpers.rsi/female_top.png | Bin 0 -> 673 bytes .../lamia_masking_helpers.rsi/meta.json | 1 + .../lamia_masking_helpers.rsi/none.png | Bin 0 -> 4982 bytes .../Mobs/Species/lamia.rsi/bottom.png | Bin 0 -> 1227 bytes .../Mobs/Species/lamia.rsi/meta.json | 36 ++ .../Mobs/Species/lamia.rsi/placeholder.png | Bin 0 -> 815 bytes .../Mobs/Species/lamia.rsi/tip.png | Bin 0 -> 674 bytes .../Mobs/Species/lamia.rsi/torso_f.png | Bin 0 -> 8155 bytes .../Mobs/Species/lamia.rsi/torso_m.png | Bin 0 -> 8155 bytes .../Mobs/Species/lamia.rsi/underscales.png | Bin 0 -> 621 bytes .../Mobs/Species/lamia.rsi/verbiconfangs.png | Bin 0 -> 710 bytes error.txt | Bin 0 -> 1500238 bytes 25 files changed, 766 insertions(+) create mode 100644 Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs create mode 100644 Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs create mode 100644 Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs create mode 100644 Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs create mode 100644 Content.Shared/Nyanotrasen/Lamiae/SharedLamiaeSystem.cs create mode 100644 Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamia.yml create mode 100644 Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/lamia.yml create mode 100644 Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml create mode 100644 Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml create mode 100644 Resources/Prototypes/Nyanotrasen/Species/lamia.yml create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/equipped-OUTERCLOTHING-LamiaSegment.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/female_full.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/female_none.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/female_top.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/meta.json create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/none.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/bottom.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/placeholder.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/tip.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/torso_f.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/torso_m.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/underscales.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/verbiconfangs.png create mode 100644 error.txt diff --git a/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs b/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs new file mode 100644 index 00000000000..924978dc9df --- /dev/null +++ b/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs @@ -0,0 +1,36 @@ +using Content.Shared.Nyanotrasen.Lamiae; +using Content.Shared.Humanoid; +using Robust.Shared.GameObjects; +using Robust.Shared.GameStates; +using Robust.Client.GameObjects; +namespace Content.Client.Nyanotrasen.Lamiae; + +public sealed class LamiaSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnSegmentSpawned); + } + + public void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, SegmentSpawnedEvent args) + { + component.Lamia = args.Lamia; + + if (!TryComp(uid, out var sprite)) + return; + + if (TryComp(args.Lamia, out var humanoid)) + { + foreach (var marking in humanoid.MarkingSet.GetForwardEnumerator()) + { + if (marking.MarkingId != "LamiaBottom") + continue; + + var color = marking.MarkingColors[0]; + sprite.LayerSetColor(0, color); + } + } + } +} diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs new file mode 100644 index 00000000000..63837f60e2b --- /dev/null +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -0,0 +1,151 @@ +using Robust.Shared.Physics; +using Content.Shared.Damage; +using Content.Shared.Humanoid; +using Content.Server.Humanoid; +using Content.Server.Access.Systems; +using Robust.Server.GameObjects; +using Robust.Shared.Prototypes; +using Robust.Shared.Containers; +using Robust.Shared.Map; +using Robust.Shared.Physics.Systems; +using Robust.Shared.Physics.Components; +using Robust.Shared.Maths; +using System.Numerics; +using Content.Shared.Nyanotrasen.Lamiae; + +namespace Content.Shared.Nyanotrasen.Lamiae +{ + public sealed partial class LamiaSystem : EntitySystem + { + [Dependency] private readonly SharedJointSystem _jointSystem = default!; + [Dependency] private readonly IPrototypeManager _prototypes = default!; + [Dependency] private readonly IdCardSystem _idCardSystem = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + + Queue<(LamiaSegmentComponent segment, EntityUid lamia)> _segments = new(); + public override void Update(float frameTime) + { + base.Update(frameTime); + foreach (var segment in _segments) + { + var segmentUid = segment.segment.Owner; + var attachedUid = segment.segment.AttachedToUid; + if (!Exists(segmentUid) || !Exists(attachedUid) + || MetaData(segmentUid).EntityLifeStage > EntityLifeStage.MapInitialized + || MetaData(attachedUid).EntityLifeStage > EntityLifeStage.MapInitialized + || Transform(segmentUid).MapID == MapId.Nullspace + || Transform(attachedUid).MapID == MapId.Nullspace) + continue; + + EnsureComp(segmentUid); + EnsureComp(attachedUid); // Hello I hate tests + + var ev = new SegmentSpawnedEvent(segment.lamia); + RaiseLocalEvent(segmentUid, ev, false); + + if (segment.segment.SegmentNumber == 1) + { + Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates; + var revoluteJoint = _jointSystem.CreateWeldJoint(attachedUid, segmentUid, id: ("Segment" + segment.segment.SegmentNumber + segment.segment.Lamia)); + revoluteJoint.CollideConnected = false; + } + if (segment.segment.SegmentNumber < 32) + Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0f, 0.15f)); + else + Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0, 0.1f)); + + var joint = _jointSystem.CreateDistanceJoint(attachedUid, segmentUid, id: ("Segment" + segment.segment.SegmentNumber + segment.segment.Lamia)); + joint.CollideConnected = false; + joint.Stiffness = 0.2f; + } + _segments.Clear(); + } + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnJointRemoved); + SubscribeLocalEvent(OnRemovedFromContainer); + SubscribeLocalEvent(HandleSegmentDamage); + } + + private void OnInit(EntityUid uid, LamiaComponent component, ComponentInit args) + { + SpawnSegments(uid, component); + } + + private void OnShutdown(EntityUid uid, LamiaComponent component, ComponentShutdown args) + { + foreach (var segment in component.Segments) + { + QueueDel(segment); + } + + component.Segments.Clear(); + } + + private void OnJointRemoved(EntityUid uid, LamiaComponent component, JointRemovedEvent args) + { + if (!component.Segments.Contains(args.OtherBody.Owner)) + return; + + foreach (var segment in component.Segments) + QueueDel(segment); + + component.Segments.Clear(); + } + + private void OnRemovedFromContainer(EntityUid uid, LamiaComponent component, EntGotRemovedFromContainerMessage args) + { + if (component.Segments.Count != 0) + { + foreach (var segment in component.Segments) + QueueDel(segment); + component.Segments.Clear(); + } + + SpawnSegments(uid, component); + } + + private void HandleSegmentDamage(EntityUid uid, LamiaSegmentComponent component, DamageModifyEvent args) + { + args.Damage.DamageDict["Radiation"] = Shared.FixedPoint.FixedPoint2.Zero; + _damageableSystem.TryChangeDamage(component.Lamia, args.Damage); + + args.Damage *= 0; + } + + private void SpawnSegments(EntityUid uid, LamiaComponent component) + { + int i = 1; + var addTo = uid; + while (i < component.NumberOfSegments + 1) + { + var segment = AddSegment(addTo, uid, component, i); + addTo = segment; + i++; + } + } + + private EntityUid AddSegment(EntityUid uid, EntityUid lamia, LamiaComponent lamiaComponent, int segmentNumber) + { + LamiaSegmentComponent segmentComponent = new(); + segmentComponent.AttachedToUid = uid; + EntityUid segment; + if (segmentNumber == 1) + segment = EntityManager.SpawnEntity("LamiaInitialSegment", Transform(uid).Coordinates); + else if (segmentNumber == lamiaComponent.NumberOfSegments) + segment = EntityManager.SpawnEntity("LamiaSegmentEnd", Transform(uid).Coordinates); + else + segment = EntityManager.SpawnEntity("LamiaSegment", Transform(uid).Coordinates); + + segmentComponent.Owner = segment; + segmentComponent.SegmentNumber = segmentNumber; + EntityManager.AddComponent(segment, segmentComponent, true); + _segments.Enqueue((segmentComponent, lamia)); + lamiaComponent.Segments.Add(segmentComponent.Owner); + return segment; + } + } +} diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs new file mode 100644 index 00000000000..0d022e4cda5 --- /dev/null +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs @@ -0,0 +1,14 @@ +namespace Content.Shared.Nyanotrasen.Lamiae +{ + /// + /// Controls initialization of the multisegmented lamia species. + /// + [RegisterComponent] + public sealed partial class LamiaComponent : Component + { + public List Segments = new(); + + [DataField("numberOfSegments")] + public int NumberOfSegments = 32; + } +} diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs new file mode 100644 index 00000000000..c33ec31d848 --- /dev/null +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs @@ -0,0 +1,18 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Nyanotrasen.Lamiae +{ + /// + /// Lamia segment + /// + [RegisterComponent] + [NetworkedComponent] + public sealed partial class LamiaSegmentComponent : Component + { + public EntityUid AttachedToUid = default!; + + public bool SexChanged = false; + public EntityUid Lamia = default!; + public int SegmentNumber = default!; + } +} diff --git a/Content.Shared/Nyanotrasen/Lamiae/SharedLamiaeSystem.cs b/Content.Shared/Nyanotrasen/Lamiae/SharedLamiaeSystem.cs new file mode 100644 index 00000000000..01eb1909a00 --- /dev/null +++ b/Content.Shared/Nyanotrasen/Lamiae/SharedLamiaeSystem.cs @@ -0,0 +1,11 @@ +namespace Content.Shared.Nyanotrasen.Lamiae; + +public sealed class SegmentSpawnedEvent : EntityEventArgs +{ + public EntityUid Lamia = default!; + + public SegmentSpawnedEvent(EntityUid lamia) + { + Lamia = lamia; + } +} diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamia.yml new file mode 100644 index 00000000000..21438d7a8c6 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamia.yml @@ -0,0 +1,8 @@ +- type: marking + id: LamiaBottom + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Lamia] + sprites: + - sprite: Nyanotrasen/Mobs/Species/lamia.rsi + state: bottom diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/lamia.yml new file mode 100644 index 00000000000..031ae52ddc1 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/lamia.yml @@ -0,0 +1,36 @@ +- type: entity + save: false + name: Lamia + parent: MobLamiaBase + id: MobLamia + description: A miserable pile of scales. + components: + - type: CombatMode + - type: InteractionPopup + successChance: 1 + interactSuccessString: hugging-success-generic + interactSuccessSound: /Audio/Effects/thudswoosh.ogg + messagePerceivedByOthers: hugging-success-generic-others + - type: Mind + showExamineInfo: true + - type: Input + context: "human" + - type: MobMover + - type: InputMover + - type: Respirator + damage: + types: + Asphyxiation: 1.5 + damageRecovery: + types: + Asphyxiation: -1.5 + - type: Alerts + - type: Actions + - type: Eye + - type: CameraRecoil + - type: Examiner + - type: CanHostGuardian + - type: NpcFactionMember + factions: + - NanoTrasen + - type: PotentialPsionic diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml new file mode 100644 index 00000000000..9e67d1b4b1f --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml @@ -0,0 +1,339 @@ +- type: entity + save: false + name: Lamia + parent: BaseMobHuman + id: MobLamiaBase + abstract: true + description: A miserable pile of scales. + components: + - type: Flashable + - type: Polymorphable + - type: Identity + - type: Hands + - type: HumanoidAppearance + species: Lamia + - type: MovementSpeedModifier + baseWalkSpeed : 4 + baseSprintSpeed : 6 + - type: MovedByPressure + - type: Barotrauma + damage: + types: + Blunt: 0.075 #per second, scales with pressure and other constants. + - type: DamageOnHighSpeedImpact + damage: + types: + Blunt: 5 + soundHit: + path: /Audio/Effects/hit_kick.ogg + - type: Hunger + - type: Thirst + - type: IdExaminable + - type: HealthExaminable + examinableTypes: + - Blunt + - Slash + - Piercing + - Heat + - Shock + - type: Stamina + - type: Blindable + - type: Clickable + - type: InteractionOutline + - type: Icon + sprite: Mobs/Species/Human/parts.rsi + state: full + - type: Physics + bodyType: KinematicController + - type: Tag + tags: + - CanPilot + - DoorBumpOpener + - ShoesRequiredStepTriggerImmune + - type: Sprite + netsync: false + noRot: true + drawdepth: Mobs + scale: 1, 1 + layers: + - map: [ "enum.HumanoidVisualLayers.Chest" ] + color: "#e8b59b" + sprite: Nyanotrasen/Mobs/Species/lamia.rsi + state: torso_m + - map: [ "enum.HumanoidVisualLayers.Head" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: head_m + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + color: "#008800" + sprite: Mobs/Customization/eyes.rsi + state: eyes + - map: [ "enum.HumanoidVisualLayers.RArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_arm + - map: [ "enum.HumanoidVisualLayers.LArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_arm + - shader: StencilMask + map: [ "enum.HumanoidVisualLayers.StencilMask" ] + sprite: Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi + state: female_full + visible: false + - map: [ "jumpsuit" ] + shader: StencilDraw + - map: [ "enum.HumanoidVisualLayers.LHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_hand + - map: [ "enum.HumanoidVisualLayers.RHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_hand + - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: [ "id" ] + - map: [ "gloves" ] + - map: [ "ears" ] + - map: [ "enum.HumanoidVisualLayers.Tail" ] + sprite: Mobs/Customization/masking_helpers.rsi + state: none + visible: false + - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt" ] + - map: [ "belt2" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] + state: bald + sprite: Mobs/Customization/human_hair.rsi + - map: [ "mask" ] + - map: [ "head" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] + - map: [ "enum.HumanoidVisualLayers.HeadTop" ] + sprite: Mobs/Customization/masking_helpers.rsi + state: none + visible: false + - sprite: Nyanotrasen/Mobs/Species/lamia.rsi + state: underscales + - type: Body + template: LamiaTemplate + preset: LamiaPreset + - type: AtmosExposed + - type: Flammable + fireSpread: true + canResistFire: true + damage: + types: + Heat: 1 #per second, scales with number of fire 'stacks' + - type: Damageable + damageContainer: Biological + damageModifierSet: Scale + - type: Temperature + heatDamageThreshold: 400 + coldDamageThreshold: 285 + currentTemperature: 310.15 + specificHeat: 46 + coldDamage: + types: + Cold : 0.2 #per second, scales with temperature & other constants + heatDamage: + types: + Heat : 0.1 #per second, scales with temperature & other constants + - type: LizardAccent + - type: NoSlip + - type: ThermalRegulator + metabolismHeat: 800 + radiatedHeat: 100 + implicitHeatRegulation: 500 + sweatHeatRegulation: 2000 + shiveringHeatRegulation: 2000 + normalBodyTemperature: 310.15 + thermalRegulationTemperatureThreshold: 25 + - type: Internals + - type: MobState + thresholds: + 0: Alive + 100: Critical + 200: Dead + - type: SlowOnDamage + speedModifierThresholds: + 60: 0.7 + 80: 0.5 + - type: Appearance + visuals: + - type: RotationVisualizer + - type: BuckleVisualizer + - type: CreamPiedVisualizer + state: creampie_human + - type: DamageVisuals + thresholds: [ 20, 40, 100 ] + targetLayers: + - "enum.HumanoidVisualLayers.Chest" + - "enum.HumanoidVisualLayers.Head" + - "enum.HumanoidVisualLayers.LArm" + - "enum.HumanoidVisualLayers.RArm" + damageOverlayGroups: + Brute: + sprite: Mobs/Effects/brute_damage.rsi + color: "#FF0000" + Burn: + sprite: Mobs/Effects/burn_damage.rsi + - type: FireVisuals + sprite: Mobs/Effects/onfire.rsi + normalState: Generic_mob_burning + alternateState: Standing + fireStackAlternateState: 3 + - type: CombatMode + - type: Climbing + - type: Cuffable + - type: AnimationPlayer + - type: MeleeWeapon + soundHit: + collection: Punch + range: 0.8 + 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: Fixtures + fixtures: # TODO: This needs a second fixture just for mob collisions. + fix1: + shape: + !type:PhysShapeCircle + radius: 0.35 + density: 2000 + restitution: 0.0 + mask: + - MobMask + layer: + - MobLayer + - type: Lamia + - type: Inventory + templateId: human + - type: StatusEffects + allowed: + - Stun + - SlowedDown + - Stutter + - SeeingRainbows + - Electrocution + - Drunk + - SlurredSpeech + - PressureImmunity + - Muted + - KnockedDown + - ForcedSleep + - TemporaryBlindness + - Pacified + - PsionicsDisabled + - PsionicallyInsulated + - type: Speech + speechSounds: Alto + - type: Vocal + - type: Emoting + - type: Grammar + attributes: + proper: true + - type: StandingState + - type: Fingerprint + - type: MobPrice + price: 1500 # Kidnapping a living person and selling them for cred is a good move. + deathPenalty: 0.01 # However they really ought to be living and intact, otherwise they're worth 100x less. + - type: Perishable + +- type: entity + save: false + name: Lamia Dummy + parent: MobHumanDummy + id: MobLamiaDummy + description: A dummy lamia meant to be used in character setup. + components: + - type: Sprite + netsync: false + noRot: true + drawdepth: Mobs + scale: 1, 1 + layers: + - map: [ "enum.HumanoidVisualLayers.Chest" ] + color: "#e8b59b" + sprite: Nyanotrasen/Mobs/Species/lamia.rsi + state: torso_m + - map: [ "enum.HumanoidVisualLayers.Head" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: head_m + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + color: "#008800" + sprite: Mobs/Customization/eyes.rsi + state: eyes + - map: [ "enum.HumanoidVisualLayers.RArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_arm + - map: [ "enum.HumanoidVisualLayers.LArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_arm + - shader: StencilMask + map: [ "enum.HumanoidVisualLayers.StencilMask" ] + sprite: Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi + state: female_full + visible: false + - map: [ "jumpsuit" ] + shader: StencilDraw + - map: [ "enum.HumanoidVisualLayers.LHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_hand + - map: [ "enum.HumanoidVisualLayers.RHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_hand + - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: [ "id" ] + - map: [ "gloves" ] + - map: [ "ears" ] + - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] + state: bald + sprite: Mobs/Customization/human_hair.rsi + - map: [ "mask" ] + - map: [ "head" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] + - map: [ "enum.HumanoidVisualLayers.HeadTop" ] + sprite: Mobs/Customization/masking_helpers.rsi + state: none + visible: false + - map: [ "enum.HumanoidVisualLayers.Tail" ] + sprite: Mobs/Customization/masking_helpers.rsi + state: none + visible: false + - sprite: Nyanotrasen/Mobs/Species/lamia.rsi + state: underscales + - type: Inventory + templateId: lamia diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml new file mode 100644 index 00000000000..a4408122cc6 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml @@ -0,0 +1,78 @@ +- type: entity + id: LamiaInitialSegment + noSpawn: true + components: + - type: Physics + bodyType: KinematicController + - type: Fixtures + fixtures: # TODO: This needs a second fixture just for mob collisions. + fix1: + shape: + !type:PhysShapeCircle + radius: 0.25 + density: 80 + restitution: 0.0 + mask: + - MobMask + + - type: Transform + anchored: false + - type: Tag + tags: + - HideContextMenu + +- type: entity + id: LamiaSegment + parent: LamiaInitialSegment + name: lamia segment + noSpawn: true + description: A tail segment, hopefully attached to a lamia. + components: + - type: Sprite + layers: + - map: [0] + sprite: Nyanotrasen/Mobs/Species/lamia.rsi + state: placeholder + - type: Clickable + - type: Tag + tags: + - DoorBumpOpener + - type: ExplosionResistance #This looks stupid but remember that bombs are likely to damage every segment, we want them to be decent but not instagib the poor lamia.s + damageCoefficient: 0.2 + - type: Physics + bodyType: KinematicController + - type: Fixtures + fixtures: # TODO: This needs a second fixture just for mob collisions. + fix1: + shape: + !type:PhysShapeCircle + radius: 0.25 + density: 80 + restitution: 0.0 + mask: + - MobMask + +- type: entity + id: LamiaSegmentEnd + parent: LamiaSegment + name: lamia tail tip + noSpawn: true + description: The end of a lamia's tail. + components: + - type: Sprite + layers: + - map: [0] + sprite: Nyanotrasen/Mobs/Species/lamia.rsi + state: tip + - type: Physics + bodyType: KinematicController + - type: Fixtures + fixtures: # TODO: This needs a second fixture just for mob collisions. + fix1: + shape: + !type:PhysShapeCircle + radius: 0.25 + density: 80 + restitution: 0.0 + mask: + - MobMask diff --git a/Resources/Prototypes/Nyanotrasen/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Species/lamia.yml new file mode 100644 index 00000000000..14c5a80c12d --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Species/lamia.yml @@ -0,0 +1,38 @@ +- type: species + id: Lamia + name: Lamia + roundStart: true + prototype: MobLamia + dollPrototype: MobLamiaDummy + sprites: MobLamiaSprites + markingLimits: MobLamiaMarkingLimits + skinColoration: HumanToned + maleFirstNames: names_cyno_male + femaleFirstNames: names_cyno_female + lastNames: names_cyno_last + sexes: + - Female + +- type: markingPoints + id: MobLamiaMarkingLimits + points: + Hair: + points: 1 + required: false + Tail: + points: 1 + required: true + defaultMarkings: [ LamiaBottom ] + +- type: speciesBaseSprites + id: MobLamiaSprites + sprites: + Head: MobHumanHead + Hair: MobHumanoidAnyMarking + Chest: MobHumanTorso + Eyes: MobHumanoidEyes + LArm: MobHumanLArm + RArm: MobHumanRArm + LHand: MobHumanLHand + RHand: MobHumanRHand + Tail: MobHumanoidAnyMarking diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/equipped-OUTERCLOTHING-LamiaSegment.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/equipped-OUTERCLOTHING-LamiaSegment.png new file mode 100644 index 0000000000000000000000000000000000000000..475a45bf9d9ea540225379c0e5d4d62507063db3 GIT binary patch literal 921 zcmV;K17`e*P)4Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmOVGd00F&8L_t(o zN9~hcD+Ey($NvnIm(jAC3CkqOOExaV4RNm&Nx3HZ25wx)g|DEb_D+f9!Y5d9LkbaU zlZN#&leLpwv>9Wc(@eQg&Rn>1e)V+z^ZcLYJm)zx5C{YUfj}S-{Cf(#m77UPay|JY zF~1C}QC9=%)doG6=^PK6;WHwL}+=Yf=D2L+{FPc`1uyu;TCKcwQ z$vkaNL;T7@N{zxa@6o-nR-x;9hMB*>-N1ZnhkKK_z<8t#v4SvcwFZ^m1k(8lgscZl zx+!cVU(wLqhK0*Bu6GxD>#xw}Q$r(IZjK`PF5{@B80)K#EJ#z1JgT8uUbq_|XuLCt zQ`DD!py|ZM=tMOO(v%~QYJw1`fupp|PI>!QgsaXFw$`3lkft1YR1*a5Z-D*)y4&8j z8x-La+l685DV5CY%cL>c}*5j~)%+dJZrAngg)*TutEA*lSL<_HIi7a$lAsSU`u=5M|EE5$?y}qXGg9rPM zu4?YyypC^Olfnw$I>~;MCVh~N|IYE@tKPBAf6o84thzGiXhVaC&1s&?YWEc8-P^)@ z?)MSFuqmOBiXRzH*7NvtqV(uv^K-1zS?5U_US3)Gh+|_!M)K0$$ctAxmUk>(wJdnw zgpUzV_Z*GX4v+ji?@#N)Ir}!9DV^2qks#wA+~ue{-(y0ckoIM*eSPn8e;_UzN-{&JV;ZgyP$+1fdF z44JRADw$TT$X?><>&pI&T~>%!rEBV&_dp@Z64!_l=ltB<)VvY~=c3fa zlGGH1^30M91$R&1fbd2>aiF3~PZ!6Kid%1QIr23q@Gv-j`CqSRe?fp%d+yGvh8z*0 z4W>Xv4cvl){`3CV*4(%-u{L(5+=5?+3d8=hun0IXFoFr7l4?o*Ap7~3PjN1>JsD?c z_`N=$y1b&AN8M@n+5=^r$9~u^_$95-z`(=-CIZ6PyDm7tnxVDjDA0TcPgg&ebxsLQ E0NM-^IRF3v literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/female_none.png b/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/female_none.png new file mode 100644 index 0000000000000000000000000000000000000000..895e0b5a132f96c00be90cae95641ba50a0a2a8e GIT binary patch literal 632 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU~I{Bb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZrAngg)*TutEA*lSL<_HIi7a$lAsSU`u=5M|EE5$?y}qXGg9rPM zu4?YyypC^Olfnw$I>~;MCVh~N|IYE@tKPBAf6o84thzGiXhVaC&1s&?YWEc8-P^)@ z?)MSFuqmOBiXRzH*7NvtqV(uv^K-1zS?5U_US3)Gh+|_!M)K0$$ctAxmUk>(wJdnw zgpUzV_Z*GX4v+ji?@#N)Ir}!9DV^2qks#wA+~ue{-(y0ckoIM*eSPn8e;_UzN-{&JV;ZgyP$+1fdF z44JRADw$TT$X?><>&pI&T~mdK II;Vst0E=Mz#{d8T literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/female_top.png b/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/female_top.png new file mode 100644 index 0000000000000000000000000000000000000000..71bc96fe209d8cc815f51ac3fc889217ee0c67bd GIT binary patch literal 673 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 S2+nN~Bng`xS~_#_s{aAL;cf>2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/bottom.png b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..bf711ef304464a8c45b8fba87d3b34ce08999281 GIT binary patch literal 1227 zcmV;+1T_1JP)EX>4Tx04R}tkv&MmKpe$iTct%>1lvKxAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRx%k-{RDAVPqQIx48bLV{L}6cZWRPkQ)=9KT2|nOqex zax9<*6_Voz|AXJ%n#IWpHz}M1dS7h&V+0890jVfq16NwdUuyz0pQJZB zTKov;-v%zOJDR))TBG{N9>XdFwmAx<_wJJj=q>dJsB7=~dOhG7_nVHoCrLfo|jCNvri@_iqc zWdQ)9_E%R|jmC7(L`+1KrV&C+C8)mdLn#FS!yt@J`dUWi{b&kUmSr-jMghoWtTRGN37r&>(rElfDbUYYXT>zv` zmja`@G)z{&PXJFfb(xdPV=>XBdWI7=~dOhG7_nVHk$_r_ugb zczb*M{mRP9=JD|{Y}+0dB*KM>N~MBYtv2!R102U8&+||$79;&wUtdS3)7jhD*m#>} zE43~_L}k}?mFIbAHk+_*8=mI@KxCnE8pKtFf=OsLn@~#C9mlEf?(SBE5NC0=5(7X) z1=n>|)Bxk0mi2)Eoz_x7w7;eM+!S*g!fUb{mq~5VT&rAI>EKIRj zocL3~)Tg<*xz^(1;^U~c)Te-L+fKXPu9K74h p5mAFi$gG3$e2St$L|Z!7{{{}G*oQsXOUVEL002ovPDHLkV1ipdIH>>t literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json new file mode 100644 index 00000000000..ebfd0e2dc7b --- /dev/null +++ b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json @@ -0,0 +1,36 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by Archer2150#2528 using assets from Rane. Fangs by discord user @Hyenh6078", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "placeholder" + }, + { + "name": "bottom", + "directions": 4 + }, + { + "name": "tip" + }, + { + "name": "verbiconfangs" + }, + { + "name": "underscales", + "directions": 4 + }, + { + "name": "torso_f", + "directions": 4 + }, + { + "name": "torso_m", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/placeholder.png b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..e0cb4814daf69c8d4488c2563bc810ab2b73b82e GIT binary patch literal 815 zcmV+~1JL}5P)EX>4Tx04R}tkv&MmKpe$iTct%>1lvKxAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRx%k-{RDAVPqQIx48bLV{L}6cZWRPkQ)=9KT2|nOqex zax9<*6_Voz|AXJ%n#IWpHz}M1dS7h&V+0890jVfq16NwdUuyz0pQJZB zTKov;-v%zOJDR))TEX>4Tx04R}tkv&MmKpe$iTct%>1lvKxAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRx%k-{RDAVPqQIx48bLV{L}6cZWRPkQ)=9KT2|nOqex zax9<*6_Voz|AXJ%n#IWpHz}M1dS7h&V+0890jVfq16NwdUuyz0pQJZB zTKov;-v%zOJDR))TTOp@q11ES=LF zpqJ=H)VU7M3OYOI5;;ms4v?{H3+eW|s8G=17o7Y*2!!{@4>8*Yg;w}5l*6k~+edZByo zVT{=VxN`DV+yZ4;?w)&VEv&UKuj{%qH;+AmBuP+J6#$^F>xD){+&KOln5L0Px# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/torso_f.png b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/torso_f.png new file mode 100644 index 0000000000000000000000000000000000000000..f818a478944e6aafe10e6febbd232745c1ccb64e GIT binary patch literal 8155 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 bc>MY>_x1eBbC)sO`*o+QX{eE>b~X4vQ3J`u literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/torso_m.png b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/torso_m.png new file mode 100644 index 0000000000000000000000000000000000000000..f818a478944e6aafe10e6febbd232745c1ccb64e GIT binary patch literal 8155 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 bc>MY>_x1eBbC)sO`*o+QX{eE>b~X4vQ3J`u literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/underscales.png b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/underscales.png new file mode 100644 index 0000000000000000000000000000000000000000..edc457a79b7e3bbb117a90a32d9016829319a14e GIT binary patch literal 621 zcmV-z0+RiSP)EX>4Tx04R}tkv&MmKpe$iTct%>1lvKxAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRx%k-{RDAVPqQIx48bLV{L}6cZWRPkQ)=9KT2|nOqex zax9<*6_Voz|AXJ%n#IWpHz}M1dS7h&V+0890jVfq16NwdUuyz0pQJZB zTKov;-v%zOJDR))TFiG>?GT@Au4+FX^000000Ki>5B8z(O@855&wNR~WugIcO%Itll2_3+; zZL{~0Mgk&>BtQcGCjsHnwXW-T6xLcVIRXIy0001PXZSWZ<92vv&(OQTUd9{2%$~ys zknu`1v!?`%7LWi5kboKcIDOAU`EX>4Tx04R}tkv&MmKpe$iQ%gmv4(%Y~kfG{gK~%(1s#pXIrLEAagUO{ILX(Ch z#l=x@EjakGSaoo5*44pP5ClI!9G#pLU8KbSC509-9vt`M-Mz=%J3weum}+*71FB{j z=|o)2ga5(rZq4H4gqswK1A!OY{ul;=yFjyU+uz5w-8=#O&%l+|_E#Ig%qQvf zwiZ1C`nQ3L>$WEE0hc?#z>_W+k|X(P3dJJuen#Jv2g0{N&#K#7Yagc%K$f~%x&aOj zfsqnruX((?yR)}{&$Rmc0bv|+px1XgZU6uP24YJ`L;$(~0001^G^@%0000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j&MA6)yp%*g)a{006>CL_t(o!|jy85yT(}MKJ}K z-t8d8aHJU0z~2)yhQVxHvp3!;6X65;l_*J)ByqIX001I_)*9Z>6A=J-rl+bfR23ou zA|ey%*P?);cx$D6f=KZW~Zl%odwzYTx%u&CLfL#}Ovl zL{AGv@sajdADDR}4@BR+fk&Qsd=m`s=H6)Dp#AOfLrk4lFZ%15N6mV+(E>A1o%@|1 sn0f6{TG@f+$81I5jh8e@k|g;%AKqC_gmCBwWdHyG07*qoM6N<$g2eMRN&o-= literal 0 HcmV?d00001 diff --git a/error.txt b/error.txt new file mode 100644 index 0000000000000000000000000000000000000000..753ecc761e3f1b8cbccfc3db43bcb9de8d280f56 GIT binary patch literal 1500238 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�u|dW!u;PDhD+w4;$7smnE8F#72(Z_XxV+Xvg_&&fgDpWBRM zl+@{!=1OREOy~~KIWJOoGs%L&N)w5e^oyk5tlLmmI;4y!@g?fI_>#40pIa6!MwBa;dzEoowvAM7zMW zKmOfUJtwuMV5i-y4sPftDbd_S?W>(>YNhKv>Ylaq%UV!MpXmELmgQkT{TuyfJ6*`4 znL|pfxT|lidR+P~L>|cIYM|b7E7-Q2-wOF|1*clmC4t0-cb?VpR)Tsw)*fiBGB zPgjmvOw)v24zDchsax01>ofJG(j&8`$z52?5l9 zrC7{orp4(_u${AvF{5oGwlu59eChA?Zs2svdvS?-#NX^?NFt%bd)~8y8dUW8U?&D)SP}NuZjUe9y@@p19Cx=*F^ z90dCu@@SRQE40ogQs1t6zI+b(v^F^+vx^(4GKb14RJYYJyj5Ho@u+Z>qr!1@w6rVk z>2O}9)l11Q((5;}YWQ%niu_*n)I!vcnD(W`Skn74r?V48UZXTdtH+X*WV<`VeKh$T zoZGckwrk`3VF_;T6;}xyH;x$pKp$v(+>^0DzXoQdtj#EzQXSh8*OLFhgt zX3AyNj5|r=AfKTJulYB{r{h`K@%OG?^iyZi;3vKd%xC@f7@5ZouY6r@-5%9zH}kYg z^;dG+)W?O;q5}AeaD$#A3BQ~43nL5$kP+jb6Z(?jRPfHVD!)?s$ZA{$@;hkQp zGKa$Sqhi_v{iKV7zDZPCRR8Euj{2?WwKfBaX2B+TMX2I_y&^O|7NkNx&JOKPHg*0WNg&52B>SIw~qqqxfP-``D$<5ehBJ36aonM}oekelbl{+mOkR({;% zu|GXECt)7fH{OZa`}!Ln`!{pdTs+?$PGWUDyLxu9diC*muIrYoI&1y*$jEF5o!MqV zMc)~}JjP+wGTr|ZDjIB+wLZ@D?>bl9?)Hsnf*UE#UPgO)SJcja?)|Eva=fjJ6Dwc@ zU`uR*DYd$Y$a}#{qbA8!EV+HVnf7gZB%zSpESkI@V@vNSy*;(D$u?xGWBBxwYm*+x8cj13q5A$NA<0o>J(_MzD>KhLygy{qoF}r(xRnX-#h*8R@%W z;s`oYXQXGl)AwfKEON)ygy^asR=+PIt6Vv_mu#iEZp_bLR|b>k${0 z>QShMUVl=WFh{j)&+lmEllL}yZ)1LbUHQx|J2-7DcSo8RQ@(h{>dgLWP>C`_;5tNW z>ECsgC^n3#_GnMo(iS;E=JVeP90*&eb7MH7!E?=lw|TB+jq4q6W;59p;9FN$bHhxE zCENPIj1|LLKDKOfSV`?D2V1^(bu}?Hj`7b|Ku|-XW3q(N@LV9)f^ORMlM>vNPdusP z#=HL6%My`fEYK=d6-%(70@c7UjMR4f!H zE15#CgcY^8hkvWB$s3w`ccIwcqUjiKuh-7T>Mpj2nGMHRs>@7@p-Q$fr)SWP^w+~Q zvqO1f)a<#hzNU$17Q>m6*(*ln6{8e`;By+hZihZWX5!2`1H^yQ2X-tZ)2Bc;BVLqV zdeqx-dmP&%*ENIqZ1888Ot2QFJD%woAdBtdY>?u16UHEpq=ep<3;G01SrsKXh zyH3(h^J3Y?>c-cH&X6nCQ8@j>+y~W?bT#Eh4o^n(qhyBU@8d zoubXD9*+m3TPoU}*b9g^!b))jEK{s-ZU<|$S+JF@o-sVuv8+3+-W%o}JfE|JXHn>R zFl1Kqr;<2&Ry)I-zP@AKJtf?h_sHMI9{DtCt!s7Cd!iqs9|*PdR)HsTT-`=om2hOX zr>ewO)%}}ma#o8Yn^pbhL9vFxaT8hhn^wO`y;Y7Mv#lQ61zTd>kKI&1_91YBXP;OA z>vnshJf6uaWitLI2cc(`n@6QGc*W3XL`>Wkc+VO1a>xn|E|1;1TKkFf)m%Il@C z6iNAne`-_Ix2ou^?#a`8qTjwFeh=*l2+ghKdwz6N^P_QmP2GorEbG3j-(KPBUhvlW z+cX_jHx*S?_0;^>iQ+%9S};Vu$ClQ5#l6~467gjFw@`BDTB%flSGRnY(f&gUqiQb) zy;nA0mF$)H2*uIgb=w!xO4$?xa+I}@?;h#rzWyg~A;0C_@b7_aFWCv%tsRHB%BCM2 z>L;F>{uXW5uecq{fqj*j!G9!_4?`iYhHut`>nrESI(6y=Rm`S@bII4@_il) zw_QjEGrIvh^+(qq8xg$|G<1$=NA#4D)EU~jyg(!^u-x^&(!2!i=}t52Simv1VPEyBE0Q5^gTVO#O&y zCg{26k**?}t#g~$ka^)W_IH*s)P4HnsC*Hiy#n+_hmB&$0Zw^C^A!lqv_E zl#f>1Df9KyX-3-YK#J;u>M`DT<$YK4>VYW7d5KT1FkH8!UfG2w|C{1aQ`@Pm~2SgA)C!Wx89#j^_L>snHyaSA)G8oL>!|1$wu`%!d-Lo9PPlHC+Z? z=t5eTww4LT=1TurrxePS*aiJm&$bFpRI!xQQ7)6d*e`Sj^~udPgM@4INUwaTE7Vz? zKCI3xaAgxMOK{~@5!{}HDd$yBqxbri_xe@6s-rNKTYaXBg!*&I0?y?2NGZ~3~eakCaS)VE<;GWy`=tFvKNBC{XPhB_kKX~Zob zbq*-LY*s{9zn$C5KK2qn+Yg0%%2A(b0>`2L!=~C!A-+H2j8RCA7==4@oxjg3!Ll(m zWO2Ho{|pFas^&$QHM6h3nP_t+r7Si$-p@SGE1lPyp(W-_;b&0P(tpIZt*&We^=A>W zn%XC|=k?=s#i-2CB{#~S=VOsfeQWen*-hJ0jddK)2A%6VCaT8TUhC8Npm#_I^E27} zHQmniS(~;)?=`<4=sz^ObZ0YXbWJLv_SPxL(Fx!h{^vD*2y z8glHrLQ+YsrksVe?sl{Mb(ObuW#(^ZYQJ{<>R_(Ll`zTG8(;5BAqoUm?4+Zr531&+ zrQK9KiZv^lemsg@T4XdDdqmUtH$5-!I40UNKe$*QUK+K2FaJ*G@QMDl9=}QPDOe>w z-O0}XQ)JX_mRBB~7s#(XmSX#{HoOw25`ldPG2Xk0*_W|fj&7f=x9IF^eEpMY-ETu) zRXxsbqw2|JvWQKeU?w7%1f;y`M>pP9d)YyO}l8iiIQqwYK2nE6YbqUWYa25^tc+a?|E@7)1PJR z&x!mUIaYOL_rvl|L5-z-4LM_%%T5@tguVkyT%S&3Eb4Og@mFYK&m`xJ0`R)VmDDXL zY|U%g&$nW6ZFBXwIb?7vY~{_38a+?Bxp@j%N1LHD#cyxY`8D^XT2 z9~xH!tm|VeFN%+^-xn1#%nzl<5iMA51nW7_&CG$mlSerW-7hIa2#UT7@eub~mm+-| zC$$_r;t5WYo~{y=x9{^Yo?;pKm#+Gqb)3@u1RwKQ6|gt@9i5V~g4RojUdj4B<3(RYlZX4KRQ z;8A$?c);TUH14^T(X`UoL?^ZpBwG)EWhI-Biyr^(aAN5!cI$fIp!W^tqj+=b@UjcBLMP$>vCx_0?bf>320i&^l{O0 z?gaFK!rWX5UUSkmLgs3j9et^DgqPr4-em0}v?|O8y}PxB?l*s)MT}4FT+{2W9;JFz zI@_ppR+xmNVt&Q!Flk6g=Qghor#53v$-v+md?O~6P38yvK3JamUUO2~IJ-vVSYrR~ zg&8Ri3i=o-Wkj=+;Wr@&%R{`%#46%fv(W3ZeJC8bCEtqu(K-&w9geZDo!+YOo zzrIoUa+{82QyfOACQ#Ai!C+gP&q+N?^r#QSt$$UpC2({;old}sHNaH;i>LfaX9gaq z>F~2184?mn&$mC0p_{41 z>W?8dnS!D1Y#-(rx|tXnT?v4%fLCFjKUvzSdOy)QT0UkF<$AStzURG}xfRH9e$cY{ zRpG)$X#<%va~QHSI)aYXzYrOzCWjW;3!8pbQV$rF0k|H(^#CP$fYFt%S)v~|r%qgyMY8U2FC8op}_d-(bHbeR1e zg=X@^*z>*{s@?3G^sUyN+-e7X` zXGe}Y3*VG9pBQv>#mc_JVwE311in;U0N#`_~4t)JnpcQA%I zES~KxZck^$N7Q+UeB@exx$_hrE8NsrVaH>IPMxW%>iVkcELKQk)fmlkPkMWd5VnUJ zsFE1Ll?OLdc`(jr|0ss|sjk+#H;*V{7a<&#du#XBi}lvKvTGhV@eX zDz&rjja{2UFCDZcdzI{JNP8(m?>3cI%aM=X6}U^=8~Qp$INZV z%zd$3%#_LR({jw*EX-6f@%Y#|hjFqvxdcsomi66z&Nw;aG@0A9`9#|VJ<5)>+rv1u z^={*BTl?|#+TtjE99sj(?OY#Mx8dIoyyo4f=8fL?MC`$-{_nDl-Te8H)1d!fm3<`Zl#Ba`CN zzw>8z?S+ookHOQJ*I=f6^-Au$`}pokZIoKDXyfqX>Fp6C?3=d^3!k<$`wrdFHH2lX zVz#r8`D88ZTEsHB?{wce3*WgY+-?cA=rSF*j@wz`7QZ}d!gaUDz9+pAnMcVSe%FHB zR4qs|d!5E({~#U*?XB$^VCGGX64`ZEmPw4txxEk9`*6GZ!6UnvYQM={n#^}s6(w$E zq{A_1hS=ud@5)`j=;)PdqBBMDPa)H0!ztPE`04#?1E0iII*F?^e|;?efT>+apR5$| z8Gi9j_LR;#-|<-AD?3&$8cfGD%tm!gXEpk;8mT(qCw(_mCTvn`J8Ih1eHWn;0h@H9 z9UN@iX2xsuV-JRPiF|~l7NE|bJkgP_2KD)SR87|Os;~9a_&M-t*5+|IbNqEWduLyd z=N!-VKURX4wifIU+Y}D;+kqw9CIc5Chh6#6jgs98;qHrO?6;=-ch07o^vECeI9HcmKqy%pl_#c zUoEPmr;DgAf5uh!_8NBKRND`q=y&G4tk-%RZJW}!!Sd>m+&{})+t zY;}4D?KpNl%%3?deDyVb_V!*ZO7Xa}H14dh`6}$>o;RYI5Pt_AP8L9Nucd@Nj?Q87dAEBLH|@| zWRdQ=B4e2Qam;Sa@8eF=OT8zQk?>7l=r?#+xZ-#69`Ls?CU*b6{`NiLeW%dC9lh0O z+O7mV)OTw4)v?6)3dfE|F)O~VD3!f#Ufph6YVV@yhs-K=oWzQ<_l^EjtRJjR^~^eM zqYW&@X}!J)JM>1cH%}#Zd=0O5_NjJOHSl^)P5c}0tKSo?*aLOYm)S7K#_DFUqq4?& z=6W7##8i>%*2FA5RtL7Y@`UW|w!XdmI14nMYZ|20Alg18_V4ZLwTQCFpO5sa)jN2v zzc0m7`!0BTZm{&r#YsoI^D0Ed70)->CPh4<_Rr;)U8#C|l&a)^#u~%1bnU7mDx$i~ zW{yi)4|~Qzh?cP4(fi#AO!M7>DKeG)xo%iT=iQulI~KxnufunGq-prm{V{cq8{>D| zNL@k^c>j@4QXFM~klF zgaqQ13o%ydBjAadpTM_~##K?paxdEt=J8j=TSQd#YW{{^8@_3J-pY={yFoMPEY|Gn zXp2Fg<%Y9HUp1fjxloA3#9!l=r$OF$oH?)1hgXPKmRd&ngWg`MhvQ0-||A{4hcI0iVQz4I$Ti0x>G>YpR=Yc>r z^6q$jTv7PbV8dUjdP-b-XEx)^ZP{365N*rK=CVCr z+0Csexks;ibaEQ&0?uc!Q(sy4sE_0eF60far8$Y1OsCE;dEqDdX87z!`k$X|+gj51 zo4#UtUe<5S>$Q)cdlt@z_p#{n_vuV&vzb|rS)Ud-n`wbj(>|Tvo&0Ea+r?Ac=GN4> z@M$xSRf{*LQ3&1%R+1^y9!H+3I{6`}EM{XbRx6GKMRZKX>ddwB_VEhAJ=JM#9#}O4 zZZq`quzw^MPiaI}j}%=A=t{tR9oaNi&`|4E&})Rd$~T#7NenT{GFg1Vjym`~6fW0; z|B>yyXlM~lb^0JMHB94}-XeOm=LjwL(>90my?PI?wXcQ_Z@B2)fb$PRF!L1*tDAx6 zaqsQ(ITtUtjt3mX~gU!@-ZTzbLZOeT^u@-R`>GU9{cp zhiTADpR7d^ReV7&aqOa97pG+N5@x}`I~U+wKp7WM#$|!wJXGHsqIz;Z=X)+JuUNi* z`Z8=h9sH@x>8)%V**>-LDqk|)kXyJ9@(1(*rJPA~QcBA1#u=hMHG5I9=rduLId74z zsxUmOoqF!0-A9-CXsl`ZToaVVrP_{I8;9FH6;B(x5cz8(=zprI%CKV(b)68+!j4Vq zg#4$fhUk2&>?KYjw3>t+`B?YA3CBFv@m(EkpY61@`jj`aNx{}x`btbEzhU#JWTt*8 z^+Oex|7);~#DMAj(Mr-+OJ7g^)_@m68tm$!jz^|+p!2cspA5-tW%U@eaCC9M9%AXa z&W7j0-PlHqJ@wVn9ZO#=>N$>C_pl|JxKsnbtJgf#*)f@}nw;5nj$i6Cpf8t>+}}T; z{#@ruPcQq(<9p`!=DTKI2HHQHmw_L$tH3&ibI!=scKy_LRZVOD*U0^XDL@tSeh?~- z17d78=x;&_R+Ouf4n{nM%{ExqRYXTQx8%=;{iAgp(8w|N6RYgAVEaX*i?zZfjDBTd z>$dHgFvNz{b=j$_fH39}VBNkK&WK`QviLjo9F=0YLT-$!PjsZ&T41+!eXO0uT>auo zCYaGb?rOM4vaq*Z4TpE=lbvh{KVPYm?!7s;9Yv%4BK?D9`AO=R>b}gh8*E;-z4ZCh zKI=1xe+w}ZicWlC+cOg9!yw`5Y|HBJ!&v@X?OXm=K{U3fOk-b@e^8q;A82Dxe{J`C zeLUaKif70g$q)ISU}R5a!A#F?an1)>^%zOVo!`|Y;#Z$G*%5zR{`pbIvHqy|xGE>6 z&-;!h4&*A^d^hCZ^?mqO9kQ;!sooZ`NwjS`G?=-IP>H+Hy^BWlPGEVq3NqMs=b-P` z$^CX$t}>w|^icqEXBD_OR1Ay9r)~DDWtB8@*B7 znKCYXEA0up`Mh7O#Mrr{adUlMi$|QR5OK26zz*bN8#pu9~g0^DV<0lL^jc zSC}b(G=iVJSFG8Yj5yQn>;~34Mu2QjdmZwW;{p!cGn4txrk)3;Y=_W1t=O+ZG%P)N z@1}BN&o-!Vt(K3(Hj!1DW(k$y3;9&|keB*i9B_$tKdGklR*^|CgNG}t0 zpzYPB!o&t|IQu%E;`&yL_NLXhvP;V%XpU6foMJVseP?R!l^&|SE37<64UrB{d z8lH}g9J$fHEA;bfqN^6&Kaq-;c{*sRP`Kk4v1PwV@y=xMcyD#zV=2quf9kQbUJoXd zftc!^{s3cq4h;rg|~Vv7UzhO zBb0O?jYbhsd&E)~e)4NtW>F3IjvnT^EN=Hqg_p^>fmQEI(9@R-!y4HXRWyjkVmLpx zZ2Se-F+26EJlW6cEqth-)`55yd<(ff8$G*k?Xpnp-D4+3evf3^Zn%2xrmE+vNWWhm zK-YKKR;e^Ds^iu30M7&RqqOOfOMSg$ADSZzkHQqO!P$@uJ5UV2W$E2%>9pKd?yD}1LV05Hh z=}KDD?Aoe}g})!_7^k5UOg9lxr@aETmVfKjPYdd@`#RobQt4o-N4n{p-t#lv(yVZ} zg0zoJX?2XWp--R8iuSg#wiEv%+@G{p8}q0FlIRKMZ`EbwzE%rX6f z4l4dV5T3v(voGv8%o$k=sAU!m6`q5ze_>6mXnKZZVbl%Z>hV@%FODd9}O#gEL>Z zr&EvbdYqoRODjf&W;aBR)W_4Pz%)K385q$8um2_->10^ROsh5ZJ?Fluy6>)X`=+tf z?QV99>y}H!$bMaNezJ@9R?GBWx}wfQCR~pz+Ue@|Xlo-gn%|@BxO8038kd!-H!3L8yrb0CGMUrkhqT&|UbFRD zfwTRypI-CxvoxtE=G&1$Gm((adg8G|ruoY|a4=Zx$+J<>IBsO!)x_I)b$^FZi>p|)>Z zb_w0cM}0#V;?QgoE&7fZp`(mGS<{t#r$?YrwX?z6@mQ;$elLr3p?a!K6l3EH)%H=U zl5zER+r06Up3N)3S@E--Gv@SL#QMCku$&#bf^!|wv?^vn*TNLE>YU9^dv(6NI-kpI zJ`Fw$_}N&q*NSjy#uDYJ+ft8c7xg(eFPW=2AE9n@=j)@94SwRf_v+)Evm&G1;O?{v#M zStq8+P|M&p7(&~Y*Sxo~O4O6L6fx!E&GSQ7{9uv6*R)+Vi@>+VbNOD^@$LAY1->mN zt|OdSCRV);Wtn3gmusn=e^MD>!T}xR(Ow(ByIC;xImI)tfp6fo=@93ezSOa)Mf|GY z(+T41W4p@fOz)l*m#-4C8vBLbpY=6U!?*5uHYGJXkkXjiv*tco^L!AwE!M7V$J|kAht)H#H6fPSlH5wSJd-?_#9^~a-s)AF zk53Zbwpf#0+05z7#^X~P5q&Zc==Ydi$SU;ZcWk8w5Rymt7JG;z%aDJyR~SChK^ne{ISY zTZ#GoAlUrNU_DROv%aQU5R>D0J)QxR#&O>2H?*~8F>PuVns3zKZWH_3#CrBy&R;(M zR0}3Mr51um+|#$jq(^cFQxKS~1dq8$9BnOK<>D%re3eUyT}>Z5&hw)ew<=Kn{t~yW zM90(gPu)yko{zcB&{^p5W?cjHt$Tk(N9BqTa5t^@e;T;K(^h3OdVRLzz&z$#N%#5| zIr$vd>1&s>&iB!Nl=gOy#)ibko_zEx&UZJYhv@vk}yX_-1x*KKcczSkaw zBv|z8Vbw6As;gt$IiE7cHUG{`Ag5BeWbYQj+$fstFP&^v@68>xclXE zDF$;8xfQbQzCBWW?_HV->ekN#gZNfh(je5WMH@^r42BvMwiPIF0stQGFBjW|v~w z?ej&OW6CfzV{c{29)=3}L8y>plU@f4cpS7f&*Zz91x>Bp^kw9lreP!Ad^7lFP~u@@ z1>3xK8d22i*j}UQ$I{TnLeJZ!zO7?f$6xdv!=$pQnD3w8uWS7*WDaDP)$>Mgf4V>H zM$flw9_#tmk&@1{Iud7(V4E_vRlqS$$}gg&MR{o1c|B+8j{WkZJ-3*|U-OIYQp?vD zZ^xhPZ0gZcu7$0*v)NGQOyKMz{BhBzeT&OBZ)OpweGq!@y@Kc!L?TDx#A*7&h(F)T zj+3pU*0Stld|XPuqiqJ=Ri;69h*~J-F}5$S+v3{Ryy@BPlo5>CR^7i_hk|pG)1hP4 zEbwB{Y<0wZG*6CMQ(V{c`8vA0qt}!HuRq)4+J6oHI{1q?mCu{^EfSxm8{RIcC64MC z+mn}JCI^`mJDU&1HCb=jdV_Up@>D6iK_(Xawo>m<##7nrdf(S-d4AOEWLjSrWca&M zkTW})_~I~h7F5y3<4|iM;+RyOp(BCErCXpc#kHLZ%WI9Jx(2;pC2)~eZ9DYqu%RKh zit{4O>oC3?G*l=`tq^@+hPL`+)*BevRjeC3TnWb=swdB`+bdK0>p>AWc3O$qjdmt}M4otLpDSvw$;x;;DdBj?%L>?#}#UGE`ZiDKA=X}t= z%*M5&qJOJiKYhnAOH3L<1BZ7@KhyZ0Ef)2CHQ4x)+BctbDMLOT_L-&jpkOwoXUbfA zO^x?5#(0ay(zX~EymP)C^=#Qxbc;~1u3B})tlG3Xw(+VARN|#O5mQf?dcF-=dZrAa ztwR~!&ZhCzv)LgRr%V-8?JgJQhQ@ksP932)o zr?0S4AK=^UkFoo~7tTW$yQ_$qOqBDZzE=4vn+MvS0qUq)4h;czxldPoeI8kQtw)I@uKU?opZFIbi>6N29^Gx^TTK%Rj#+i&hOvYpNGwms=c&xh6`!Hc6 zt@#*#ac@{TyOXVtio6&zYEG34Q@M&dqm96so$7Y$O(s)#sJxgQAxC}p&rmH()pxOP z?qN`6*^!UM!o3N{WD2)yo9wflUfcAiY|}}wT1;eM5>WMbmoH>LRoR4f$Ii`+^m8oD z{V-3%w+Xvu2+MLF*wW}X#`llCl(PFwo`yUb#R3YA_xjD$3*D9pUZSK^*JJeC6r)d$ zi|9Q-sa7(7ijI|tO4Em5DC)5+;DsuRHhIJiRr};`AEBA?& zx&F!Au4G$2i0Nj=3b#bot$k13?mP)G_MxoP;ZQBSuILB^J?U~Fm~YbBf7J;uA4F<#`rx^Z$RWRmo#cs78}={9fud#cF)cUcn4GKo676kl-< zGqYRa6|6_-a#&$GRJCI(|%k$JNt35og5Q}q0(rSOu9<@@OJf@#0S*Osx9hW=lEqf6YCTHeR!s8 zIuq-{ra}?lGru?AHT}%Cm7Pe2u4B_;*v8+SGxAzRpIXHzoKJHll+;Qql-Kd~Oc>Y? zy>n@03#@a6(!)=;Ie(`yL)Gb4;r5x1Ll+j?glBsdIO0A(;^MZc&7wZzXo=kVqNZcA zgIizgm9qX8riCn`3wyTKmusQ4qF33;$Ps`C_OAaXJ4?0V*I+;2>)*%`tSeTbKapGV zD<6NfjsxmA#(tu}-0*F@ik-^0@y;GeOwG*C+})2)TN_xlZ2UiEBbgCNbVWDkzW!$F z5d7k`tY^HRsg+ocH+lrIJ)hHK{q;tVkAJ7JANRl1@yKUBYF<J1}iz7H|TnR1I5AK0AQ5`LCX zv95UW$pSZZvOpVA<2y*&kDrXddqeehzNK^o-liUs`P)F7Y`3XSlw4nprke`Vr7|_D zIw!%mG_B%q;XZn2@$Gaxyq86X8Kmq~4@KK-fL zk?Wj$Uv_BTUiMy?2ESRr8I>Z88Yo^U@{o?Q<=R2n_Kc;Tw9f8WP5VGr!=?fd_g699 zc9>7LQ;-R}PrW@pb@U{j_RPilbTZ4JP-CDC!3Uy2xM=7f;>1p7#+LBpX|=kJ_D6a} zpBH<()x4z^lzAwo34$RZ4}lZgS2T9iiPr~VCU;36GFdfD+eMh+K?FxcX#K2I39Egq z)g$YDRFx(JHPuz%Yjy+kZ%2W@d8l(f)osi@MfVXsJkv+n`d89n#cqUpJo!NkL$!;D z3dNaj@yK!(?CHD_i+?Y%uN4Y8Gsi2_lh~`{9jVwb;?Zey?Yh?<7o*;jwY4gGexHuV zsJACZg{ejz`%bv5ey`)p;>-sDM)nB7jeie!u$d%fUAVnsoQ+ z^W+AeD7%3>J@8S8Fb{Jzg7|iQoy*WNER(|O8L3NhDS8%j% zw@%CYmeO%`Yv0Ctn`dq0XpZ;pt+x9u8Nv)a&X)!$- zbZAgd&!1&98sDx3aV-d47W;vzM=L}=lm1<|hnC4~6|3JIfs3q!teV}-=ZMN80eEk( ztb1Ox_`GOdh-NmC$F`2>Wk&S(ftyCtMlTVW8|t`GOg{5nUHjxr{-T+ydX$?J_1+ss zz4^Uw9`$7*|D?IMIOJUCODDNqm&Wq$hH6q&;9rKC z`iG$Ru4bmJ>k4Gr!m(@e2mc!Ub?}$Zt{}+ovwIOx%JhvcPV0^`D`u~jSkN3~8KNVq z=nKG-9|)7j9lasmy}2By%JMq)PNkxiRKHWtHe> zipcLqayj#lwWAY?D`X>dyfJ_9~p{NT@-o*YLje zK7H#y=-asxa}y_1o~a_#zOBoH+SUrMO4cXJe(U>xdUZK~IVPJio9(S^grP9Kr3-^w z!+CJ|eLZX>ztVr$rS$w@HNMxd zNPn{TWA*FDB2u!?@j{l4DLpm^GVZRhxF)@){tfQw*-U$2BOUQeeG=<^<)yiL@m*d|%g_-T)%<}vi zMQUs6-)$YGzYUR9f6RIV54*uPUWRzS{z%IwQqNklyEe|Xh&Z%uYHVwx17>ZwEhf%! zb<1YVCXDQpU=NndvfU4rG+2>b%SM!jFSY9iB{06ra>}aSj5-J=`VajaHM4hbOs|yf z9{)+t<`o|4e}48uZtTpmT@zHp>DfBh5zRXoM%TiGx9XfN@AbYcRGB4xS?vrpH*4Jv z8)iLg^{kbcXIhK7C;MYp^S*dtoBqS*u2*8dy6>rbS&RMd4wVM?v+bkr|MWiA5_>rc zjioq6Ut7}UKe=M|B6#0eFROcTJTbX7GtoSC`=ri|0-uHu(&S4bJN^c*%6fBNb>k3uAOK4j#l#TzbT)OTq+*lG+V?8tGgw58f4uK-Je^+S1x-HdPR!U3umZP-1qgX%Jf;qq8{6-1CF-xqX6e!siro`s_}f)CwVkEwp`YYXx7B9ZYRs#9UfUP;= z2xU7uA;%H@7}T53L&fCxCF$pzhQ9ze_%Y{PUxhjCz9~87h^Il;cHmsM3mA(oZ}wFB zTvM%0_Fn0R_iNd#54uX%r00DmB?(^bO#j;a+cO=N-w*U3^>C~kJymPMKzu#(gH%R8 z=$?1F4{vH+*jDeRn&E2Remcq6Ge<_B?ge|UPa6#o^`ifyPy9rhAmY_{dspS?u3~Va z@e+RDC*;9|SZTURbs8_HfyEe9;b?Sp6>Ojny&CTZA0^M{A z6j9XWvuwUWzJ|K4*@CZl9paLCYPRe(J-6?d+ebe%4h5!5C{csfaZsu1=81#qRU8ZR z!~!0KNY*{b?bgust4W{{_*w|MQ=oE6wVY(%ZKb%)26-OhTI=8+*A2!@lF7&9QE!yx zo$07oLi^;*o<276Z@SbjhR;0IEgu6bNp9Ze##68BcB_xwnqL){x*4o>e*BZ7D*a|% zb$k@+SGU_@5@W@g0c@L(eQ8~{cd?9degN}8cZAJc58QREib0%g*POBJRwplGm8A!ldCU-DRy(LZv=;u>GSy%MO^i5OeSrvF)cu#$Co$<_% z<=V&nvLK#o$ATW=^^5RgM^2YQFWy&=x6F=_Wtj3kKVNOf=v}t0(yzGgfNaNdo@Mli zHb;zZ#C_E?=r>}<%=-|Do#-~aqh*eVvLYv8t_ri2y72TMsG;r__{G!;u{DG0EdO5z zUEPMND$LA0*LhIUog9lR*LDrEjpG->YNM z6~V3uo+s;JnomcnPtJ)9#Wb_V$UJRQAxfsG&U_^^Ud-9eT{k=;3Peoh->M?04^vhevhvzQas z-`bhR>uy1en1d(ZQ*sfqKAU|@cGTS1wTxNobau&hFXm6-oQxyXfmfe=womVZ^B6z7 zWEoMF-#z_I9KxagBSNcmT-9$+KUKM5RZ=e!V>j#BxT{K4u6J~;;Z3a<%#T&MA1d^- z(5BU=%H_vX?L9TFM4N6pbw4ZBWrOa>`oRA)vn$sMP47@OQosIDq`&H?5M0r`#gWbhY zxT@o3MrrH`WaH&4^`a8_x4(O;jM&QNKARn(%6qd>I6f7-;Jw*Z6!1zjW2X1HUN>!D zi|%v#`P}L8XgeIdI_fdtEUKf6jsZ7AKDS%C>%7_o#h5>MU_$m7o4f z?E3fVIDwm3mfan*#fj;~@|mCdG+D>V^3GbBB~G@(#Cx|VH*-t&>^p)+Mb-}j!{&+v zS0v0rk+5jJR_vn8pZ1wwCq7oZAA6Xn3%^#xai-hyqjH}m@JI~d`_KzJ`h&g@fycycW_ji#=uzN2_m!>LWU*$gjea*2aL3v6%HmXu_`LNY#{NrP z20pK(WM0XrZ~oO_)IHspKvPeIm8$}9Oe}BI%{(}&!|cE0s(hs_P4F%BG^RC<6bW!X z&F95urH_mJBpdR`+t>(`ix2`kd5}RvTp^v`XlC2|PrylXTYW=3F))$Y&d)_~xtKGXDH)O}g zcRQjd!{Qz4^Gf}yRd~>|rMGUV4#Tz?(9Ng^*HS-Pe+9h$gF+UQ1a2Ha6#nWvdL#a$X`hYV){Mkz)0+ zj`8ltdpx!r@z~F@53m~4@`#_wAK`wfKV1dosQsO0`l%(g%EOVKb*_#KtWBE_j@!E| zg4-xb&q6rVrVZ~oYS25ZSq@rz(9_w_fLn={2o zY^RI&@9KW^`ET?{^!r%N$NKAy9v}a1T2(gNaa{Q3I*;5uTKde$$Iy#i#xd7lqs#I> zRJ?eh|L_P`Ve?)*zm4EGuCf&*m-=*KkDt$+_*^q5x^T0l+JxA55EaQ?w|8L-A5DHf zt4c5&1eIRu)Aby@s?DZ(-2aw8CtJH7{3D}A{LN71i8_rbCrp)Ge?=Fmwga=Mm#2@o1uLTc}%!W zJSN+`t-~olgUO8vU6D9iJ9Jy-gm-!39c9fn|8urG2M<&)sebQ9Mw~yKU%N~B z*KR%o9phPe<@3;Els<#=sU~daYr4`SewnbtYs2XXX&#-v(~4Q9#_n0@Rmc!uhf3P# zR3MtdYg3iuQp;4=VLuM~0_)(g%8Jby%tuyxvS4*gXDs?K7PHGBcclC?RZ4zU)noEl zRh)i;D3w8uR_}9N#@MO7xePy3(s>&#Qk*+?N46<<(gl4eC&BCb#2hA(EK`rrERjL& z{k~69>aYo`7bWLrTh-&3k$fx_LmFR3^`yno%-YJe8L9fmHE?9+zR!kF0j2L^_c~Pw zAJ02fkDGiYlyD8{mEbzKJ`p#0IC0vlL~9nKgLK>0a;h^&A5I06IErd!Wm&1L=f`5> zw$5#YnP-cce!||d@yfQf@J_q-(0Jb2=PD>e6+OF-s>OSon{2D@hfZ)um7{8WK4iT7 zxiV#AE1Q3JdqUfhwkeF|<`|>q4E!w5^rt+oSt%zec`d<7}9J zL`6^4D~j63`ckMSoa?NJ6j94r*1`Q3A=|i6w&5&WpB!O+xV;ywYrYaKts8g+%`0fu zOa3`3X!E@$^7+K{ikQBV)@`S;?z_sp50z7&seTh}?B$?j&g6^XtRf~4R7Xo=B)87X zWS!|$Aok72Voty5#$a@3E8qV(HZo3*@IF-L;yeu*>^!&8VGXM3CC#1UUH7C{^G3+C zVBy}&VjO>}?rsTJhOB(QpGKbDHp&&~e+U!yjS=~_HJsz`T}FlHeDFtSOzA%AJj=GL zPyIk%j*J5@w-NLJ`4jJ=T}wS>`<3h0So)gjRr0^WMmTb`ct-UZdRD=)YZ&I7vvvR5 z$N$a`rDR7X+-4gqoLha0=SHv*UHLxRm2#|JCbJ-{CTGWq*|%llToY9AsC`z`Asli2 zCW_7vaZJdWJ>pUu<#w@eKbC##-M)Ppy?03+he{5)Mt)^@l+FPg7`GY3{Rs65IlfQf zHgfM}XvFiDDEp1&j(F?xy74~m&|f{>a&9%6ZMEPgUx(nhxv6tsOYDtJc)eS|v^j1Z zH=DyL>~3%7F(v#aN88&W+ID;6xJjp-j_(9~E(Rw~9i_{@>I|&&k+G*9U0#0WC}l3| z$4fU!?{z4DbGJt4YfaKuOwX&DkKT^&bI-yV);a70!-SC1d70e_6%uRKM9CI4UR)rKfnWzhQDGsb>Bu zpzK#KZrZKbf!w@(ls#jbJBqEHqD?=RCAmc#$0V(uCJT#(4%jA3 zzZ(21A9bR?uR1Lmnbuc9@0XizwR3CV=6rLx?lLT4gSKUb97|6_G&q0l?<%QHES@Tj zw3tdz!V9E~U>egca?Vub3!JH3w#lPay#ILc-^#b%t0R$2l00oZzaF0ngS4+~^0l6I z(dkp~7b3PqO-$x_HKs!&tpbpnu6N90Z+mdq@n3ahItXA>U`*&JqK?2kn0#(N_JOu{ zhWbpkh_h*P)@D{vo-L3k;HmFsdur!DZsr7r=_@zv)ciwM<9OHsUU4Mux7(K18Ipbs zNmb1r@1=i`Z)O(RJE0Puw0d4W7K~MJwi$dSYnVToVe%FpQ#e};XbkQ}s7|blzqR=Y zR|OvRGO20QJA}Me-KSPN{UKx}%zfV%<6ySWGPm@R6}xA1S7(9F zC-Uc4gMX+}@lDpu`^VwTVR)D*iFPi|rDtY6QwL#y_?JD*R5FMyChi@1Rq>o`D{d=)J?=&yZ@Nuc{m)~p-Fq)1E?Oz95 zT++!`P0(ZV{qb-{{-uuj+YrCM>J?z1h;)q!=*JNL(K-%W+c@feq8RmAF8!jw3P+2@ z8x^{exz;{s@{z2)fd_o~EW@lAb=QZ=#C+GV#9k z3QAK&?-i9k6_r^}+KoM07K26~OgB9iF~2i#)C3}nH{+{x%^u3vyV$X?6!k3SAHxVb zzDoNM#JcE@4u`csj|Ax;BT~v$(=G~k%v`%$pp`M)j{fF1)UiUwvm0^=dYGtSTnZ1b zg(GT1`S^=A&R#Q(Z|j!MEn6SU_G5^m$q(tnC!*%}^iz)3iCI)|&tAQ2T0&=^S10cv zmNRRYAI+sXI9?7`1jY#dgIXyWFP+zBp~i11$+vsy5x*1*^HHzJ)w$N8cTKNXwvAZ7 zeB4yxma&gz{2W`;DSvKi#BAErctG z42!ur{A_2YB|Br%S4^)MpT$H~>T}d{`dUa+LOTlUJdS5C{j!(7D6~z%jzUM_EHn?J zI^~{=c{R?BI1(>S-S7O^LD)YhBO0cQLlrKj~w6~L&ND8rzmiAieWG*t1geU0svVkIwAk_6tMt_oANPlPq5NGxK1qCeCy6gc>tl0q zHVbTuYZ-4=-nJ;5*?#SO+mwg1J^8aglIdVpk%DXbbK(?gSIsiVXmQg77K5}0L6vsD zKsB3(G*d8E8ttZTqN&+Vkr?}546Swj?f(`73&VCD`oWmX!aibH%?mM|?ONqGJ+zXS zt_N537ps83pU2(?n5sh^*`^i#GoxBg6=4yI8@4LBqUp{WO zLVWMInf>)UE~2xmcDXcRKg&DN?;FpX86oWAxR3>k_o2_hM_tG=J=6Vk3CH`QCAt%Q zpp8T&4QW`Vmu=XGEXtN~haA6{D4|s`O2WvY3&N#>%5D@9bUH&R&~iSu$lKC*p^_ zGJY&Z|8xSpk@D|X{j7E@yq9&RAB{<{^sQN@V2|~wV%7Q@ogJH{jrZ8&)HN%w4uV!3`F5L6v!=`)c8Hj4 zSM`}a{bcVibMfgUCmP`Q1O10uh4(?P`dadOJmZ~?z;T$NPVQt16pl(2)0CUe%FL3L zX<9t%MIX)e;gzkcE`MSgyd1j_?bwg?9rG>2_|0!}LG>z*mp*v;In&%&d@jTdzL)~&B4j7hrPnHSfVVSOEu{b9D za{MZ^| z^Ty5A=A4mV4a;;jl=PZbNUvio_CB|5>G#44v#+^cz<-)0Rnyce>^>6;>5n)O@@9J_ zIO>)Ib@u{uh|WFN278Q1jNWfzS*%Q~jvniSy5Z^H!Ta-D-O^a55oZ#WC<{jIO|W{a zdC554zOG?6J7xYG&xo#Nl1`z-cBN;~#(LbRfc4CO^)Wk@ z1h)%jPdM^!SF|@Tnp*u4DeuG_rZWb;N(6i9j5G=sqQMJ)~N2n@ve$Q*-AxMWwHb27dqy<|6LL}Il0 zrFv`lLOPPzxs}U4PiAW(r{dEvn2dB0<}cCP9lxd3;hyJfA0H?S{z^~3MOoJxGv!eQpvI~m*;N~XZH|wy=bY+H&|%RR zY{%p8hdSD6&|jg*Lbql2vGSpa* z(wrw^b5p*$+@kWju zZX`F_e%WzMJ?PeK9#f5HZ_R8vLO#EehqTmVnnu)Eh4o=&X1q1b&nntyQ;!T_IGD9c zJQ2^}OV2SB@vzNpy4f}3*uBT$6}oG4@p z9|}WhEN;pKZl^OHReL)+jM%y>T#=XXZ?4tz=`J^Sy33}JP?`%&)&W=#(XOl;ye_;5 zlZPrVMc43U$GqJ9>@+eZb}s4FP-jQnllAjtvt`{Z8z`&Cdi9`;jbF9QvpMS`)}xxY z+k63L33Si9y(^`s%~sBz9hr7-H@o^{&sp^tpJm{)4Cb{M%uA+7?;^j(l7k!arnY@oOMA`m5N0jg1YkK79shcyz znUG@|xp+^Pr6LM6)-9hMc3X8bs}GU+iWYd3iakE=2idY?p^TXD@>8#m?ZE<7xxUXc z*ix-e{DzFNtg})UgDl(5(AjuF+aTm#(7j-^LGeoHXR9Kf@^e+URX5*O<<*TM0=vE7 zw$vPCfcbhON0uWC9=_^p9fd6GrFLX_@4i*SD#T3Z4R=(1a+~E-A<|yi=;fwGmd(6z zo8>ku+N@DLR`d2r6(>6N%x>jRZmp_GbcOo#Y$k5|^lVtHMQ@F2qCK*?&D(RYg2hhF zUc`Lt4QZ_C$!5zlz0vi%a+zMDh`JKjr+4P| zcg6^8)j8ii)y$cT@JiP;)zA;}JZDmAkGr+Ia`koSg3hlqw0o$!@QAvd@5FncSFhSW z>;3Vz6Q#bFDQY~}CI!crkH7k^pFQaS-U#{g-1HM)!*!Q^beBKr+aX(F5)GXJ?B-^I z1FD}R>1VI?@8z&>Z@XF3Jb`nly} zP_naqjQ85LGsSV%2WO)qvhhB#+kbX@%B_$g=UXcGl%-Mi>P2VcI#>RwsBF}ZlbvAM z*h`!n^-r#B@#(eaH86pO>0RuQs89Fme!TZ9{A=*n!C&N&KJWC-@m*2lumzK6OmTir zIT>AXdrrg>xcV*N?O2{|eekRB#XL9=xGB6jj+O;S-KwF;2bt~+KWO|A-!HM6d9MRm zu*jxOdIT7%HXUvV9q;s9qCC3ynB*7ZIwrMJBgEZz>4h@DBm1=jy)zNbnUk(!`{7Nbe7+D=SqO4{=t<1F|Rlh`)lmO zB4(eI?pf?}Wt8;%r&mTAW5islY^OFhzRmF1EOsh@%v-nVg}!6^_rY@H-;1oKG5LgQ zTFE4w9Oj1^Uq1OHYVKAoQe7+ptrNCn4yPmV=GRHOSst`2wj<=dxMOsK&0D&1qkFP% z*tq=K$!xuFHH~l)$~~_J_o)WQ_$o%B@$cEO+u(IwC^{Ch9uQ$NEm$KMTg%oJfkKd|knwj>YVr6QPWabQ{tJ z##eFFe16n0rIp@?{;2s)-|vO&i`kfYBB%aJj-Ec~StJj^bQ|ld$&a4Af_8f)w#y_vPvYKG%WvCH*xN%SXRO_KV&Q(#U%W3kzje)ZM=6lr zmhYKIy@DOtj^lGGN-M>qx+0r()^_F9vf-0}gF}7GQ5Vg&CFWJ+&k6Fp`u612>ds4j2HJhZYYj$K&u&Z67ZS(JmeX)tNp zPG__ip(N*e9+iVwEVNwP0bT?SE3#vcgKgyeQJvsjnHU!9WHx=pqWJ2OFXRc|$zC1~ zRVmGSe`LB*rIc_o^-AxaK2;|6)T_Mt-nL!UjYssVT%W4ks0@KfYH|ne_OQ;zY?R!r z^QG{0Aq+IRUdsUSzVsfpj-;I^=UilqtY0l zM2iw*zvJW;sclrf9*)Y-flAv5yzTvyvi?tX1^GN~vVz#bF|ExrblL3AT&w5#!R=!~ z=*7cBP+4TI9sj-!T@GEhr#`4++wKP)OG!spo(dSh`bRRs2Y>Hc;EN&8xm>Y*WYuPe zr|p7?n^i=19p*H)J5VA~Ib-9difxJyGi|Q>Nyl23pPVJu%xf~k z-y?pvYt!1b7ph=V(=iS$&GI>NdfziWhTf9Mq1n6;$D#XIDvNC#+6@2cxixlpS#7+e z8tRj+Z>mP9%$L?}Sc!eRA5gdLe%AAcPW!ef96ksf98sUgdmit#{p{j!XxmRb@9-SA zE8gp#Mfe}e8m@*4$WwWewCb69WAv1dlwBMJZ5fk@V4BlM#JuCaxE4CHO7@(%O5`@F zM7ohUUllnVAUg8?3f{-UyUl8vorbqMrdQ}^S)m`N3a^yk*tGBUonqB&TkGp!)#7}@ zXwj@IrmVx13hsGp6DPV2c9GLB8oRaX+v%+L{#zjx6$i1y+E8HCCc6O4BAIp z*DJEIv+UK^r0$~k=ui=`<9L~I%xtK;1!@69@o40sfHI9bx;m78w(po~%!SlYX*2=a z+8U~SO;psJ+c~9?M|}>bBXD^UX!8=c3c9E#BQT;fB5{0wt8ZvrmJJcJQ+J~3q`q4+ zec$=#o60}Ws;;r4x(40QTjKX}nLS6<%|_J^ig$ii)wWc@eY=2fB`I9w8kmL~`_OA7@YLx6HbF-nwU`J@=B% zE;`#0COkT$2NMRJxjP?(`XhM;n^N#Zn7=*SV`mqgu_e}{Ge_0vE}GfbwjL-pv)b0( z?3|#@vTjK4{ZZFH6*MB7_lg@~dtdA4S(y01KIp&ewl6eQ@LaqaJ*r3g`&#!iMS?k* z&lK6M>Gm`Ii;pC#`WSvc7_x9oETr>xEqOhj@lHqJIB)eEuWQU2N5w8N0rAp#Tzx*T zgT-bxGEvCi6upk0!ud*3O!tf#@`8HZVbmj2UbD&zEVe4?hIZa8_dDbI#21@KuIo4K z8(6lk=!G27ee@T=*Dk*U)YPEgnjG- z87M#7k1DCDrmvWuS2ahyef-?BaOR_rAKulsN^gYuT@Xr+bzRddabNYg^DqMrn^;HF zPr*A}>e<*(J7)CDY$~*QnWfw1V$G_Ji;bZ=!1qqasYQH7tK^?6OpRC5Rgde7J_Wp_NhhQ0 zoo=R0E05!>8tZYK$8ocW)_W31GrZ#~ z?#o!8T@-ejWKxfq!@%0qtD zPc#a23vS9{QY($Uu=U4!_u#( zvv&4|-P0hlz1cU`Ve6f$R=3Z`mZ{F${L4Qkc5Z(ov|GoucTWG%tKzV{$eU~f-P^8G zU4KzXyFXMI=g%s38^>g#e3kC1vAxTSytdDCZTn5t9WM%nHczo6#v_-ot_3!%qSEWa zW#w)0%qXGXOPM;k|AIZ+)-}P;OQ{G=4S1rzP*&4Dai$&(`Z(yEKq=@um-=?JEe>TU zH|e;}Wlu^`_FSmI7F-Dz@LP_wZ?~@XHk7Et^U(H=G|lMoX1t{ z{W#?~`y`$AL?12sLW^Kt%6eXED-YK4X_#C?25J>6Zli0A{v{^SH1ChK|NEhqaYs7O zX+3jVOB+|w@TszNJKrXis7+g$H;(B;a~w1OxXT9nbYv{zG}m1-9-T$RdN1s@EzvZj zo!#|_IPL$Ais-bPEVtJ?zv7&}VtQWQaZYA)5&ZIE6%bW7?>xJHQCXvaDB+TRR1ESq z%-BQ4^jM#cZ!uUdCUQ~OVNbkc2Om93ci?K%sIO}(m6<(7j$Ohewxc1h4tsUjI&Rwx zcs-^XheMkt>J#`Dq3j%IEpM~>ep75Wd2h+QW4DL5hkI$;xAA#F`|)}9@UFZv6I|Rc z`y@W1+IoEs%>5~Tn%S^SgC+8v7Y@-mFtNb>vis#W4$EtL%v&j`DNokhzYsTcrJ9WO z#W3;UNBxds?;jmqM{D9NZL3{5qM;KhA?M zjuT3qF=mQu%5Hm=xo?%Z?;Pj)#AeXGANnP&Hl13NSZlr`#&|mJ@3){AI+eX-qWtVO z;MR}p_O6e;>(VQX+D=6d+TOy6hb!4rWmwABPNy}h?lbT`RlXG_)hU$W_h(_ceA`;7 zMRXJ|vZs92n8#>^$#m!mVvm{aM8;#XGqCISE^p0_88{u^Jn5YRPlOt}%*Z$oq&T$r z3q4K!c2o~=Kj*rg-9q-b82?!pK*_9_Jss&s6Z z(|3AooJO&y=dWvPCb@TdTYk1|^A*~!U`O`J3H|bqCW87Qi_F66!ujfd#};<&CU>mQ z4qL_n=FhltY~6Hh&4=B)7pz#m4NG%@dJLCpGhGdOq*!G7x$di$3(QW@$Ifte#>VK1 zTp~twQIVBjahqHtNqb3Rm4hqJ=d!Uu&vDp=LuwPGDB32EFqqZcpz4=pF zJn9+8vN}}KtH0`gHtyzt#q-@9u72rKzqHYnVrX)&`%7Vv9{E%GU^Fyu#cM?GyD8L_ z=o36*boO|3-+?h~F;;G(^jWBHFj*>caXj(|v3!TREq!!Er|suO9hlo){6eqsAu!gk zh~WNx;INHZj2v8i%(}LZGvVm9o`ZtMs)vWV~eH_xXdq{o{ZPx(YW2zX<_UcYY1r_%+{j1_3DGUS=52y5b>&bOSqrt)oowMrtftfnH~uIOb$*5VYYFow3_GG9dq z=T+Apdq43_?I#|^7q&O~*45Cks>kwMCqXrH5oQ@qQb&VDdO7bF_*KW^?djzlg~c|z zn6lNAx$FC(YO+-{7uaxjB1?EG1|n8t_-kWWonnVQ+mqmm9)@edYOqA}M3wL%uk{l~ z6HV5Ub_cB~zx?MXegsA*oq7H+D8Wwk8sx%jNnYBVdG2{?KP}e05N5i+ZQ(38o{NeF zN7%Ru+v-(OM^SvmCbq^-rZzIE?PaC+{u(IW7pTDr!~&6 zi;HoN&4oU zS^5c2SNBEj!VEsw3f6OR?*pD~>^F~0mwGUh`b*|Vj@k!-5588mjjxV&vTKi~Pn~w9 z7gJ~Eg=bS9=I=L|?DeC!rz(QZz|^4ELS1R1cfw@Ll1=Vz72PV%2Z=B__X~DyI}#m<^FyLl zs&ly=$D(6#K3F7DyjQ?7Iuad;^F!i;f<9nJq9bu0NW2$RIPl``ou7uj0?(c=LN;s) zg~eshhD18r^L4Xs72PV%$0}}mq!_rZMW~~=is9Z?rA9rf?l(UqdZg%6<+wtc>W)Ps zkzOmTV#&-8S8V@X3LVqfT36eVVk_JF=a%*Jinn)*ViR-Y z5z0)3w^Gs^sV}dN>@KX{3*Pf?0biXnp@C_tcvL11au!UdxYGad5~Uq}6baR%Xt2v*> zZP#*jH_a1WHp8uCo`R#xZC7sGbwBh5m&~OsMVH526<>DSJforOzI(*3;(E|DoS_ERR^z{cLV9o41!(*Xza}L98Fo`JjK9U2R9jzE-cFzCY||wS^FM zSGAd|{yzUpbFf`Y#MJ-X2_Db%sqgFaGz6!ArJr)d>HV++1`nOz3E?xSZsrUsu)>~s zkYm;XtMICEt#eDNaq50n^9r|J(c7|%Wf^H*1N57aeId(X3V;`~hN%(=OP2mU*;2+S zplxMP{gphP>le>ezLIb3-wpq1w{=;idtstP33KtCka4B|!0vU}olu|k#cq}ly3de( zrN7<tE-Ogj&)`kAwBR2DP*txa`$ny zAa^V`O-M%S%_zteoq%vH`A~smZ3~nUw@4*U+A$CapbZi zrv1&4o9!yjIp~alEeA7|J*;VN&AI(LK2J55jp4Ifr5@kZBDKHwJbV$G`!qoB-0kk% zwdwfed{ook1TM$6x4aGfK-cYcjv($jiX0~DEINnqgt;~?Cm*E4?C?{i+BeU&zt3g$ zkT6U1G0-14UdfETOCMcFnt9ASLKYpfn>{zqVMnQj)OQqZ2w7*tO7i+(Ty-U%$4rm- zrP$DFZ)RIJmcCOq5>xr16XZ-+=3(H%y!P@+Glk1)FLg9ck3FUipq_v^pPg;1x_&@R zrNyZ$Bl2iK4es**`&lTl?#uV|y5%O1Z` z-LGz`T*I|IjMlsvcc$@d$##`g2c2_YZO)xN^yoXO;G!@hF8dIo`y<6Kr#1Z$m0oIx zCwio*wql-mM^RLnQgE_$LJ4v8DT2C`W%^P11S*7obXcjiPZh|$aBgw4DawUt;i})h zl-|o@uw`NDt!`k-VVh(H8%9NldO~`8nps8c?Z|3jv$hL(*GEDyC`P03BIx!Gge@2o zW2cGT;USN+l?&0A#^*&fp=WyKnI7N!Y^>6Qpk~P5&gWLixBOrM%=*k%u}74J+qF?*_@8v9L}Wy6{A@q!+k%Mxks`hLis^a%qT3I3 zm8^9fKldzL(L9}^nJ!vpTOEar?o8R}xw5_#p+5&KL?mtpFM3bjG?&G1W5-n&w?TDL zDKLHu*Z+|eJ#?$uRJMqxJMxegm*v;IQyWsZZI&0-JFj3ds0+T<&ofzHEZdQKvDTDr zdWYG8u6Xq6F#cTk)9lmcN?*0gfpthmFPz%Fcv~G|P0wr_=}V>ok4A6mC*3pOPE7tR zChlSIzg_wv@Y!{H9ivTM5qrL|u_Y5?+d7LbKMwo*M>2bpZ0Jg{-g|YwiVRD$58KeaC3eNLkEgP|zAL`s z=kSg1f)Ak@394f}N`(X7g~xLHPx{+9y{<>Z%w$tJE_26xUk)ry+xvg34C-z0^@l?) z$g6MV)wjqEmRiF5is{&e>^zL`VQTMT>hED61Wl5ASnqlv=Vpj@p$xm zRx^+AuI9A=f9etA(1W}Dt*C~CkGq_Mzk#aG3xOR7g z>z0;9w^Vt`^jk}@Wij8rm|kMN^qz>Z9kI=*m-=nWsUH!B@+#Kjqoa-0ZfwtjKkAI`P?qM_DtV1vkmd3(aLQG9bQRI!uP!TY{t_5z&KlUR;Z=h z#-l&aJG%0YG@qRv-l&P~6mZFtvyG@rH(kB=cvbAI`KINaS~NRU(V26%Aj8N-)uf4j z-b+};KsO&}TOpIZS1|232WLJhBu-1m3mt{*sm_5dqaDl5N&l%#fqp`+lQdtAc?0uj zU`O&NXiuKNW-N)#Cr)S8t}BUXK_nf09hQdhHtYo2o&dk4@VS(~G=&5Pp;D z-ECHlv%A6e!{khPrw5QZA0<0UZS!$T2$hjA+&Vzzk3zLx( z)!`8xOkZHG3_FsJRlW3yM6r^xY%D@4dLD#)u4G^RWb{}*m&bErgJRV?qRlu_w@9mL zkzmW2Q0p^3ywY7>=`OQh^o24pv}9-fWcy{7YZ8}EHNYZVBE2hFG1Ox28E=MX1X)yR zW;-?1<0^RNs_SA^*z?k@UGyN~1Klnyx^FCY>#Pp4D$Qz~vQgKlz6`aP6S1Al5IR-| z6Q1Vk(@c(7nK4gTGPixQCyWufE2H63;*_UVv|o8$Z+7+2_jVmn7O$qXJMRBy?_HbQ zIFfB`e%=xLKj53`h#8&{McpPQ?4V`Y)*Rc?v1I$aXS8F25~+)a6uC*t9`0ZNuBQ^E zszNt_ss=~_WQIZ#2{h47AUiKBSFViq7IBB#DNFLDb6GK}LS<*sH4Pjwjfng_&h&S( zP3B9^^#A#U9mNe6R)0Ek+O4W~+PB5;u|J%d-+Fw*J>T#0`^?+;9A_NGuCu)L8pJw~e9rJa|>a(o2Uiv+Ct8ANfy)#}7no4OzJ z^LjLYzD1S1d*73IU8jiBL|RhjEV&z#`MP5ejzLWGv~bo{D0(mf;7LAV!~S~Cm6zPn*qruy>Dg6e2J~Nmxgh1p!{Jg>;U49 zNnZMXm}h92PM=@tJeP&SQ*nN9o-M2&#`j3Om`?ObvPUOscIQ4OXAV)}bdS%E*wPdf z8}&ZOqa9`zxHFz{uV;+(WwcMU^OVlp>0Hg)pY=QK>l(NxMuE}%K|eK8cKuWqJJRFF z`q!rP>B8`}aj#4__r1LDXd|7EpLnZRU|to!%;c)6;PR?yCXvCPxyr5HpO>-{I#-8! zhw5}|x;8aCckLcuV}mxAQ;+scy9>7T+og@QQJX058ZTd?J3nK7T}eN@d%x6Pg){4h z*zAw8^mBOxc$77Mlg*IicmL{Tu9H>56#$W}<^*FqD(~$2~%q5p?Z4ZLA z(e-s}dlGUAyFZzK^4W=q^ISDAJ)SpJF6`p?R8#&w(Z3Fi&^#N;v%s<&V^vB1ym|Re z;W>8{cUx3V9l>-2v!%MpdxeWzD_LU8re;TShVJrNw;XYqc82x|Sa*G2$L-ARtlabm zN@E@Gh%8RqQe@NHu_p2D&CY4=<1{C>{H!S2YIV$XlL5B$^&EKt^%}Mz@480ScDuXf zb|*yCwE+$S5?S`M%ek~!{w`&G?5%$v@Mt&#V9jsFJMPc)4DWMa{cE_htL3{w1$g+U zvcfnw;<=yaexJ???}sV4+sX*NE8<;|S-udp5@Vv|yOEyj(KqTJ+5d3@0OePBBPSnO zvuNzFOKZ7G7tYA)&!oKKi0XJ|buE?dd{obLdmhU25B29P@ByD~{I~2KPV0dfSNywI z#axB4Lf+c4^DXWow=2yvT;Bk<_y)LCUCd`>wP1a>G&5jZy6O>TM_n9s$?xyTMs2e@ z+YZ;F?e2DWGwp8C9Pj>^^L(eenwTGLJ;(DLZ%+*CX=vW|cy~oh=hpq(&Gc`xQ03Nc z#&LR*`NfdpSl-^7G4&sHVz&OS3qR zsX3-LiK#u46({!5BW((>+Rgf+`FD@yW!@{=+P;dTjh}Q!&_Re1mFZXN0!)Mih2{qy?_lF^^71yH z!@c)<oU2Uw! zUdP4lD(a1c2iC^nyd&IiA6ubPj@9wwLIsyc-|MgSOX@uowRe2Q&*cFvlO>PsqD6VW zLI1;YJybJ6Yw(Gl@3pEvE^cc(p$F?3-#gi07fb(AR{2JrmS^p*a2vgP8#UF@78^C6 z6j8zM=ZY^pRmE#;fig#{(FZ5nV;+e*x%}yR-|5-iW$Fbk?iu6e(fSzNjd^{RXEyh% z?B`T8PlUCI3q3q0MeUNwF z+%J6^zr;>kIvVv6aJ~(d8J8n%Lq1uuigjXbF2kF_Be>hp#eJ^q{8WhRcf!UFLl@*! z7}=I)tIxEJ9@OELbmZwY#UnRAdNi*0wa!L*3^p*xTP@;N?=0iRI88I8-kGi|mZv0+qnFvVV`9tAXI|>NA03XDk3b zE!EjYai{ZKIu0(Lb*^)7uq8e>Kbvpyxi{_^EHf{&n7XT&0EYl;!mlNN^-kZPh3}2U z1CP(F&TVj2D}ZEMvsEL~arHJx=ZZ@1#)9rM6C+l}bpIKGF>}RjDy*-evwe{rd zP}|3fuD@pp8rfe&Wy#rVrn(~H?}+Sy_P>!E(*s`quAtf}!E_wkV$X~GE_yJ~4=RJZ z4Jb$->Yw%?&bJody9lF&yu0M`c?ADos)1mZq$?_WP?3l1b32R9RZM1PF=LBNbzYwxc%WX#%Gb_5 za@fmH(yWv2r_JuvPfmbsycu(dK-%65MLU*P-PE}(R-&g(?w@~Ok9s`TYmsFhDRQ8c zn9kv-*$~uhxfa7j;Vpf-w;NDex0v-p@|SNh_?Q-@Ew`APZ86NAxW%+gT+G4=RxzVq zwvUPIntH_Deay}FF{W?ZGS}f2bF(dmo%0@*JSx>z*Tf{aRV{rH_c1ry$JlO9x0pj= zNqZZAR_|bTmuvR3*FW=x0c?80_3G*FV{WpKxfd8AM5SBREI7BA^|F}M^PJ5qO2^IW zjiT`NC*i*JJp%8I!X@;*zt-mMMP+M?Y^DV1gW&oYdr(#5Pl?v_gXS(MO z^asufJ;<`-`6OsDlU16oOR31ZBdcp+O1dJFDL-|5AYW*ivC0`t z>DBtL=UZJDdR#V}WA^H5AMI)%!|coUMz<)RyM2)dEy@~Ox9%_uFuWJKd;bpkUjBV~ zXB(64LGWA;8ZeE=V|rGC9IuH&$fQn(E1M6ipWAJRNhzB=u1Cb&dafrrKWRONWF3wD5q_9Q z$RSQujglw-5x)M{M{i=DD&|zE`_VJ5*V@f_)upGi2~gBVzo^m(dL-Xs(HL%38Y{AupYW{ND!1fi?q<0D+2AeZ zfpkUTk=80bctpRR5q-H#)B8fXTDNzV-P1>khNmHCxXhWEbQVX@h9GFmwwkE+T)&CS zt>&h4d+w`hU=E@MFLSF|KdYI{)XVS7%sEaKo5GOiH_O)*xCzqy)qfg7QE9&@G{L~l)(?8pYKJCgDTuG06x{qnK zZcz|zP%vv#Avu>Hn}$B(<0g+TecG=2j%ZJqT0dSfq4|a@IaACxsa%$>)ue4+o+aN8 z2xS?gc^PLy-y5=!%yMo%)uz#=C(pu(CYGZiRT%M&cAGwM2H+_#I zG4gcW#U}3eMSqKS>!DOSO!tbp+{KW!U)8xjRkjhC=3SoSved82GdY_7>Ct?+X0Wb@ z<yXZCO zYUTCGLY8GyY$Jeid%v3ba7V?TY_e(FwO6YeyyxLa+?u`+N8Lnl@de}I#5 zsO#Gc%GY#B<1Uo)nIDv~p9R#DJL>PcuU>xa9uV(ZQHNP<`>U)E;`G4r_%pJdXUqfq zq2Cz9)}{qUMP^`CgXjIjvaRJCzRF>81>FChD7WVs# z{`VcS;Onb~Uc@Q@PfNZq3l~c@14s8EVm4b;kJr-wCR;hxdH=19g}epE1+@pPrF2Ft ziHTo&1lF@mKikK$BzDFl>{Z?iRY9!V+%4nh~7770x_9< zmQ4UNGn{WpW9pinMw3bjUSABUFP6#vh*JsM&3e~#t&a5fjcf%w!_U1Nt74qWg0UmI zT8DErHzIq;SikA#Hpdp|9Nu=kzs0**7J!md^Z|To$pcOEdG|sOpk=PSoN+4o5hV|! zUXQH1b*y|{_c23!%u_`sROHal`Jk_{2&@ooGVb^sBjdh>p`Z4ar#?~pzSsGg77T>* z5aVp}VN;5CV0X+1bTh7zkO0HH;BH{${8ncnCK4xk4U3q3^|=%}>TNIb9qpR)yuh{a z7Dr*0XM<>j4&N8^NcLlM-^=q+={4OyeOmtn9+Cd zY=ev#zj3>P4>mt`#T?h-j-v!*4XfKbTuubq7VFfMN9uL>=Ub9zK{unfvm6`5ml5ff z+ueaHaWU2ei@EePp9bcH_AJ_(<*}Y`|JTNUZv2N3xlgOizAQ_#J=4ooHZQ$hx5|sC zr`2%eO*M1oUcY^zWtg?bPeUXDUt$Bk<(9?5uk=OG%s|H$0h9_w4w ztGLe3yex-z6@u%9S9$iY}@T^6!4syGouy2QBF*M>~PFOvYY6=MN{}wujhR%8s1*t#k~NX-rvwUx8g=&miQ- z>g#=}Gou)79{603aX--I!#^hF=avbznr$E5Yy3Q1i78S4Honr4u4GTwe5PwW`}jNa z^<*Cs#cU?=?2bg&+IrCZMkBrJZ}mDnyPs_{DL)Ih`Kz^g_Sm@1TeXb(y4$=(G&nJ< zjTYvfy~WSp87pPEp9djwo1Zq%WqHAg-l1c8h1I}}hT8nyfQau18L#D;?7ZQEU+#oZ37)L^Z((cGu3X1ExM(-rNIE+3ppYv=C8q%!En!WsyGQ@o0OU7sr6-fj>UUT4NGPYN(y4nJP%V1 z)>#5|&3~fAQ|q}9`73^|S|CmHcP&2uO{uYsam7>)9SqOZhGuGT;afUJEp~W!+_`i+ zyxQt+mbY9@1ZMd;9$lDnq9gYpu|EYv7LAG)PFdGC@qU*oZ&By}S3Ps8Zt8x}C1W}= z&L`2eB14Ve$4Rjk&d*uq{mW?$pHf_gh6dGYtAC95-n81I&Mr|1zAd|KL0anUa#t3I z-GTfVa$?zg-yCjBBquwe+J7A^{%9gIp&mbV z*BM63@GsF<*d4g~-ND5z4Gl7zBdEt&=Gz*c&pF(tz;LcgE$=d~9}cq&D~lEIGOf&b zJ)A9>pWnM*vvR8Si-qt+*mee2!uVM6yFN6-y7O%NuEl+y3;R1&&Gwzna2S}Uun{79 zkuY95XSU}kdZe;mIQ+yy~^Z=0`|F6rwerDJHstiqB86^RGKU1xN2s!g=dAJ+f3jCI%!FGd#My(cA`)6tM!v#T`pMI%Z)Yr=1 zUMXLUye)WxH%SS786N6hu&0);W{roUhvWE{<6rbEVh0@?vzQvem8|KezW2I~AUw2LYlVCS=z+MzH z;NWMbgwQ{qZk_LXTq4J;O8fj;cI(?xZ+7N(72c1|z`X`N1^0c|-S@R~)Y>Ah&AHb5 z$oZ9oW4FVYUh9UnUA{lOA3CKw4f~bmTW1~5qpRQNJ^0m`=SL3*MyX-c|66F%zN(53 zy)}jHDc^DIO}X<;$KIZ)3WdjPvrlhA&%J!aj-b*g^M9MYidud3(Xx)Uo#qH8=LYC$ z`^>=VsEI6&-rg4T-xU4pl|_~n)u?X`d56z`9`G2CbVQL=MBA2OYj?-E#!PH4w0n5ea z`#lj1v*^vrDBFL$d#?5NTz3@@$!iK&yOgPwr|AqG6mLC;a}{Md>@ol-so$x+{kN0k(St7uSu0}{+Zlq z85M@oF}}&uH+f!Getea8NIkbH*?xIP)^EnTiXB*6Qf)@H3w>3TwO;CL6bQY0J8Xt0 zF}dFaBmw_jdh5v}EZ=#p>hVo+Z1m0d0v=RvcPO&G(H~>AG9AbECVNYjn&kUN4i^Th8rudExXlVlSiKexh!lp_KXEQ0_Ev zTl#di#4du{OYN0KJTTgeD}1a6s=N%IWt`fquO(_b7}1(cs}!srJyZ6ao{!_&rkK(w zHM|Pd5+3WN;^DEr<7%@-l4k!FbkcnVesb zlk3P(f*FsO0Bhl1f2FV3g4c(r&@YYKrP#tZ?Po1_KMVe)e`1u47^suZ-oA2QGY)h= z{u(l@w>mq@#^Rr}6c<4$kpGKgqjE$1867`8~W3?761G z80o0@`uBtWWzQhjv9IrWXPH6FuW3u)8LQNOQ;t6Q=)t3xJ<+RxgW>gg<or*nNK5n^STuM3XB$6< z4@lU-XL^o1n%A*=psb%Jw{2~Ov$_4Pru|utjP_0~vpUBU9d9QF5dX;aE&o51 zXSREQx%QEKe~JVNNiDsFV-7WB=%8MW<=qwj+_G`cs}Zk8;Dpir`n&#p zsqVzId@xQR&enYZpSd^gSy|0yHCpV%PomRAG*oO(6x}`(2buf%O+dPzZTz<$k6jxu zIYaR1s=U`$F?4?6KEKg1_<_7j^;!5`e$%6H06q&n7j`w!X}SpKiDaqwL%L?mu)f;?soRl1TOLyEOkMg5>&IxD zoFnN@n%JBMIIQ((-+g3NeWNI9dVSW5d>?87IAF{Iks+U|f1dYHR@%`>gWv8usJHLV{@o4A!)%u;AXMGRk31MH=*E4Q? zm!({EGp*0!@G|YsG3@oku$j*VYu*dJ+!sa7m)EI=Uo-#vhpNKI`l*93ne#;7+00~q zbW~2dKjsnaG*r$oRN#rAVGF0^ohGH<=_@vb8d9C6j9k+$M;g-XRQXwW)jlLEzKT1e zMPoi$efjCeS+@DJbzMB?swVE-0*6^3Kb1O#^cTxVzLRH!n^#&y>=fGmm3q|Db(dXt zxeYNYt+CZUsex`c=-tk*f+7y|IAjp-0&DGTtZU*7{&iyTpNA|E)tZ-~qtWG75TD5u z(Mu(Vec$T^?}RN>OxV@-Zc-NYojmJd$U@OL+uHaw^g`Zl{Gv0`FUfl}uXW^ccw~O> zC2EYI2voifdJ4Si-ZE1zTy_`D*;nhyzFJnEgk{08LJ6bROL?ZmMBAk2Sw9~0@-n4c z!h7j0c&>!5=grEMB3{bOT#iRs=fJuQlStL~s-n(x2bo?eHI`vlJ32Fg-5EZ zm~}l};?9NinvP};Lo;($W5120irOZm&k9RQ)yKx>hW0R<7kW&pqx>f_qC#VuIMPXBm zMD9hS%T2^9iGrp^SdVu*UioKf+03r|XFt1&x~h|z)Ue#jx+f?N*5luvt?x;7>H1mJ z{JiX8=!u$+72f+td30*81I@*;`vJw7{FpMkkIWa;i|G8;BAGce3ZLJ%KjOI_H9u#n zU2qTcpW``tja=cW&OEPbj9uXF>$1%yP2qK?|MK5CP4HR&*{7d|b&Ka)=2x;q+vS5@ zrthdInYpwLXw!HI^lMtGgtER&*wgYV%=DUGV-Be?Bi>oVoPMaB)b`}<7e1qWjr_ij zSeNlvTJ%10o~SdZ@x{KSgm(e2b)cLAG=o|R=Kg^yCOW^DQ$3Z|J$trb(L1Cb3C{12 zTwlj|)Zp{iG3&$*v2xJi^fj|Ah8*|#U9<|xB3l^x9<#}XR(VrM`t(~Y0bBS}*!Nvq zPwXmx-;>3`xZMw^)UNsie0Qq&kGHMqD}iQlTV4G+o^F| zaii8xMD-}(O}gR{t+CC% zlNRXw^pQ8`E0xtcKT}W1VMP zL$a;(NzprbAFA~9jvLxuV@arTyCvOZ{zKQ2EbhS#M8y(39DABP&UhZMGvAE&UF1Iz zvH07;zFJs{u_MM_Kp4WFwOmJ}a9Di0<5`R9r+T$@t2oz7k*SqK0q4>7hfG%bG5dT($;jG6uKie4B@ z0_$M$zxU)Xdv@ck*nQ{v!?XxlbON#eE<}cljkC)E~Xr28@uU`KbuhVfmO>HK|$!O^F21s?vx`v zW9m@9>2AT7e!1}v^_%LafV&DnhMha3Xb7X|nLd+4#hN&qS$_YM><6!Q`cV@M-UHpF z82?bh+*X!W+mo;JR0+TE$Y-4K)$GsCvYj8~eO^k7fS72$AkBUEtJSq5z9<^kG1diydqbQMf7WwWlAarLv^dGa)EaMO-R``bqBG^2%5ITHceq@IpQ^Y6+d_ z-0&drt$4}#-mqmxDnDa>UCAqVy>0DPxThTADW3;lbSUqKZWVs%aKi4s4{?x4i*H1M zfO^-m`KWmt!A0S%Hvq9xLbk zAitDbOiOfS%LP|h;=XQW!>o+zf$GvcSo|*kY*O^I>EU`Vddc`?Zv9jlm&MfOX_u9+ z>vnM2cCa&M%hcOJH}lxaCXx8WW-03bEMMW1Pgbj}{+x@UpV6c2%CAu8QGbC_!O}96 zoXNy9eeQcj9EiT=R$!NV^*5>0;ofa=?>5vXt()XF={C6xrp9tA$Gghy=}vj&czMc| zWG{T;>l1+u-&zclxEto%UEReuNhHK{F^jqv5d9XGeMA@>ix`site@YC=mT~(G)uc3 zI6t1Hd6u?}EY0>ZoT_hV834GWb+-C^_=)vMnp?%{a>afL zcP2YQU&tqLm%i-9wyb7DAGX#PMAm}uE1i|oteg-^0DSn(WhgyecLH>BpJ{_1nZ>Lciv={;l;l*3qBN8;R_KU0Es?3%(D! zpSVtBDQDsve5L39t-8-y1*@SqmAW&0W-m7At+Ctsy==(*=TXQy@k&;O?dz-jsQwJs z_TIMC_GNE4Ok@gYr}7k?&#-!y)34{ws9yrsVma1}z^YC6tW|qpF$WXRL`$NF(mIFe zmgJU{Y%E$5Q4~wsX}}TPlCGyE%~yJOq+A3P3Iy3QobqS#Tq9Z7tudqEc4M_jK934( zcbY6d6YI&%@m#`V9Zk*^XD8zvwN;<-r=BQJV-ABJ{Fx@H=VyI}&W@BNGU*s!$7_Hg zH9%=G#Jb#S_rk*M_N4<|I6@S(W>q>OhFsITW?jq4U2sB zx^{p{Zx?g?ZB>s}x6mtF49h#gNM5&j460_KNy#wi$ zlrx53G*tpVsrt3v(RablK~edPK7{IU862t7%KB=ASzXHVr*j)c{{el>+T6|R##m+c zMN{h^?1pN1de;(s-rgM|^m&NRo1xEv?GmfE^BQaW_{pnc*x6`t8fpwxc2+H zRUJPHha%UfOMp)y4zk(ui5Oy0Bhb8apZEMKL`~GW4m3T<%p^4zvC-ZK;$%d~a&#v8 z(p$ln=V8XwE)S&s0dB??z|oj%%BI$lc%s9v;-BHl;i@M6G0-@h`GxCb`B&_aaz5{N zwst$0XJg;WzR(P@iq!aNv+N5bZ=QA0OEv5IMxQ$!*{)U9pSRwkxYxL2-sp}YqqIGl zfc3u zS=*W2tF0~$JGN>5I~FbMMIz=)SN9G@uA(A7~DWR&N z|NH-BAt!U9F@0U4@nUFV``Q1gD+6_cF~jZ^5Ol{InJu;V&k(EG{g`I5-Mg;8&6ZZt^~m|>9XT}H@}PLp*^?w~_Bij%c+f+6 z_>180-FL2@?<{+4eHmlk>+9cOYyQr(#pi9>n`d9;_4J=F)gZ;=b6R-=MQyuV*$ z6=@?oa}?Ogf*&<|L5Tva|Y&% zY_2SSytFRMu53DYQLMNBI?D5vEYW;lUb$o0Gp$v~wD1P>U+IQ{Q@};$K8TOo3>jQG zJXwrwv2(CkY^yn+=S1s~6HQ}B_2uFv`Y^2z+tyc#H6*;zMOjsCXLfeL>c-8~|3syS zI|=rCsi|q6kNFrFlL43GUuS1|odAQSjwW+kHDQ+_QTGgl#I{-}P_ zL&eMdlfjDYaS*5j{h>d_OhSHCjGuQjSG#zBwB~&ORMfT|*Ip~GMy;57*6ke&%1+2Vf3E7?_r=EsC8j z#=vwYJCVaY$ZByucI8dLI>_5*RR+8Af^6<4Yk#Z%OMe+F1DG0%vVCWtDI)&f1Lr+o zEn8Z?2W&$iq7^QqU)gqMN9P=!%OhmMTl)MYT2hPq$yN(>oq$!1!I$ATsacpDM8#$v zFL*nkFpKhnQ-^-`Io(&@TwmE{mCKkNtG7z`kL%_i%leoK=38Mv?^Mqm1*GnU@ad?3 zLvN;hmagl*kd>t5G(A?Mhqs76!6Mi3PhBB83a0qIACO49QpbH(8Ta{KpBlKwp6rYr zdGWh`E3VwmEzbM!@A?}DsK7o>kWtn1q*AL+Lv6d0GQTX8ml_27?CL_GK2$4X3X znfA>aVR+p>T6(U}T6O}ndr@_pzug; zTdQDO%f~R<6yqZHYc=Cyc~sk(`?4$VPOM&c0=$&Wr5h#VGi8iKof>s#<9y@{fLlw# z%j|l}vodK+Z$IDL;~s7mJX{$)cZD5TR~te)FN-Rp;N%SD&`U>`J;5U3uL1Dr6O^kTSN%=`LdYOZ}zJWn0|`;S(0;Cm+o}(Ksz(=UyJQcY&mbK zoNm_XQ{AhjAsm>7b+n3dI^)n^u0H|{3(T9+4q3IN*r z^xFFMOKi{U;<)wn^SJG-uI(&8VwTnKFtl%byt{6(ig&Rq@mhF2YT;5P{83OmWQi^iQ1^f6T@mNB33%-J8vX%28TF^CEBR z7g^4!vb6k&Euno_9Lh>(AMI*eor}d)!qRp2pSi3Ae1{SWNY{5WP5Tz3h$oxI$zr%& z``I14yGeOqyM09KG*o%9%C`ONrSEhUWgUEHnc)+gzg9e^e|i-1zw})hq0Q3bR*=Q~ zU^<6S8IldHu8&LEQyt&^7ugZ029pf%;{QjMHBCd^c4RI#VPA8;f9i_39+Y5@yn0xP z>DA?9C@tuJ^kp_RwwMLBoHx$Ko~wfP?Z2z2i#W|LyHRr*mlO4o*pC23E{_8@!5><+ zYkQyjseUu5l>^oscjxfi_SxcXZ4SOKB!>CN{@IV8gx~xn z{JFjH*Nu@Z{7|n7Z*ZiDi?2J^S1&T066nVqH^z6RA<7Y=3|Je9N z83YPAAN0tfw&ngQJohrZUYw=lF<#$Tv9I(Uv*J9)Z^r$`EB-^*^jGD&KZnOp_3sNk zgRU+|yx4f6JMti8!tX*hMpldx^aovkLPNjR@#h=g>Cu-VZ>G=9ng6VxvFShVYdgN& z<2L)*RrG|9^}g9}Vml-9+2;73uz{&Os?UC`yMNzp=f>F1ui?J6txDuP2{yQK(rs6X`7`hG9!JMs%Ml283x zrEBT_PU*SH-^ln>w?kHRRlh+x=L_XZ_8Bo}@>03e8+~5f#plW^x0E$fF&#^>mMfgR z_Q}sRdW<(ZHqAk$-~H2nM)R()`^nAwiFxk{nb}F$Uidy_W1zWYz*qHI$Io~2v+BRD z?(g4!+`QlV|5MHJgY*@@57u?QBENIrRds*kzN6;-zF+A#e6MKuRuzfWN~_?J`mU<` z`}Q4`|GxO%ujCo1#;DfL^!2Nd4^X}FcPsektKmJQD?v>KwI1qHrr)MLQ`T>zPy?fe zeX36k-}gqp(~rty*cx$+(5imn0&NPESeg=>xaK=jVG^qU;&w_FXTb)5CgD>IN0 zdmMj$q)&!8n;)?yziSNt!~r7*pUphHCCk4PEI(QWxKOnHeSO8JWva{|QR!2}-VHHL zxh6`a_Gxd8uNGEVJ_~A=faT@ev2d>Us^pkQ`czi*ovxMq3I5q5eZ^hd z-IeNA_Nj5y#jT7fkWXc0k7ZeSH|)#q1h=U5ww+$QFLWLM13pXrnT zL-qiIbf}8Z>N$KBH6GRhT82%4NYGuvn!0xM*@T^5=;t`{NL9hKbAT&YN6TtT>?>L> z$kBzaj0nxy-s#Sb*TmJl(RUz4@#;7iRfu6;Zl~>b`a}4XQOJ#7_1Pg@7W^Z#Yqgfx z|9a2$$zEv36lfF`x*=8E8JmSI{jBTS-}qAJ1lRhYqemb6nrz~IKk?IF1}_+GrQUv@ z$-<)-{1jL0cf%@80Xz+N1ATM64c-MDyYJDyyJTB;N83Fz|COKXTHfdnysN&W`|cX< znZ9F*4M&RT+&xxPFXOK1J5%}YT*dF;_tEvak6fOaMy}t8&y5Gm5F!vbmlXZEigi?J3v-&i=r(`9Q)%=f?m{ifyt4gFT{^jWCYQ1iknQdb$i1jzbqwBWAp z>xdRS9=|h8Ai^T}AN?P(*Y9-3W3evs9jIs=pXpKTiTBTtuwB`op`9aLQR-6Hy?Vr+ z;I#5O{7%>*mH(ztUS9EB-yf;Mdp<^_?DI@l&8G_{0B&Gh%QDY>EXxPO__J!v*iWK! zi63!$WO}1zHsdFKQlKt;CcE-3lX}wVUe7+F>(e84&*aQq+2<^j!7bQ4xm)ni>7t~b z)YY>~&pngx!E2P6LDZ12J!I2nykZWOklA^!JE_^!ip1tfR@=EeyI-a3ezt}Hsv|^R za)ESYdbH109|*mz!KG5ZKmV2Cpc9vgtiS1c$n`e|Vz7C=U0(n6vv{`blb99-C$oF& zEu99-Z0Kv5#+s3r^<5)|*w)`!C@re|ZdQc68#dn0V_tcTgh77ORfwkPT=i`SEH~A^*eJg* zaTvoq!R6sd&t_%hme|d$w$we0H4AyrtQ;%vDUX!X#oo}a*iDc1vvh^Xvf!|yh``s$ zgGat-I-hkp!TL~DAVUL7Glr}6RLR(^-{oDQ)~?WH+a5T~JSMc;Uc_M*LnGELbDL&+ z-^(K$$;a#|GkGEHi}+oice|~=I2N{3-FtNJc5`ZjWmwqGIDXF7ozHz3Y3WIh6NXPsrYe+_90G%n)#wm`^^p#BoorhP2T><*YvB!Zo#2M{q z7(mXb7>52X!@BMS&Mce6Yq=9{UBf=Dn;0GM1eC+A>xul`<>Khq#k%@x&Qf6;#Hf6v z`!ju++WlaQ(=|}Ln677PHz!j|+!fQ-A%lvXR+J7N%j#0^l>M~uqhYhe`D$2SsXqm$ zc3T!#8&&h}L211<_4qgSaKHG-m6?TqJkoU}d?I$7_LPG$@e1qGW?$b6^|;Vgj+8Bu z`N7XMO(=3l*xe`#p@m1s>T%JLD*GG8J%2BJ#84G`Rb$o0^XI=``O`2lQtnv(o{p!q z;wj6v<5nKa_p&1<53RHMNVWxXb}Gvy-#5kKH)F=vEGsrX4t7^ggrgf3U(-9HLpq|< zs)lY9os6?XBku!ov*$Aj^9t6j$YvGr$1oH?(xblPYUt2iy%oVoGDd1WtIjjHo0GvU zW|4i~@44>QsCJr-CLPeaACNLVl+tcguTcgzP-LYZ)maDR? zT7>VJ?Bj!MdosE|)u)U;e~FL~`@WG4u=@`C=6q|USxKSVtXd4KKjBZA7@AI2Gj;+salWuc+3HuoU4Fa z7`J9c#$ey}l5$^`@d@Mc-Mp`*vz%W+_mwvFd$W6hOp^D2%>(n#K2p!qb{1HE>oX$l zGa|K?h;mCyKV{yhw{&1kXgMatb&&jRz=Bt6E@k9qIEsl;>eT{cHU(oo8}pbV$h+clD{I85sG zA8Rg^8JUsTlX%R-@b%N+Q}=c6@ml;WQ%*(=kYK1koZx{ zA&u|XziA@w!gK!#ZcD7m6@A@*o`*inA{{BSLHs5e7|iI4Vs53@PMHneZs6?9_npzV zkz1PAgFpU_tbjS>{CfNI%6i<~J>fcd!d5Nk`4(nX3>gFydDs=&`pL3vVqsI00v4e; zVq5o!Th?k!FE7V;?S!5m9qZZ}rN*)h+lW4lY0s1ex<$dtSxvsfBHd$jnp#=omGi```CeDRWanY18$e%}`Am=IwM9f_(T z@nUA~mExUEv2n**#7xJqY2zpPwwFTwP=@(Ql_}X8nY!W8k2Px#HjZ91xh1cO|4f@Z zT58t$GfsWi_<5+GiQXgaE3+#d=}MSWG>ywR(}mvU5j5l!*BIJ_a4YnRF3dIN_!t=U*3ui z1k=7Yzf2_zQ?rlt_^aOUQ+Wx)BaVVEW4<@e)uWTyrjtZ}4Uc#xPm7mwrQbSk0H45m zv1ylWX_jr)^TX;aZC7`J>(r28t>4VRY~?`s3Um(0WG(AI4IBo0?2&S#N%hMX=1e)y zX?_x~N?+rdB2=y&NOvRuz8+KQY6+HS@@#8Zwl&K)nR4pWP<0S1$(t=go(V6@t%hFj zVmg84r|EWsA6i`nLC{lT#hXx<#;=)cCQrA%CQ-V~sAH}aZDm_*sao_cvX_rS^yf^; z8f_oKd!5hD4W0|H6(pBy!#B**bou+o>X0fC#oX8%cqoLJ9F12#)Zz9)2mJ!!7MPfKrMg6RL?jg!o%)4AMm&{p3RHi?K9AnWv;Z|Xfip}Ktb$MTn z9Q)Js)n@s%mTLFzcpptY2Iqclo&DOf?B-r`m%#1D?S^@>)_KO#ZeUZ=Wx7mUEuO=X z*da*lG}WK9!FK*W+XrF#kesO&RWs})&x2e;uXaZHdf^f!ibe(bRX{$=$78=cPI%R; zHJ1L!(SGW5tJX^u*VW`lE-U{r57olXal7&Shd$Bmz^)nUZ(?rZ`45%%`uUhL3K5;2 zt1}0~^bh5`Gv*PFf2~3Jt8~+N3A*@ce zaF*z$;h{FO(!$M&NT+wr@gUQ3u60D(XIWI&Tf$dIqvbsCGbW#pS^ZAvIJVeVj%$|| z>mJfQK7jq!zAd|z3adW8W)E7q#3Xe-M=SmC+0 zR-zVd9b>%-{%Bb?Mht72O?Ml+IlHoF&w5Pe_NLcAKlk4rGqvjTCeQsr@Q;EX*B3sC zsoHYbuFuP{=i6f?R<~zo&!VAVig{PD$!fMem%QcFXDuI(h|Hb9Guv+H=sV(fJ*SBO zpYY2gbvWWa?fm-^dFxL5Mr#5aX{}zSM|o$|x-R-`Ul$cCzy&}{Ou>|1U9`x1Axgt0 zsbws=f4iRkZE;J2A-Ub8ydP^Nn^g6Q(mp=Yb?c4I_eqO#lpe{y!AxMLWw!bOGbiX# zp#yWIsVz1syp&dzO)-DD@sExFl3$!Ry&UIFx(W&DN}Q8B1btl8Cq0liYSRQNdkX3E zn`cRGC3Y9A^HdQXsKxBXS+&y`9;?`on(bX$dY5-KA=$R=s`NA7yIl3&&`=$0iO&PoDb7Zf!4peEbvZmN9PHT-{ zy1iijTyINWZ>?&*Rl}x#64bum7kvAONZ$^MBk)Kakp{8%JgHV8I`zXMu8eYE(ui(n z4nEGd(p*gF=U?Tfh{zx~o>1)>Y5EG@)mtH#{H~+odQIoXk;mmDkBj;^+YjMB&hz)# z`FqJpfvb{^FQ1Fib6X4pa0VucJbrroY}v5zwJK`shMj*@GMueJ(Ykf1tQ;LJzdoo{ znQ`H%zE<~jPg{GUXF^A{ZO`v?=9AAh`fTH}W*ZmH6SlM^P9D7?R9D$TU7N#^4W3AI*z{b@8-@3Y<8)kA_ z8g5&r9M;0qtFbNLySkn>H4E{tXF$+HVq&rd(ePRz_JXb(!?VS1+7(YqyK&~sdNXHQ zY{fOd7uhMXek_?X-+3hc6mYC7FT0^7u&ATk(UuY9~Jxe3*d$ao_uarjti{|-bozJ_O z!@8Nv^raSu9i8|(cueOZQu(sG7>!FJvt^|3f{%H(@jv=M?e&g6Cml}&JJg@(cj7D{ z(FiZaD}a*4KEj>gjkX)MvXvD>;+U1QVfDVs=e(AU^CoM!Z0mV2Mpo-pN!)tYyTV+& zzhl!qE!dXN$lt^n`8;baxjOkXF^(}0#I)f~LnL#%x`}qxf|1#tsuo{W#y98WTpvzO zi`_hE<}kS3T-W|h9<6HPm~HjA)37DhECsuxYn%RmY>OLOuUXUwshX zxUa7+gcq2GXUvLh=Xy(ZpTFKoKoQ;veMF@V%)oH^bj+r(&Y!}yFjH}^uR-_s^~jO% zN|4RR0oy#*bNsyslS*X|pas`t?*sZWV5PhIy+KUb0-68j-D~`OjNYH>dVbSSaiykI zbEdCH`WxRvzMlN8N8v1-lU@l-q>;`_TsziRHCN;)>oAmc7Mmjf%uBEOT%Q!5@NTdZ zdQJJU@y^%@y#AKV&aiai^qwq&`=NZ@_>3L5Iqp$C*0J0NToD)?eE_~MUyTXAi0Yj+ zA^q09isyDq8)j*<@%(S~iJy)A*uMP7tMKWU9jek6tV?=lJilAtb$UFui_$}SmlQnv zDzt8|TUURm<=!241?nx={8{Yacl+oucfeD5zx0JNDOdQXH${gcWp8C9&!35L`Z7<*Jqw889&B_qV7>Z@t^j-OQva5R`T0d~B3Lg3<>m;P!yT!31<$qMQ*bwy| zTUt|(wLB);lkMMv$zAKEat2=M`K+Ra5tR0FywlZ~zADu#`4N@>U-j5$;!2r{0X51f z)Vl}ze@}m@Tc~gOZTR<wiAaL)mRJ0Q_twB zUMKD;SZ)W(G58@E{AyZm+;~v09N?CVC%H-JCa4m za_?5YVp46SH*b|(u3TZgM=HNPO=OXE?DZVg;t}&R=GT?H?(nN{UpmB>ex)e5ue>~@~^E2U0O|y)2;hDupp41H#+094s(LOC9DrHAwJ1j^^ocBj>Zg=^mCiaY26Bj zSV2N4`_P~7!>4hs_nY1}8DT%_!;VF2i+VMt+y|6a<~XM7jMYy7eh5ojiQ*(nz-U{9%ZLRKEqbtsY(ES zd82;Xxw56idPp4>{1}?UwSEk{ovl+BCxk(6OkaRl|BdppQ=usN6%+q?l%rrxf~A~| zv#*-W%{2!ubAr9r&McpcpZb%r!o8tpeKvP5V8<=kTy8VvE9RA;*PaKui%eVRCZQph zWv6kzvn9)OO9iX<9-Q5YlRdbH<5?0IF4i|7M!r@Iq+Yf;lkRh+$BXzKjKtdw6I(xo z7`xwtyln+W#^J^j)jn}^^1I;0&#Ez$zMmb9r+5w(-yKgGf~TY!bY4B0wo}&gr}K(* zasnx`3(_$@cja?e<`tG-fwkLtOH58STzXRP?A9vdQKzlbRDFv*p`+cVd+hdf(~!It zdop#i+YP#pxjlItHU>F}kk3C~HS4wA&OHu$y*n*4n8!ISyT685f2%4O4NCZ{R_X4H zCz|W0q^4sq-VOF{aD6v;cK@!LP%1Z@1_}4(fzHfUUPpC?pgPO2D^s*=u`BnA*zHkJ zIZrcz8I#r`c3(_n9dY`p+%OW8Qy0-}p{buP@azXxneFZYYj*M9%elK37~i z3H^&VVi-qO0ek`21M{9QQNNf~E_3tk@^r{c^-hnkL+m{72Y0hHyJu{6-IxpIF|qEz zH<^vxuja+O(a*1U#z2tBPWUcKsJs>9?ef7%cf6k6LY+q@ZIUIr_C>u zM@8$sJ)VE7=XK4}TG&#gF)kT%aF@%oK`RmMhvPAi$aWg>$RD}}7+TH za)`eq&JMG}$Es1EDi_(;A2=VjQ;5$GOlX=VM;iq@be_NKm0W$C_`ktIQPn&RS~Gk4 z9z~mDF=g?=@p<$-@xQMF(qhay@EI7j%pX~d%kxXCe9E69V>PyqaeK_4m#>q*M!Y}J z(4{u2*YmMVrbLRK$Zy(~YP{oYH0VV4FYls2JJ7W_mrZi_#`AqHi^2jEI_Xw5#H#YzX%@QE%K6?_K8iPM zQ9qt`{;SMJmQngF z?>ss#P~UlMt;il}!z+0z8Q6!A2Bz??=#5+mY@f9=Rw}8VM0Cr#o|e^G$36^*u5}=CEM*>2V;phv zuv!(9=b^XpT1+Z3A*OD?u;SEfI=3m;(!q(>u=(*Tdhf60Lq}4*N5|w}dd(B*oPaY? z!SGCarHkUI++VjSAI40MUR69Jo8FSLi{swIaPQ?t*SH1KD}t|Or>}Hp(C?#qA@9AZ z>LlI%tl=DyQEL;)|E+iHpqKS;+(qL}v~=@wFO++p=J5sGV@t7qwufvvEWw>E3^I_3J-DO4RWY*QvpY&OKS zUpo`+P9^Q|iQV?_~| zj&X|C=LFlQ&4$_6oxlorp9*@!blXUpe6gQ*BAbM33*rN-mPt6icAvT$9p;!VwB`|J z^X^lxnu$U!xn2y0Stw=6k1=E^9$!8e88hgIGUEsrtTu!78t8h~Kws%z*bmb$lQqy+ zAs^ydSS4`o;nC(tMSB91WTvZy5 zm@Y*;BH1`R8+cr`5!P+oZTzxqe41@x&%el$nH^=bWRBBV*YRGMA-vPTuI|q9_4RIk z4QE6n{;9rVjx^pu^V!$T9@&&B|DR=7JzKfVITAxS67AUlYBpz@{EfVxBYnm&YRuCn zZHwqD4Nq^WgQwZEceXz**M9vf>&U@)(Xmc^BbID4{K-pBv*O!h#nNT$*7dnTpBt>7 z8=PLl!(cS~WrFHZUb!#E-;(8`6wtB{t}mu14T$+M+%+foT=;a#Z9(gW2c%d&i3p&f z0unIkE%W1I{J$Hl4=b##mB2OUZ6iEYUTA(aa(KCx*Hya+tqb!(pU!B4_gk-L5jned zt@(XdW~rW)E;lP(mQ8|Dp0(vb(=TGs?B&)Dlo7H--tps1SHrG0<@;bb@JPKE`(4MEuLE<3*VxnRQPoky z``qZTxl!Xn*jg_o1`O1nsC{!V$`x2(J`|Ag~*xZW1o2DiLCufOV; zw9R@O^Gf0}_ni-8Z|%s3(c!ag(Y3Y{BdF_t;KdD_>S7@4r!h0!hEPXDbH3jHxD8!T zCf0BpVv{L0bf-FoxeZ-U8=Bq;0Q&@2LC>EmZCbyd>>Ms18bq~Gty}N;Y$kQ^pEZj( zJC@CUcD;H5)3|}?%rjeW1ocn3hYwQ zhRJ-RpNnAL*=^iy{6N;s-nCC{a8#J684?t{!WR%)l^4+knKZA~yO=DBL?$b?@|j)SR5G_H3Tvwofny z9Tq0d^83wkip#C`7PDNNFZUYGbA{`gE8O*5p_gasth%ABI`g=Bt{Sshp2;7N8S9-f z2dX7UaOT1F?F&zf+20ExexkdzzpKD5LNF?i)*h{|Hd^n>uffE`&*iy&?(29iZat=V z*1xf9Th_}2ZOdLIXU(AbF?4Qby=w90S{fay7WFK*G`F-#pO!4LMLYkNJRE-RP6OAp zI|b8ckFE!Fpy;v=Y5>V{W=G9*T$_cN;uL)5dhIl?Dz0l)ajXn2BGXon=8ycWJBAKD zJKT(;bXRuM*70`#gg?GcvpBhh)Y(icBhzi>rrXTDFvHw3bK^F1({1LyP%bzu^>bQo zGuO*zQcgTOcdkL4EKhE+Cf>^mHwDQ`7lzYz?5cbADXu!@u0{p7)TRH+xr z!Nyl%9@TQohzUpBm#w^QERye42ffiB_ONaRrT5bi3*PIoXHt%{m|(h$D8=R9*K2n@ z4imM1gh*pi15NpKCXd}iV)rnu9QMuIgoUduEq_9HdJkb$rz6-{7IVLgIUJy&RSUZo z@k|~&J$5c5c6ROXa;oheSuMOww_CT{W!WwD^)!X+eunuy@r|fFT6FlG3vxXX?d5vD z?}X#f39(%RXx_w1f?aoQmBh4~+vjk74!3U}Jfe$vCyttWax%QHixRgoGT~UGA-28o zSJkec^~_35T4!#><#g+8_5RU@D{-|dakbX3k5s9k+I8^JOOc-u7jIRobe4F>BViEi zSUH_QIu=1T(rY@ZF$C4fd$vF5v!OF#O0C_jX;;skhE4=%(vfy>ux%TS*BHkhjQbMx z7Lt2_5*ao{`%-_8%6X)-zSRGQ&taeDZ61Xy2W`%^clLBV*Lb48C=u}QD@9(=wNrg( zuY-cvC?I`oQ+TDXUP;-A$7bzvV5b)IIUn>dIGepH_U$@@SFQcCY&(XX*-`8XxsapHAstEvsXui>$6*g5T%zoq9 zM|$t=cd;zREqc{08ifFScRe>^o(*E#rpZXP#J)uCrn8N2l!K7V=Dr`h<5AzLXgT3( z=~E>?`6BFxzijVnlR>b^YWEtrE#8#*Y&^w#{V`QOQwuhfX7W*Nf(@;aH(-$)^$PQJ z_12YpsxlkMV`t3aVvK&iQ4@u|{(7YhgRPm%>0PW>Z+p6D?Pg-&j_LTAv2q+64NrS< z!)WvL2U}wMbc=U<;l+k!&geH^b-ixhkD8IYW%c*bCwraD9F}k2_Zo87?%910QvK$Y z_42W;-ALHuZ-q+k%ct(?F544s3a7D*{N`D$=Utyk)J+L;*Kl6Y)O-j16J3#Ix|_<3 zLGEWEyRp8HJ4w& zOzpYSmiS!3*oi2yCji1^`UuNVTgx|fN7hB&)AZfoFZFqStFl#U5xD zwT+?UwsBp(N>p$>2|Z%E$fY;2oE)!X+V|0h*xPM$d-Zu1)_5W{Nb5oLW&2jg?&@4* zS=7%5iowY*zSH+-LaBWhJTo_V`qjduqu+TEGU9~u&G$*so?!de;>$5-g4^?6c8hJq zU1eJVc}eIacJxqr1QtY-OIAX@9GC zWjOjhIcND|yn7DRm`^X?JjdDCRYz7tcbUx`XYw9Yj8tnpj(sH01=4)GK}9C{pNk3a z=(wBXZY{M*+!I>vk0~Q=%-?M*{p>oE853iu{wxb8S{gnP(GmDx#%nX?7&rrW1m4hj zr|s3{?8)2wbHpp9qsdoJg;?cBfDLr;@F@lSeJz)@pdUc~Zd z+nM7ELvV#;H zW>`ngGg=1I`SL3lHsrNVu6OOGua?QJ2WxYS9fF?l&SFW{r&gn8XTblA zoc3;CFg;iLx<0-;_0jUSi@P^5v8~-EUc{;&GG}h^ZfYiW2T-+miw&xbw9;Z!*^PQ$DF0`+P&KOwquK1)VxPYui zPq-a$9*^E>LM6{mCZk7Q>qSi*SAiQgO}>1;OJ&1UihJJ44ZFUbahQ!R?s=IO*x&eG z{`YtN&G$9J5O=@pe)sBimRhTRvI(r0Ia$jjQhvcCXq=+m6sBZ)3Clp>9Sd+QpbZOX z!?NnF`rg>8=ht(-=fdiW)tjepvyCU3guV#snpFGnP*S~Qydn2+O!lL(?e)@C@lIRg z_S4Y6OlVcI;braA^BC3J>JDmM?UD^{c?YhO;qmkFH_) zzXT+o$|lG4qL*Z@mbsq#tpU%*=<2>+k4ov4uE%t3sF2K8reij>Nr)-#mt&2bpL8{- zLxJ7cMvTW&q-Q%8igoAuop{X>k*rbSj+z5G2Yy%QM8N=Mx}==hca5LxJz&2QY6QQH zuXLm<*;Dj~@y@m+5M`7wtUk+ew5huY9dI70*M|MQ z^Ey}~ud$b@O}Q5AFl6*C6Y0n(# zQ?ObSrsVVRi5%$jzzV28|Iq933hB616Eo+1YvX=3v(0xy{#Ea>)!@EW=l74c*+1L+ zV&keU`ffmZb{Z;JyEF0)6TV-En)=V;2t>~_?bBViobalxkr~E6$-CC)k#3DQM^Ejl zt?_{@5sq4Yv`@YQ`I`BvWKYmo_|iU z^0_R+qKnMSRMKQ?a7BiwKmm zb`H`b_pom4y4BS~?2TICME1sRmV+tyolV&eq097QzsRE5C`2B*EgasfjaA&rhbHB8`@%O-RT^iB&dM_# z4<7PdpKILL80!goD0EWlt*TCc6witk!MlsI3+zRrGvxb;Ce@Mc(^xHpg-y+tL1RPd zyS}Ov=3Sc=<=m$76fe2#b91NekE`B) ztVq?@&o@~2?9TeHEfYx7t%&SD+ESnW)T0>YQO)k%deC*by4^FSe@fq#nS4~Cqrz;l zo}pM6-spooB|U2x)YPAjk1-9$^xkjc$*uxEhP7BE{6&%MN6i*K)c@pQAeqD#FoF-d z=Ke?fY>d5o?4+olk?i^nXU|<%_FT&Jht&a0eYb6u%JZVqUcCx_WWP}^z+BIf{(Tt`n$lld4hi?ubT{T}U)@*#Z?y4Q zV98l7NX=@M*_nPL>z=U7i>abNlrz#zwIll~5_(|tFwS)+F?~ya%wC1>*}w5Vbb{d^ zkagN~^jiKUOM2hXm)+Cron<-*XcC^N#^qH}IAZqvSdUEZ_jA_X5Z2zJzV&wK@wZHb zPrDDI-bLwi$b@ay4Q&hS=^c!1`;n~7IGyNWLHO1wn!7FOdz8PYV>i}a ztIrC`3TpP2$`TjE$`)wSIfPad+k-=Sy^7UE_{k*<6dxEQ95o>d~oDzcvZuDhnF*7 zxBB~l?Rwj|VsvPB^;?n^lHXbPimbpmJ}ng(*#%s+*Ws0plygjO1St2M`=;vijhn%| z{#uqnML~7Z-D;UX%T&}!sD#Vt8<7E1N32&K$zQuqACbx(B>Yeq0+sgkDl94*8m60m zZqvKc1Fd*kP2TkzmS;wOPh{|PkBi=m2)QhVqGR}u;n!E|muJ&=f=WXRciU?jayLi! z7p>BBn@(RxUmKCp`Wa=nOSj8qphw9T%T9kcFKEplQ0Daf!O?!~=4!ci*zWXsufAu> zItjKV(_e2tR`R!H%a>KlpNHBB?0|YGGCiN@8bHlY#K)^=ct+Kdv#fXYS*XWAn|YR< zc9Y#uSJGYtL70XW4Yf1VX>`oU-oFFg1N*uUy<-X9dLTY4b%yOLoW?4d)o-`W8$ak(I0Kj!|9A74nt6-J4=@y#tAkf? zqE|Goih0n{#5J3r_U?RpcfJ~9*-TgKEFZlj5&f9 zYj8x@5#41Yy2)Dmtdtt=LEu8wXUVSoaXpnko@kaNZisoO$!OF4=zFx!lHfms_P5O} zg95;+?qfJH8`5|7T82sA&yKR~fsQ8)!IS#l)jqY2?*j|yy!R8d&)a4rK=!O+2Vr;n zX+=&VqP8yV%6|LFJqi_D_o%Pr4Vb$4m;N^`70|-}7RSwY)J86S{z}oZY%+swfwdLf z4|-MiOzXwlO_@&F$4-yW%GYnn`%vjq#noDgXF}IA6JnmG?CIH*E&JBq3N7MU`lyG> zUGP?4=@GVJqb5TygU7&qY+K&sv&k#bPu@|+RBLZuA9{VbjQa4Z?A!9W`l##n?e@J4 z`?j38^x)(&vFnAta_r;ctGo3loq^}Ue;<6TPYmDPZcu&B?U{2B8z!}#=|xN`h;PoE zDrYjiUn{PjC1gGJQ$;YFYaU6{!KUNclr%Ykl;_l5H4mwpFUKP9jCmOKoZ;uHmrjL& ze5Z`%P#FrnFBHaYIwRTZyO87Lcfn@IO0mQA6Bkm5MO%_bnU+V%10@dADtV)`Odg*f zm0MU1J0ngJMYbDu9M4$lfw;X6vDZ{H4XdT@jccj;*zdK}^{u6-i(pXwsK4imG{nJw zg&Ha8n-GWDVoh~rn$u?!$LBsG)ljCBS#M|E=+=$?>^J8csqdJiL;)%03$^HT^h{?N z54YSKILX0vPc_6-QOnfYSAJ~7r~9nxc9?st$AR)FSiYX`WdP4+tK9O`PAr$AQleHU zd2QwwR*i8|Z=t)&m|j)*J!3cSG;H_n^Kwsuk{dbTe6N;ks$J+4C67ee?Wt;!kv@lG z{c9>$$9h%1eieK^%CunVZ}eC?A3p(-#_PP%S8!|1W14CfoNw6Q?h}Xl#IpKr$1fj! z>;+Su(hDIXKGvrMN1K`7nz^Bp0T{%=3rqhM_tYHP0u&6yG5h_lYkAr?{qd})Mq;m8rk(;(xbljc9zlG z$-V0GqJH~q_jG%9AM8FDD@}VqEklfaN082Z(ls4h9v6M>?ci(KIa|vU>F*BG1}_lPd9#7qL5apqq=T;i|eEIG)n?SzZiE7qgC}y zY}-UOD9^bt9#gZ3$9LIMQo9^g2)}MW(_tNeVpW_}@&*e5)W05`W-Ty}xjC z$Rp`J(?Qu3Q;iP!tI#3GC$aqx9x`7))iY>8(`&cwH|z|t{g&jLuQ$HfXo;|~gKbee z&nU`1w)bd;^=O!4VF&A(KCMG}$Dj2XgQT*ln9rZDFNz&7R1Q>^>F1_zf4V=OMz8m5 zp6mH;hPY+)&&pe7`|?RkT)qXH%G6E+#yGFOh@KYap;hN)&C;Ly)n|L|G0DF!FSpA* z-%xuy{OD)%h?Zk5Y{gy9hB8M2m!IL!%0BH=Ts8L3RaotVFgxvxwWE+xQDu@red+um zA#X23*4Pr+$v@x7kMlml4zucGc3#T7qiqJ=Ri#072wN!DF}5$S-{acWyv5P&91)Dw zRvF)ILcuY~#kS3@n+LvHYc`GOdTXAav*vbP*7K!x_h+v;0$%>K=e7T}@t+(2Ax!1d z)_qrLpT--$)6h$tHZk^CCvLa=ZxX#)TeNQEUm7a>U2)6NjwZj@50eEc+jtauE!ft)?hF$N9GA8*qfULH$6o0% zo=van9Q0wGz^k;RJ7Hc2{ixb5&at;Cg$ryKSrJn}%d~*1aa%hS_i=Y?4`jctN}R>O5$Soa)g&yP^|_ zURr&YH{Gk{m<3VExm&-c6SDW>l0F_cx9ndIMBin7$eWSeI? z%VEgdn2_a&QRqan`-^xyYr74s3x4K<{zV(tUKRdZs$=rs7-Z?a{=$JHy5;X_{GBZq z^?fyXwaZ4x7qfk|)E+cwQ+lP$y|)hf0Nk^!-Ihgc=}y>;>z!GoWiI_*iJo0VH)5D>JTL&||TTK(Im$O4Is+8qt%&#jcrVYOeXI~EK zaJN=8wl&@>nzk$nt0o4oOC$!nC7*_8oBIsD|0Z}1azyKR<t-|FpJw|o{^)r74X*g;q1({Q)NCBrb2yL!`%FPV7}$d%{X)UFfjV;l@EpB zz7DU6g1htL?7aoWS_J8@@ig~?p2ki?t?1TrJ?la|%Sk{>fGO6o1`c2Bw=jTPJJ;PLM(Vt>sC0eEN!%r2ttO|Ihj-n~A+V^x4 z^Y81?(#MLMOj8o6;rdLT$#dl)xw2tv_KAE@9>^3DIZEW-b)PBy&bJ}Q-Va$z!bh>7 z2MrjNN4)D9@w!Y1CgNVoT40xzDgg1B(!Q)(191oUT!!Lj&U5scXfg`)_?*!_X^(6+ z9%id}KI+4IR_^?cx9tIWEYEDrnVSAKvDS``ifMTE`iL9rNbh=I#{DrAG41|bjJxI| zUGZdcy3jMjA(>&sHoj8U&18b1sim#8Y-;x$?|SBVv+d+os3e(Dspo&WrCd)-d7{k! zH+d4PGRZpoScP#9Guo}-3N|BjHb%+!m9NGcwXagRJML1~M?s&ni?#mxuu{7@kRhq_ zy3O66i}8%@J-%_Oiw3)1+^`vttMGNE279|<0?vKiI{LbQhls~S9DIheFc*6u6Z z=_?TvCy(fhk5(hLXth666#k&s-WUGP4DTzQ$vVkQ&>Ak0j$wZ2C;h}r{S4T#?VQ-x zBS)Gc29bCiRN2{W%ioLenjj2`qtT*tm8;h5>YU^U$Hk;V-!*<7uEgeqe;Z%vNLON0 z*mNl3@66YezcusBww0YshN)xgr`yKgnk({(bXY~&Z|95L2`#3n{=uD!-KR;nWVcWCI_R0OO?bI?fm__Cx45`%YP$g$&TVee5A}IA z_r7n#Jp_v?-B;!P>i5EG+zYK8z4UoTi~zsN-t}LDPkk$`6yqPGBP30=gC-O*r z=i~Rz>k#vKjlGOT=W24pYNKiS>aaK-y=pz;ll#;Q*$?sgNLJ)={JKtL{a<~;Xhh;2 znC9Hm_oxnmFJ7pUiqG%rc|6B!9YJmnKKV%Bz1H#Z`#hHL{Byk?NaY`jH|0;~M@F2< zbii7&PTxWFX|<@0A+3uyqjC+rCLq(FOmr_@unsqQ&YVeix;@?S`3+T29V$ z#S0YsX6-2aO7Y>}p)=+C2~Wow&FhK8w($46eE-Ndj5hO4$U%-(Tg3dpbZT4h*>2Cq zl?ASA9^193*%Kt)nVGs*@QW02>2t2r&>2!s!J6A?_eRGuBmBTxDfBSX8SA zMbpAKL3Hh?L%5DTWn%}u_WB@ba<|MOQ&oesodyjLLu})uJzc`Ik2M`x&QT>!1|Ixe zcgskqzVVfro#Ok4y5{$K4Bb6VI#fOoPE?R5X=cxDOZB2u%eon`8)SHu|f>gtfeJi_6 zUzhe}dFF#)M=c$0_k*Sv3-0tHY<_Y-hzDds?CSmC-JlHEl6TJU6y}-}SUaEePx|{> z>NvmXe=OAi1^U`amS?=?S2$$6JwE=uV-oxzQ^UJ>sc;_pO-c@3)#eS+3szCMPxv!hbb}Z2oTd_+)rP9t{s~m z(^q3#$hWF)zz+G8UJ1vu4vuk@j`R$epT&D{KGY6l4hMpHG440V<6>lI(uYoVy%N;) z*lv@S<(AS}eQV#wdXuw&dV8k(Wb=#9qFJv?9R=O(0A|X!m z&?ln5vCem@*+cm}kk43xx%h-T?*i5Rs@r)>wwv2|;;{ML8x#81Q*rBC;q}L%TKV7O zyq0|jlaCq0@iZXMAeFN<=B?sy!S`Ly?Ydf5ZOxQ2OL&o{CSy3zWX0q;Cg?vA7_Q8L z{?98y@cg8c1EVGR@v<`fhjMtIo20U-_3d51*yk%JKY@Ik6tlgx7{2?&o9+|2ulIvi zmit57Z-dvfc<@1f4tCwexEt#J@ak(3u=}>XXmoR=N4 z2c&JkRh~WN*;3TbDzhfX)2|BAv&jYHyq*Vcc4GWk_hhx^g|22sg9#1#>GfJh)9u^2 zAimRvDT}>;)WZp)p2@#2{h?JdJI(Ajx4^6Hgshw2tnWj%Wdh*d-dXp$=<4gD%d%*+ zi9EM;i(X}m{w844aN1ynQn|s7n}+10@9NwqNAj<_i(Y2AHCgYyan@Tu`{r4%XT8iM z9|*;t#4oV8+Ro^=@~G_3eyKmxS)^bB?n&K~UbQFPm2Dr%I>||0+KhW z>3~m$7vFbeWJ^cpUcK%Y-Pn_loO{bdPISFYlG}Z0tm)m*O^OWsv+%oo2z>9PnX;)n z5VeIv=j3m!1}DFM&hA;TQq(v4Fs)mvtk_83;z4UH%Pcxt6>|Z2@>jCS!=Bj?pY&J_ ztE!L9>~N#Pu}S3qD#zGxEtWOSk9tSS`AThkrP>_x@A68_Geyhqx8!!@A8*Gb6nDs0 zn0P~d^O<}f9bLR5DtOGk<=@x)!N+>7J?&LE(ksCRN$2pn^&xZX-|5pi7jhGoDUX%8 zbsy`CptiNbyOO?Hei=Gk*c{4cXtTYMk1#9DAL+Bfov|KV{ag>5>(BKE{}gNMvN|wb z4&%Q+ROJE-1%EbdYt)&}f~RAfkn3zLzU^YDowV(7#s=nVNAJo`*&GBno859-`lP|W zTXlW&?V#N=mv*0@GtV0Tmo%wifu}1ftqm<}Vz1dE^U1!cY}lqUG9`N-PsPViI*@U9 zh2=H*Gvz1vSU-*0!#jOiwVRwwS4hiI5OC@3Z2ndey} zKgV$iNkh}?LXW-DW96%!g;(=A0$4;XdHH48%$>1jd3}!}_ci5bTUzO_W6LU!*_^P4 z-4GkkLOx#}Y4t=NSzC73My;x7hqg_PZEZ}zjK(TpQODIin<1N^uHOcKuv(t&e(0ou ziqv{GvNU3;-8V3SiCtDxrhYT*AdqM@;ihT!J}xloa#F{3kN=>b<_ur!FaHm-+&GzK zyC&#{GqZJ~SG1j@W}~B^@RqLG>R$J!t^TxIq1INdcf_N0F0JdGFUMm(mjAK4c~7{o zssFIK>xGc7{%6W4Yq{U;G1K6FwSV;epN95YJ0qWmr_>tsifhoH#cDlZ2o4@^u#Ue=BOzzW?Ae%zbl1g zx2z}fGrnOX_p!@jTC%qsrsXZ=`n7iE_=e*fE%?SVZ55_K%bw}^7>DuABW6L@qHo8G zV;QT#1)i)$mshRcU!qct*Q>7NF^RF&qHd^h5s&}UkooNj!vWnp7FL622Ax3-d28cW zJqo(|OF(PD|6?4>H@HYUn)IstcsF2T0qWNk** z<+b%yslNs+m(Lf~FVKK!OY>Mv#@8GLOQiRHHkEfd$rf=;cL=7tEIXnbzjKLp1hXBU zklPXS81$R34>E?`5XT&I^$nrjdHY3>u{!~Cz0-hL^hL8L;^!J`ZGQC1H@siSXMIq1 z#h&@6Vv-Qmj`gqU-yZ8#`TCXq&=1GEF;g{?R)0L7#X&lwAN0&yJx4UPDQxR^)6H-; z?=YTZoSCDd&-a4;q<0$*5dEV6r+55FoFMYm_;_FE=(cijvhfyt-xYGNXP1b{0QjRI z4osE&@zHY5rsyew-Gf%u=i$sxzLoc|iIu0a*F9y*)NiP5Hv3eY9+8OMXof|vMI}NcS`atN+)>d=wfv&p;idNJYvrONhe)6~E zY=Kw240*|Aa<=T8UfU0=?PDC8Wd+7dXkmkvcJN3s$GLksuVoeM^JoDuh0QAZJc2RU z$z(l(p!Q=rQp=c&UpJ=Hu$}}QfxiSSr=I1Mb2)jJx=eA?2Kg!EwKl;&YZ?qqlKHR6 zQLmLXAL~`mW$p7T`!mHm>TjmhPRBpFuSfm}s3f&{7aPy-F^^$GV%X(%ap{}+3|SZN z`qF2^<@bklekBM6Q{hhzbGqn8N%_ZA*F8aX>Xsg1*_A(8^i)UwtmuecjI+ z^0{s<=o#LSxVcDw&+LuqvD#?a&C&aOTjH-c?|^E@YMxb$h^8aPG$Q>E=8e#pVb>q( z)~JuXQ1``VzUbtktAe&tUYW(*>p@^c-EN4Bx%Xmg2HjcyUIbpPU)i4q3^JG3x)-q4Fh;`l# ztW?yoYio<46J&W7Nj1{#fYjHtF?Y0U$ukSr$5~vpcrkl|<8`|sN35|Y-&1lLsy@@c zr8=5q5U*m@x|ki=?!|f)&iQr(d*S?J%y#uIFpt^VC97yv_0!W&g(2+g4;fnGaiy=G zeC%?As^n25=598#aa*brwb9YJhS!s8c$u~8{m`Lb1~;u#m8;LEx_fF8-_23DAt>B1 zFV*LRZpr(=ct*3U)(g##g>jo!x2_*Jotjge%6hWew=L4*UBpbLyzx&zK zWyDub?z6cotMb|G1HE&uEw`mwFl7NRq#3h#%=Nx$_g-`k?y#B3#qH51V7xo(-O*)q zN3S{u+z$2dP6LCf>w8?i`nsxDFYX;}Ppf-J_m0c(j>C|^)TKyY&F@#(hDEC6TBOjK z!o&t+_jJ3e-W_8GbXs@p-k3X5&r7etrRmY`>J!O#6({Zp3PsFDe5FtA-+{H#$~U%a z$dOU!j4aL>xk@j0FZ9b$bg1=m$$pHb*X17B{LL=`8-m?_D%*NDX9kDq>VB?Xedo<5 ztq;_NHx}hpU{BLHDgBQ#7jq&O!AUPWfcaJWa`hW2p6T^I$hYl>X$Qk0O(ht;%cw9F zk6{7~Wm)uRnDodeJZu~6W6g?9&ST);k}_7y9^+hVD=8@Fp0e*6Ki7M}lo$$tzm2bS zq<4&|6t*9qef*vII-;-fw?-|QT~^k=IusAX6mPi)M|zi%`q#88^8WOY{&c^++l+0O z={);BxF=8S_krIB>&PZs=6&!W#DkVDQXUU3u;Ej{7d@4W8R>C8_`f_7|``u6NcOQiM%kAwd^T%0e!78$4FN3%EgK{&nwwS|3 zw(MOo)tp)6%%bHmi|kH|IxzXvUF_z-dW*Aoa6Z0L^+6@MFC7i)iMJnT@D^2n{53?; z_j+}-%gd--U+Z^Sw&m-3L>&@QmuV-~`5Df{E#X(b%38mAOT6dv6S~`d+HwB0BYZME-oDdVU4nSK16LG2=7e zyS90Gwrrh&W$GnjM_nA3Zcyw#mNwphyys)9k&pc-4+W}050Lzs`Vs7x{?mD2j@tKm zrJs9J>pUFjr%p7HfxqkG!PdD1@4y|b3*-|L<%5bVwQLuEI` z^~Z+kkNw}^E!io48hquRzK3&jtQ?8$bn*FJJr6(swT^_pkJo&p?_TTp`2D0;WwRZx z3*KDf$dj*@|765tn8j|xn9FnYdEST07fuJq<6rgIXJV>RKc-FDh7<9~AEBOntDi8GD{_tdugCkqL;AqW^L}>% zn-t4*6tqt}{YzQ2qo9lJOIWV8TFzSE|EXoOMoiPTiIiT|kV42SBU=J1;QP|v z@_1cyzLtm`5b`RL0_4(fGQ@zNlls+qivyYXvpoZSti#F>`K+vt&^?%b^g&L49q zMQbUzS{3ZKdPTNIn#cA+}Cvc*9oEJi8k86ZVeHX10yOZ`!wq#_P@@cR`y~ zF|+Gdb@kEaI{T{oVG`V}%B^a4J!H82i7I77D<{A2kA$`(ZCf^0TVqVq8Te6=>EDXD z<}n{D+D1j*SzPU3!+aT8hH0UW^a^kF8^G?ie=X+i>wDw0q2k311rp4g15j#1a+~5!WPhM~m9wR$|O-s&Tum4%NhV0!zW>sD7TThl3S`?wvvAX^)2^QzoRc^A7{ zOARKfr~A)Q&)7H~*B_D5lV(L>``BCx-Gmdx4l+g9a#nTl{As8* z&|Yl zK34xG`q;CL7M;oezrAy9ZsSPSG(S(o{0Dq99Wl$bC{m&v4m)H?w&@*PI+8}(*ztse zqNt0_+aXBXJimVPsYJ4>&<&uf(Vze_Lm`O-n&>8wotHP?eDlRfs|e+R_-bj6YBu7(z|&h z)LEc#AH`!FUUhf3#IDq`%Hw`XzMAsIr*(wOv(EGtoq>M+7~*2=kI9(Yebi;1ZJb}c z5%>V*ig)JM(n#4nbAFGd=S=UC{~b2M!K>JpxJwO`Yv^eQNAF>fbJ!Oif4jur#aSuU zQ4O})v=y!`SMl5k-IKO@AMQ%Mtqv0{2<^$~>sa-zl{gki2an!oREKbjn+NymJ1*lF zQON1v;!+<)_V0eNyPx5{YI3ocmGM{F$Dxx$tx?_?p2Ty&2l_sR>#7ZIsx=aMYnc6t za!;Q?^9lVksaiE#x|w#vwp#3_oQL3cb5nI+`D9C@pDMiGtw7q`ZrpA*M=I>@Zx*2v zev{+WcF4Bf-?-hRYNyjD0iO$kW2&P}*~iJi9FMe_dU$!|oud@F%wI3vB)!|h{4L!Y zU5@&vXH2gv>Z3PNwbH9_gtZIu(bqgb`8hblJ^8nkDdkMzo52*`5nQvzBb8z455*_q z73s0iEi?q+si07rqnAwCOzUeartTSs6;7O!eKhV|Of%>mE2dD363s@p04%n8lj;QJ7owiU#3-X6&rbtlQ)C zl@I0dci}bBocB(hc3JQV^DxwZ3ZK~rd6m?6sHfr6{E$6v`UiI;R>4s4{5kJk`v%Hx z{o--IWfREbk5BSvsJX+~x>vR7N2?_FXw#6SRqTfle~624`hHn^B@ydLzCUmEWK>%J z2zmCqa<*q?&vqKXuj`Q+FyYwuVhiWqv+oLL==0P^qrBXt6gVIOzDR zPzfoT0%F2M5q$)9gO+3SHV4|=8S0v9W@q!(tm9QdeYHTHK%~A~9H|}uxS0wJ^LK98 zsriT07>Aie`dOOLc#g({^^dn&C7@>=D4iRb5QUrDFp>mtqj zC*jILc+gCNJ7>D|Xx5`T2m-{v>|v(TL6dxVg;DB`7dUiqB;a`Q^V1ZGRO$X$&IPC9 zaP+FG*<$BUe?Q*6xKWpiH}X>R-}B$X6#P=&eMO5tMU}8>^*4-eFcoYzeb3YPnCIeg zr{NRE2GV0tr2i;r&j-=VQ~Mao=gU{B0}Q7lTKgBl7uQVkMFl;S?+-^B`9pcl*CYFV zC1(JEBGXkSX*Y!MkH+h;wT)NZOBkcB<<-PfyYi>hzp33${^aAfduj=0nBZ6q#U9>>9nl*qw?CT{(sQQyZSLvZvvu)o z{|s3)^&xZkWYm0}zRTvF(4qo+_U_%dCv?Wk>eL++({Pq@ zzn8wED?fvGTB=6Vg0@mk|lFshTa-`4)K_V=~FeR8zY zSon4Gx_6~^sMTst{aPOJQ>Ke^YYqap3lB8U9QLYVE#%v?v?-p8PoB+Lu-RSj^W_z^ z=Z)R+#;zVxnb2;9ZiW4Hn^irdHcsoNV7EfI!al5U(xlvTL0%Pe!#=T8`o8CD_IRG} z*%r^bd8S-NYFDzPcalfH5R^~%Lg=gk?1c3D@(OrYUTbgdPr;qR582*i=WwjA3)VNu zR>mKPb+RFx0l27_Vl{lH7IH^w3^eSvEA+*!e())gX%&ERmfB}X^!;D1I<-%H1YOsm z@JIOHY;9+R(`^+aAUfQl0)Z%3)2>_fFEAO-Ug7W zxAMxWR`}D}Q(?J29({U8;WK5&u;J>|eb}kjeYbmlg<7xNZni>x?{?Gw{W}eb*SmJP zu=bzDZkYGA>qaAlT^ww)wddd`5u?t;!k)?VObOd_=85ivSh-oT)q$vXdbLxi8J#w+ z*!{#htzTjKe;2MKk9_=elRH}<-SnE$4yI26&_9`vpB8Qm@Ky|XFUHQ z?>M}mU!-CogIHvhWZ6nvSNbMoS!m?*UV66WlfBD2*{eF1H7Xk=89(Ti;$t@3%Ot=% zVgBVi7Cwr19!SoQ671lrQqW^P?_Z92qw7IwnI2{j7Zqq}-QbouUq!cS@wbj+1O9#y zFo*9X3ZDp1*lJWZSE`amIdej74gSPl$W6!9SM3=+ZhfSEK^{BKZ|3{_)t(B1V$+tx zwQt1!OJ^?WR9uGbu3VM#D!TA0CRvp+;lWLaNV?%8YL>&Dxtz+EC#otM@`c!2saNyb z_NLahr5J5HHoG;7kL5mVay6^DS+2u4tuyX=lebw_&AJ4ZFHG((v|H}BTdw2{sZwit zXOauJQtD#*@NxIibmdC=Vt-1EX9jN8#w7HOly`ftf~oDy%H?Ie&FkOp1!deC3?;q) zbL841vnxTD>;EmXcGGAYmavWV9bfgZ21J|5QFg2n( z6+8j*&s-H?L%LLdhCbC<0cLV4v0XK5269E9L*!%+r9ZPP|FicOU3@0V$p-j(U;e;W z;rC!K-XJ-js_UW*brCew!LgNJ$*a=EROY6mGJT>l;~tNkZ9`C)Nmw6IS*PmC71O}- z*oCOC{Y1{drwrn^IOT$P7Ppr!_VRP+A@%8@?ghI+H?0)8OQ(Qg*X@hfcqf0=jx@82 z$E=Ij!EWEkm7{<0Jot;Z^2m{3z@Wst;+e2KJkz;&EM7CO7HhELbjNy}gwK6*^BO-N zb?ESEzm2YRAXl;%ydugScIWZ+_;1Y?hL7?)@LrsYU%ix9!IP@5Ex97U833oqeX!?< z0$FyapNjhrsH65>ON>iu7|ab_~|}55fM*x6CyCkmE9?8(dZ~=GGvA zb(V)h`F4f&gj?S2%Jvpzc}%Mjm&<3?-16M=$gIYrC~UzRpQl|mw>+OXYS!FZO)Spm z>7JwV?ymd1+vM{mvsF`EHmxA=ea58$?Erx|omgW~3D@k3b4vJq#nLh2bxfR=kz9+{G1@DAsaUj3NAY>+y4F==uM6SiR zp;Lv-s}$6qKEK9OL#FQq-o2}NN3JPh0_?T+A6$V6b3Fx#npv*sgd z&11H?DY3fVqjKKq>Yf|o7tiGnT+|Q2_gNqLsa&JpAL|vK(E4(zH~dWQ_`EAO?guw~ zwpb#@8?lbZAs&@>clx)n+NxQxNVl=_nF^~H@dm5Gg6Z3j)$R!{voYS+rn=*X_#XDo zm1c62{g=LuG9TQVEkf0}e{ZJh2<7-nnWd!>Q#qn~FRx4doE>q?tBU5U<(UEeIkZ;E zC+rG7_ZlPk)p=`-#o{kpQfYww-L07Lb^PUK;xCJ;W|iCQ)vQ;u%Z$0)4^vQXrEaBt zSn0H=ZO@SzJe1zpZvperyvd%6XbTD)u2b(Sz2g-+41{Nb;jwuo;{D1@;Bh9?VYN4z zTV`8##jdDJ__wt0>*_8ySKVb(ETOg*n9T#w8KQ?$3xVr`i!gohB-BROCR4-17QNi^ z>eP@Dy_WQD$k7p>bzBBySF3@#e(Y>4!@CD@f^qdYCgWNc){h#0oZoSp2F6{<;Z<9? zTstzI-X5Rox0$nejB6RVmcgQS=}ktRKS+geE}33D;*rEs9!sNL%1hy>KxI# znTTGrm-EmMpmU_1|2m7({d;avzJG5#B3q;$*APb`M>%r#Oq-`73)GFE<+z*ss+;Po zCeL9QDyHa$9`}RzvO}>lo&UGkr+culs?yl!6>Kfn=jQN6>Y|`-5b`MKQPBL6-3gN> zZtS>rUuE`GUaPvVy7|7Uk0`h;Yz`{Ga=wvUmRlA$e4J~Y%(W=lkSuIEZ;+$_AxAfvOA(%o~2tWJR16j<2Z#q3C9|Ld{)PaNj>#j<;tzG zo5WP8t7oIQ?dsX6SpFi`aGiU}$F1Ga-0{at?}F=9&AtwO>QUF|~ktCm2d8(n}VRvs+!gvvj`GGO*RDN!n)xcco{JF2XNzU(*e} zkjQf)O2X3~ZSP!t5vHKa`wYz)sy2H}C%Vvo@EK@6nbnw2?R$T`?nKG=GQ~cZVtnQH zm+$)7mG|_W*w-RA{n$C2ciDw^`ICG);7cgcVE^pqM!^Br&w=n~FXi8%@Vtp>NAf5t zTV@@11FyS=W4W6!axcer?`((`0D9^ufWm)k`Ylv!ev<3q>R^cTfAgpkRdqH59muQc z?~XbJYW+O&r+fv|mu+Ro^6!)IuJG8UaNRk|?W~KPP0Glo$Heyd*&ZpkLWNxJsXS8F zX4Twl_=r`Bl+!0yew3^X-K#chx)(efdx=Z4{@I-^-o2(?1KAhqUF?v^)xFw}_j!f? zto?oMZ{qhqt$Js7+XBf`b@cL@a<+9@25+{6UA+$Wb|^7xeeIRl7kY45;HKD{+tISv zQF{exc#!hWh=Ym`@%fUgY4q9`4`yiEtRt|YWBL1Dewz7)*OKLs*T8Q>^N-0t+wi2! z?sCS6Wot)bU&rE6ZO1F$ZG;@{SiVvVWG?GbIH$&uSxPndX|4{9LCxB15=+_X`pSp$ zyzYj?-d%4?-&?TW@586uucjNeM9lgn5&7Lr27wPgF5y^;9XY*8+7Cwnm53E%4^| zNhV>C!w|EMzkNzg!(raD9U{q3KQlcAVF-i}Ap=NbSY%`PfMux&yiQAdz81W2v)_8Bk`7B-dEPY#( zG7hK@O07xrGWd3T@~PrUb33(XtTVhm+HSKeM-v^f4s7dKI)Z$kzur@s83C^X^&PI2 zaH`A#vGU6`JG)!gGFaFB;HzrpCUPF<6ZuTZAF#0|CX!lGIj>+>UJLD>Be60z(rpOW z&d%ai^XaVyl~!gSx?9a_`FzjBf2faHq~+via_i}0J=cjtpl+jcHRaipchGK62d#8R zt7gb3J`;n$Bz_;ug0v3Y37ABUrc#PYjCYS*uk~Ew_2sCNfKxb-cO8{0Ro#vglX*t! zez}WZ?*Cr68|v0_rhNQ7$JJV1%RNV3`6_(&ALU=G8P&96 zk=^IpGrMtk`nM#I-cQ$Wb)$pxuZKrtBR3xeaX`i*(dDUw8DA>VUIof77*tUdTMY&Fp*VVVDuAV-% zrj~&A%=pHK=fTdH9E#K5cf_AzYxgR8tJ-6*jzpW~#qJjqY@pEla&EM6@(H$b&t)Ak zJ$LGxeQ(pbc#g$P2t5~DQAQRKh$;H_0S7*i@2u;D*1+te(of919C~PVDvoWo_EfqL zOr@O_bXQMDbtoDEmtvI{@>67i&m^`E%5n*P$Ez}4ue3Qy=G@-d*uKDE8!C z-tuVM?CRPpI{MqEFC&|oJ%PJD>a(GZQd)Js46*H<%n9b3PqYFgl4G0vCA#tHz6@7V zre6Veg2kOkr{+Rz{yXvO%%l&+YIC)n^r$oksNtem?nhL%Gs1j{+$guoPhpk15qR6@ zC&l|el{?7wxXHq8f@4ztR_gQAx>UQf)a!YDaQjdYX7Pv+bQaOILFzV~fqkG|C;xdyT(~U4uJP zF|yGbp0Gzu&&YCKLAnu|7_=vrgT7Q$e~MqF_qRn!CS|a$Ew?Vu_a%$z-@5LLbumHX zzRP`A-`2GgdQFa19Judl^<8y3W7AZ{HU$q;Zmwrxj*GR$$v$muTe5w6=pHrQ*5xWkVc3pP(AYgE0eU6eiO45w8 z*Jp>i{lx1IuRGfEy>>0a|07ky`G^5Y=OOKSrqLKaC2Zk?z%4_G2xduogw-88Qu{s# z6|j3mx5RQwTr7(m3=kf9cLwhhv3J#K>W{-4U(-AEeRk-lvBGnX_;>P|;?;Cp>zm-! zOrOv^noh;kO_;(fIt|>Abe!4%}|_$H&ShPj(w zLGzW?<&5m&tULQa*j>yXy_F2u?Rc5(7*5^Y3bue+@np+`0R>zBAn?^;`sr*I-Iz0B zL#5dS*4E@um2;wubFSBvW*$CoxVU-4em$w`C2mzrQO~wOvreGQ3=p>bKXs{3Pi z!s?{ITcf`3`14K0pZn@-+>^cr)6iRj@0B8ZZdEtis(z4s=jYHhqiWcfd`9ORnA+oO zP?DFD`JYKfOpedALDYDl#%TK~t21e>0##@IDXXQ+?Q3byBL9MwgI?qoEH zWUTaZM!Q!PU8;)fRG!645`$}cz>nolIg-EJD=z|fVPEbe)gxpgg-ni_?ZW~c37FG^ zQDq%}Zrv-=j(bV_%g*kJO?Y<33?>LVx;qy^iNsV2=Gh~Se_kziK!4d8TVg#sbE}#> zMbm$8>w)BE+S|HYToZ7QqC&!*%5)DMk*HWiX7f?feMuWn@833RMRu2*A;ct zo3CGb6^?v#K|UVJr^?&}{w@7PQcK~vc-(2wfWs%I$83nDD6U6Fb~buVi_6Skt6pa9 zb~)==HSNN7p!nWt^Ci4Tt5oAgn_9H(X(i&e2lvGB6*9aoahGXDkGpw={*CjPq(Z1y z2(Gt3#fIJf-2RC1T90;D%$uZe*sP5ohx(WP6X%TI<=LN3IMUk!X)cenZF!wzem9jH zP>RPyE1PX|Y#OQKYP!vJ_ZzELV=Ttcsm;|)GCJSsX8N@HJWji@p2v9}*GC>#Z-2@x zcl&eu>%;!~X3p7c!gqpH(GxKQStn(ECUG*tyLx*sugi9}0uyCRIuNDo^x2$%d`p~J zt?!6iPJQ(2wX_;9HQUnCIaIT==h9<)CtcfD@;@8}rUf^}W6~?NS=jtopC0_r+TYjy zCjIL#1;w%rw4e*@|I^9L>(C&$E=xr1iLDUj$`ZRHeSR!5oy49!gI#W0`dUr=<*U)T zCwF_l7HijuYoDC{p;O0Uc`a|Y5AO4)I z#JN7(Q)L_!+DrYMR}(k8ngC@br$MEJ&G*cO#l78NhvP@2&$rEBu1g#xntJ!uyRUt8 zUu(Pn%#Qi=ShMDF7JD~L*|bkmwI}9i;TLKK^HRL$P`2{mEuRME8Y)ojSn(KBV@#x= zL^J-p_5OE4FXN8zJm-zfX)n!s4Y~HFtIGD_msSloye>Ot4$bWt{o^(t?CQvP#CcSX z#`DoWGS>THOJ5DAVbUD&hD?w6#QAMkwz{6FUs%>KAZoCre@YJWK4|R0Vu~9Fe2c-d zC?Q{$?XV}_ZD(2*=WJ8s*Nrok(Vn8lu0ax;*^qaKy*sQEw@m~*M;WKtp{j|x0^fBo zJEwU|MKW$@S8r3$ZtC6|y<_)>w`W4P>EEWS0X2^=^M`jODx=`yaoLslz&P{%95(lt z;L|AX4@W$dMcE-d2NVlDE_+;V+F^Z9551L|p7LzIJsOqg(v#7-n4!#G{8PS$vG-NW z)DhbRbgLa(JmPLMrjhJ5;#Z%qeJy>QT8@`qbL#1HPNAzmc2S{P1YT?krH&YntC@S3 zxoelXR5vJBXdYK=#@hG7yrlM~Q*UCu<~xEI&xifJ4t$|w@t4PfCHIFN=dbJju8Y5G z>+`nlnW7Iz4cgqoS-Yo7ZK<3)o%YV!ufX?I`Bs>eZ&PQ#KZ{M*Z(FPNh;GH#Ia9uB z$fJ2-DjlYU*kh)30})fTd7F>7MQe7k6)7dc@5ICBMH zKd18epJI1+wK**%hU zmc+Uo+;OhU#(tGmt4XiN4(W|3C#yV8yCu#y6R~QRI7zX-8O@)H$D^NdC|-w7di*Yr zv$mT96wh~aIQylI{nE6q)Q0GXj31Fczagj#IP?d>Q`pPQ9L42T^xYJztKlbj#^~rV zHhLh|)W(kiVdELBGPOd!e-`>1{H$Sd9QlKwd~fBk^k~Zsbw4lcz|!gB7jljZxq`O= zMa1qu1`Jz~MZ@6inDw?YGgD4gy9BRymNr_WSTPSD60RgK(C!@aVbR z|CjO;pk(|;137oZM<-p8_p`h7vlVUb`(D_o(E5s>=MVDf9|p@f6ARf`do30~7w45& zGVCyVJ*w}uE_Vwtf=9}+?LQi?gVpgGd!xJWP`=;reS~uNcG*X`2(Mbh0ZYAVRN2|M z>Zs&Q8vLeCUg7J{g7-@EhPY8WTBtEAnXBp7qq_I%Vsm};fx!^rr4lW{ek`i%zK~6+ zw@agXnQGy#oaYbmZA41^4RQKB_%~O`BrgDiTb60z#oHGu`~BLNTh@5SuXpsaS=RM2 zQb7!L!(};(5X>uASo3+}o7zF1gcmk9`OeRd#ul07yju}h-4<`pEaxO!9LElGv^xK; z4Wro!U6ZXUU0}7lBk_dCfaN{le0Mpb`E30pywLxvbm{nwv{OZI>uJLhSdIj0$6)s zpHeaMrQG+E`o6GT(BN~fU|x&+9B{w6-y$kq`oSpm*XT!1+6O@lzLYr>Vzv26SDkk5 z>!ey{QTD9N!}9$mv!lL6d%7Y~_v1T>{bw@Cl;(hBojl4>@EWM5hmsS|s&hl}|`n8`LEemvauu@vAa=zK|e2c?NbJ4?Y?3iGoR zutlcfYg9bk7M-QA7~BPppwHdej3Ug4$AT{Seq+N}+GF$!LC9hs_et21XgNXt9g1#f zR-X#@gx92R{hj=ODYZ5o>d1+{7b0}cCU^IW?iCkfi6A*UVvnWuv|FNE;^Hh(JJoKB zPo+2G@tG*fPGaqWTxWbHQ@me+GP+lEuecbmsJtDYIJu7QD|a!uy|T~qy)>&d{j>;6 zydPLN;Nl*gJv!(21`LJki_U6^OthEtW<5T8d|r%K-1JN_U|Sxa$LFQ5+bd#;4=NO6 z+$XwET!c?#)(Ts!(fn}6_LsuRQ;w}pwH*lZpw`;5Cd>cZyV<;*nYIx??{7p+n5V$Scq{NerF5T-U0p*jID6jXzbB(tUE zTz@tbu$$#5c%sAXHGPV-%M|G|=?(Wc)4Ubb7;5~I=X|#(=R<*2r%3d^pT0$V{OC5H zq#g+s;Zh86_T-UoQM|od6vu6Dx`m>t@LrfS2SHmnwd^)qy&t0I-3q+AM4L)^NiW%g0s zWmS4_i}hWwvTCL|YprWspT>RHa_L$w(z;Z`twvA5t;>B^Y2LLHW`k>VDQm6E^R9@O zEh8&svA#?B%6+Sedsgpx*Sge-Xap`YGP>_tcHafAa4J=};tO1DiT;XO&Su5#qS+my zsM?2ypY@Ae&1ZG^ncdWUsQYw3c{%HMwl$fW&v8%*1j9mYIpVWuE>BYTc_q)G&&*G4 z%AHZ(K{7pNy}lHu%MmX}xVj-+UAz@4Dz4wt?1Z@*WH&WPa+*KIL)f6ANkH*+YIhJc<%@A+?0(048os{f@59_)PFllN0CIQ=etm(5Ohr29#Y@I^&u$u+2MrUn(Z z!k&37N4*1H;g_+Up*)guoZ5dX_YY=m+hS>T6=}`^dM%cHCVqxI;k{f%b9Y}~%%J>C zp3im5=PZ)G2%p&RWAT$u@%PO4o1NSbiV`)*#kXP^=kf>Jy$pL;a;-0Rvs}n?YT4)V zo$ii>UA7@sPPe+WYc#pj?RL`5PPnTzbJ$z^ORVHuu@^RtwQp8N5lppj%5hWt(dm^+ zb~9Vv80ly~6q_XD@rshk(eb&sX?-KTcTeS$T%Jvh?XjuPh-UfI{bCN8N3_*tM=#!< z9(aZns@HC{`|9~8%aAmuK9|Us<}uGgKEwWDym33yuvN{g&(F~o3q4mNk6g}(7A>av z$x)jDo)_Nr6u zo9CJp;j%_ZWjiQJIDHBOf0rJeTbj)-ss{OH#~mTW0Puu-M-f{|PDWdB)~9w?W_NsS zn^F3TpG)s0?#*nn64T$5jl`-1}bicU<;=JVMR)2(XNGW|62^=DNzN@laIN||2fqn=A8@=p4G zxut%X6^h*g%P2qpzvVVO6pM4QqQmw??fY?}^uf`LbPsyFL~R#)`4>7lF68FShkg z{wg|6?hX!lSj=3oSZY6KY(i(*;ZbT?c71uJ2Z7B{zMap#l5hFJ1E}{|EMpH27M`m{ zmC5;`&JV>t6;W)j2=HN%KW-TsSQpzKw<~mC-P&%dwOOb8QHacB{job~kL9@*C>#oZ zW>3Z=E$?-wQwrm+{ZU^1T-c?c^;%=3y-{-bpX5r($jIFIzj@R*6&d|w$@J`u>2>`} z9)BBZhUV*+UWMcPU25lOe@xM$ZFLYTx)Z5JPeXS+9`SRq1+&EM5Jm4xG%ZE(o1d+- zE^Y(sB3jVvaQ`0&qlal#Rb?}Kx+4)%^Rn`ucj`lO-==k8K6wR-L0|BV{C^@fCZ6p; zX0ZlRZTf`SzTENf(~TALy?j3BYqyQHXi>O6GV4bA8a3d_)|vq*B9NT(Wsgdc=lIhQiI?7sU*s?eMC{!9Fjz zyfqVjvl#@&M#_0g-^mr6NmY?zF+{lLbVGS!o+xZfw%qWYGDVN& zD`oY;FnuKV0Q@?<_$(yuN3l$po>Ak@e3_~X=_?<~^UB#{%g#6^w-L_b6~H_dz%+ZB z`BdhP9||fq6pileAv7sucYh>V}=-?&@p>HbqHP*CW-cU6)!? zH9F2m-J@wdJ<|mlCRn4RYN}&34`a_PXC6G4d9ycyAiTdqa&?bI&GfvZ8#jISVLDnC z^Luh;&5)LoQK)r|5ASr>ce?BR7jvN~ zhSuz?pY6ZYbIroi=`m@BdnQrwT)Y@;F^`NlBQj!HbZPok4fVVVTp0$Q&Qz=ldX7>% zcRBMPC0o0gK_UjaU%KwOvDLGz*k3l4jhv(UGW24O1nopa=rHKQpp;@qTW3ZiVU2G4 z>_})Cxih1|QcUG(75&$T&=o_2Q?08x(-t3R?(H(NSg;^b@yS{Su| ztjlv6B80|=Qk|djiZMN7dR>u;-RuUGUWIe_yKwgnk)Oqx{y}V$`I4dhf8N@mX1_DB z*O}9f!lu{ic{Zb@XHMaT3Qzlo8APyrXc_vcgo+QL&vPQMd&mi5V#@ zW@=7Vy46>+Sz5dXkK{jP85O!`^bwqi=sRM|R9JGq26y_8P#s`>s>5uyrTfqw^L5K= zv#h$F)qO$Dbena#Zujhr-ZQTpfmp@fL9HEW2JgL3&$?!1UA2~FYK!H$)NBvsY{ki3 zjN9O?c0zt$j^@v{sGN82dlGNz6wz!!xbFiq2LdvQuk?m zJeJN7nlH1Cn2bT#)OPu9DDUc|jGyI1M6r%pJ-`0@hSsl)s+`+FmFb?;kEL87*AjCr zu{tfW<*{|tK^LLjgL>bY_Y=PQ|ydN5?d~C$ZM(PBf2CxfL5S1%*=2g?Kdl zRqR&ijC;9uP+La(RCb=yc{`h_S^F>fo!-hd;4KD$(R?94HIVH3nd}N0$m1vSuTFKq z!sqM#kZY@M?y-2^!CE{YKk-3cfq7N@GLx&yFyU3vOd^9Hy2`D*KX1fJ>bA@`ZEAY% z+C09*26Zl{9POEO7dUI3iuAVYeEckyel8vX9%YH&WM?z^-S4f;b+Ssh0w9v5m6UtP z+p~+bZ)yyv%8vc#HA&5q=B-Q_cl!LpoPq5kX)?Gv!>^1hDS zncG>u=?|1f(RxD`Cv7RxNNhEUZ*O*vM3WrYV%s5&5d~O z=f3dM`NEwr1$S36Lhp)rS7dy8FZwuCiVi~82xZXN|9vTszL#u9|F;PMlwaYEoL;eE z(AZ&@R=-LY&dB03X?l;FisRK+x@vVbmF{d*Pj!19iRCLp6+YmLwf`1-htrCt760xP zF;~%9ByX+R`Q|!5i|kydKCfTY<=!aPmLtrLx;W~RR#Zyf=0r(34Civ68qDYtzya4A3UL%`173vSlF;hdeFb$bZVFg3mR%T~qG zM}pX)->w+yBbjjozvCJW~bbXq4cN|`tQQ|k0!*xwmkr~@y|L^X&n44#7&K(L`+i+;8=8>weQ8&6y0&P z;YtFMkJKv(G%cvBmB9j8jFml&9)|68>$p;U;Wk` z7BR_<7avhom7AWGV``46jbmyrf)_FN(G%GeptYO!Mbqzg#mm6T&`sq>q9%C}_`nuX znSP}%085)}X*=Q%*?&j1_fmWp$~r^Q&LM~4UKq$DXbDk6s)`P09RyuV9vR4YsOAjh zSk=3PlWZzH1Nlibh?o_66RvI`zYz*O7vc4&I^W6BoQ>ClCvqy!@p|WySD=|W5S9tg zTb*j>dMb}w<;-vMnY>fcH`^KZ z<#l*fe)qTGmH#anhR?~?%*j5N_iiYk<6cmCB5w1U?#t(e739yh<%K(;1A$_|WE=iM zj=|a$vG7T5x6tdfP-e}jkr%_ipX$wQuCkioS0;3TXaQGurfibxd%6OfdI`^}Z5IWWxJ8 z8OUl0U_QiLQ#-}dhHh7D|5^L{+TT8T&M?1Sncg^fU}+pqJHqYuu@Nd|tB!X?g%Te} zu6G$~=40_$+Ak^hP}JV`il2)I)J&EySbR5RH~j!*P_uU7SOep}lLJy_59 zK8g)CvGi}mD&LEzX^z3etQy24lM%z4E9)p`Pug&t*=3a*k?oj*+csqy;ZZQo$kfJd&ea*I@Rw1C zY<`=%FSP@;X}K2iY@3SqgEg6DjayN@htf0W^+DQsbHDUy{1Q8D>1dQkz}YsGXIzf7 zb@^n;Dioh=&c)nRZw8OxUPTx8rDW%4g1G)58UA7Df`H|22(mj|`&J&Ir~SJ;_g4Iv z9=U$y(KM4M$4}AS6fa@F+ll-c`EUyYwtKU@9Yo@)*eARd*&~^IeMPU4DHPJkC{yU}T zOe6UJmKq3V$?;Wfl6ySkA*(-x3F31*KM1Z=KescUnOVkWOm(~}JMcigP9$F&UUAs- zPg1Ru?x)V~luu58ZM+|Gh(Owo1%Epcueu(ho#|lBSy5%wV zq;k`Jf8~g~`553Mh*X1wEY5Okaqp6e26$3b2|B}&vOd~4=j$?Sb0WHMOjXS0 zJ)yM}Rpaz((mOS0j(E?%OV1x}(uFWHbUxs%c+Bxf(s$fgaCbu7ty89cadoEr6`zTZ z-4h06lNIt^;C0}s&&1~rL_hmNu9Kk)8BFoj+OOw(xi0j$bT&ur z)zv=g)jqn}m+p0uf`(t^O**&7(Bk>%}Sn+wxigG`SPb1eHg#Xic_b9L}kL6X!9tOgl z<26wT8E1t%L$Vt~vfg%#qYLY#bS~7b=VqewIa)>jjM#+=^3}63# z7 ztGVsmo*k(gn1iUn%iL;K&ua2~rYyfvg(1&xJiqB;Jv#v{b?b5Kp?8MD`MIDqU_VW6 z#Y;KjETBi)vumrj9)$e@HJdCZ@h24HGF{_brTt%mXPH9(G_=6>YwK$%f_EwzH<&y1 z^H-y77Iv2A5#VbV$=Muzsz;ytu&Xelk-cdi;*LmHby=N3fu#R#inn{() zhV*XPLrev;F1(v&wna?)Nqjg{Esy0d|2L1S;Zmn(Os`9^7tYsw{nD#&-_^x;&0~qW z+s7^ONZ4)>|NF-G&=tP2a_&{^-=?+$n{caw#a-*C94lLP zn}X5)heVS1V)t}OZ5Imt_xQ|D5@+HZ(T@^y-bimHvQleNhiPp4>#PrKdf;Sq-!o&+ z?7%?gA9TtEA@%? zKN4?rCjJ&SizEIqrmi9@vJVEymaz3f^pOBz$x>@*rzO7QxkOMTHN`@`zn&1$`Cx>iT>m#P{&!_R#jsbYXG zVMpM%hsDUPvVP;w*`&O4cJ|MU)Oz17a#LXA`{cc=;vI>*H{Erh&CB_Jb9yGWZbtf^yA+0h?~{#d!3zW z!9X|X2vxT%>u=|;BH{${8qyd6N!_&hDJ=j`dkz`%5Bg1j(W{$ zUf^1Iee8+t%LdU1?Y=MOiP#TUawgV=m6=Luxt%n9RD4bMPoLI5DaKIV$IfHeWAPbp z#4En<(Kh01x@~+q+aM#xZ``fmgUyazmg8#Nag>0pVR`$}{bWI#!a7yuk#ZgW*_Py4 z&=2Bw>$y;?hI#g5gZMHcUBBHOxDuBmO)$%)C;2omC$wkL*36GB&!arwejKvT#dHJu zvNYW@U9$ zG(rd3W;)=MZdUOBX8R(|;a!Dba_@K*ISV=ucp-QoJb6_gnBEn9E=PhV#@-n|jBZ-& z`KFkl*(B_F-C9%5?fN#HMRi;*TPAtXJqM>flXKJ2SG97co(|+*KtFi4_PHVIc_)u9 zC2{gZepkmMx>Ow69m6I*jQFSQI^w&Z~`wgS-yUzD>573fa~tJuq9CUowO`hrN_Ki6OqIp4rn~z2djWy3(H=={KCKVRcl138 z)u2|hQ3)dM+ItrA-$iWh^SrrR-mLnC`w|INz2u+r3H>RR4O2bobNYB*t0?BRQ>~C> z3MIZ#ZCZEmcA#4J4(y4w9bav(VfUwQyKA$!yFrzDbAgllK4rb!ObL7w%+MPAw40?V zo?kO*0WTF_`Yu!#N3H1T>+l@g9Np4xo~6M6-U~S*DCX#{yJF&l% z9Q)6ZA(>tvDq1h3UPpm{Cp`aIHaUb%Q^S&(gOY;SGta|RgLalcUDK>A$5YF>5a}y^ z92FGnt&A(Ca_C@qrq(r6tMzy_c6cwS;V@U`c6goDokgY9K^^;#ymVpm ziH_8RSbqwJEE*LxoU*2G;{DE5-c09za!jUcm1=|8q*x8-XP9{Zd|Jb&6hR=VIKP)D zcD~k)XSs-su*@z|2)-+JS%b8c+2uodH?TW;w~CyomuQ>At%>C08ESsFDbqJU9}%DX zp1v)!!5+oCS?T-?qwUb8uc>{VVbq6zS+zJlzoo$&(m8^1g~Zvm<{a*u#AEBj%B%wJ z)5?_BHt%gyCLkqDZSG5+bl5T>UY@D>yuf1ns%d|V z`lG)0#jKrb_?NS3y!*Acb`z%u=+mp#DZ1zBcX@rK$gg(i+4fzEx4o2Z$C-2$eh7Fn zJQ&yrhF&}oKX)GLXWc}%E8m+(%In2;%oqkBUJErQ)Revp%yhO`@JxL5%j~H1H>=_1 znr8zOwln6MPL2|HL5b(j$Iw5d=T+YEnjIm1cDNf_aQkXbCZ}Lz*KC}gZGWDj5i3@Y zPtu1s)9GOTEse8oPhieBGee^yn@^jcIdio6>6f}iJ(lckU-HGkC})6k^hfdxoza~y2Xb1 z^U_$kJL0Y3^qy zLyJ~ld9*BJZO1u+@wowfgwG5tkAlwp=6^%YKFs~k`*N4-eUB>FMtIvY(^AGvkCoi_$6HzysH_M}J`|<9%R@-yk zlXys;)~98q`I6bvbBW0BS}@c!Ys!yx%UX5I(#<%I-e0e#HGUfG3wH7&)hJdre+AJq_z+l-rL_LoHH~v>#hy7s1_Ldu4_Pn!Px0cQv{e z{n!)pEn5{+?4=zHv!KI3_AC1%kJAAjApI+`maop`e?@rS2Jgpfu(^s?L&5M+a3nqYL^vzVm9j%gxAdF_jA6HgJFMBGl0uDxH!z+I#*VsghxjOaoOvz08fuqoaVJO5zK)t>6ro>DZk?e5I+p1fu*#XIkXtqwKy6Wwksdis`D z?6Jv%-jJVy^%^Y(q{aLO7R{ai*@z*`U1&ZaVh5ke@!Zk8j@|>gnuOlR+?C1{-w0=O z`&&-?Q)LshcS`H`6i;-#9Un{lBiGmb|4=-$-UH0F55)J!NDz_K+*>$))dj!G{qLeY zv}ym8XYT1868&aGxN`)Q+Axjmd>`#ZcNvn0467=_6038>y-)q;>##;tj+zd6)e%k<^|Hv32}^HSquI zh^AX&Z$wj{qDR?=c$aUN|3>_=Ptni2+kNpU5;>tNx%ID4YJL->n)yOzbHH1{XWKC* z@5nF9T;X+C-aWyeYc}qAHR9C>oG`jyKgz#vgva$v{-+|)ZkO@R*iuEuicRj*bRWQH z?vHv_TC-`5hL_U*4;>$}|C7-7A)=vTb1Kp8GpR=C1HBK=zgYWkdEB}-)B%d%(N#H? ztzxL2(9M4z`akrhVwdVOIp)pUZ}Kb(mY>OQH4x4ladjY`lJglR$oY6wUz=;BU-i5E zWW?LkD<%p%dR~j3_fd~L5X*DjH|{3a>FURxh?Oc<4_C00b>@340)2upzc2?pAsywKh=X{w#00381Rm! zQoV6`J)$m0MEw*tSU;&+VuRkTSVdLn>*!Y86O;oyq&(+ytnGGSZP#OcI_ZZJYbiT` z>oPR0X^UwGUiS!`3mV5}PZ;9k`-j#gCeP-*Dt8Jz51ejxbcQ_+?q+Oh^}al!oOc-S zX~#pi^*TeK3q#<#taMv^q+97*XI)Db@g^Xbp!TKJ{GxYBk~LzXeNVYkyTqym_LOq- z@o#h_v=`!2iTb`YE9=#pB%2?{*%5@Mu6sMXf^ojz?Z`Rjx4sAB31MHA*E4Q?i&8GS zeOza(PvdZ(_U9Nj9QoCYrOfAoHSbB~NVhw!`O-R7@oVOP|C9`CH{@7M<~)_}bgN2w zv@uzBMm&P8ipm+r2s{zgyUE}_3j6M(e1(=0JehNO#*T4KyA)}Nvs3wJ;Z=LLdT8-? zMvcaNwEFzhwOO{=vvujct$5CLP29N!cC$c!Ds~F#FXoT@Af6F!UTzVlD60Ec%27+# zU3T5&I>acq##;NN2D;m;MwQ_}pg?hk&bQ^QT9rdqYN|DFLPw*?t*~RzOC?etw|c?t zu!V{VyVBlG%%Xk}&w3cLP&Cdq)?SOZg-!iR&Pcx`su`_IjtZZHM`rh4G+$Qro&0ss zQ{XlBMmg`HeD5kE-Ebwd50sDQvms?eGi&5FG~Z0vs`;V$vA#Rvd35Xbrl2mR_EU@Z zIs17P_L22vO)voa?xH#SYE{v@e)1&z6dWs*FiO3YXG%=8jeDNe#DM#=$5~(TCQZB1iA<*9;KZF#Zt$SDpSN!js`WBVpk|v*KwKhoeNK-K4aGPOy>57 za)%P#;Kr5LX3d=o@iiUI?1pBhO0exV5-Vz*kRE216s?0ECi>>(v1)gu@^Lgm3Q`r{ zjgf{eO0+PBP|1BH^*miC{5zjF6CAK5+cZOe6s!U(Lupr8m8Q7#DDXg0-vvn+Bvrj@ zh3b1dua|szRo&xZPQ~|(Ka%<)W!pymX0s@r>Z;*R=Kcn}@tvH%KW}5N=)R_luc@7i z`8J?;X|Khmvc8pj8trMiEbS9nD2F?j$CVoD8Ml4l0ceDvfP_9~Y27v(U2--Lcl+v9 za{XA8MnhL?cq|dUPo3OVtLVlvscyNIc27_mEcZ~Jt=~)qhS_=9BgyAYYna;LXSoNd zy$)n9j@=Ki6w_n!?B19!s29=sEscmNGm5(uf+m;TOif=~O;KK;}UZJTYG--L~m zzow>2$m`39J@r>%#@F;3vrCO>cxMT7`jJ$Tx+m{#<}>owNbhSyCX~OjS;3M@d7{ps z#uxjR65a*8)`2K4f@Xlx!`wd*rADyv#VFn7);)c;VBR~V90^YEk8V3k(x~q|YQp%wAIciD*;feMQghug@xUr^a20 z8>P5II=z=$NFI}3kGx5K%=(xQFsov!D?buUV|>F!ITymZ+2(sbh`r*On8KthuBzj4 zCoZ_jFnGH?@qW%%g(BJJ=wVKo-fU> z(zvJbjGgJ}h6>NNs88nQaK%rG-pO&O(jzjXXnTnzp~~%+belWYO-s_a2RG0*)?iQL z$7yFCossvV!%cRZ{)A!icSluU`9yu2UwRr8RPgz;{m`lSOzlA0E*;S9hjNX(@;}!& zkmu3uK9N`D>wWoS+*Z1!1HpMwY~g&mWryGHLY_h4li!mXlIQSibTA!B=$5Z{LlPcH z+;eQ{X0jc+T7=F%l;_xat#2s6hIASoTO!9i4IX`!yAgLs(|L|9IkwbC#@)p;!3u@x z?j14h%226{BR{KG#douWZO>Zdv-hkeRz};SiA~R1+$y3~nEt1C#JnT62%NBq)hJqM zOx@=5W}DkV?V@Jl)3F>7^lsRQ;%o3bu^h*8`oVHONI&OX{=n-e|4F;-`h9vt`s{}Ek>G{VHv-Er^&Mq-^xcu) zmFWLR(tCp&qRi~S3VLBM3ABU7|8UWU^3w-${oa%RCGh?F?EKERv##B$h=nziOl3R| zx2n~Omr>)X%~OG@8BeEO1L}F`U!(8M{m-;;^jyT$`IN(SV>kWr7h`HZuxdG@X^HVY zo)hjin^068>NoL7_|k9I{w>ol%>k5xG zd2=xQBBqv%KiPgg?%BF|HdtR}`?^py z<`G}Z9f6|d+mUVmTYhifdPP=6MpV+dFk70}uHgOF*ww60*0y85lus8QOOE<(EJws1 zn(?{Z?kuCzYe{`>j={Od`jj3EJy3SelzOa};t|foR>t>T?TYVIWn8AxsW|M&b@?i_ zG9uZVk∨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 Date: Sat, 25 Nov 2023 23:14:01 -0500 Subject: [PATCH 02/73] Starting the process of moving this code to Shared & Client --- .../Nyanotrasen/Lamiae/ClientLamiaeSystem.cs | 24 +++++++++---------- .../Nyanotrasen/Lamiae/LamiaSystem.cs | 10 ++------ .../Objects/Specific/Species/lamia.yml | 16 ++++++++----- 3 files changed, 24 insertions(+), 26 deletions(-) rename {Content.Server => Content.Shared}/Nyanotrasen/Lamiae/LamiaSystem.cs (94%) diff --git a/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs b/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs index 924978dc9df..135d44db1e0 100644 --- a/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs +++ b/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs @@ -5,23 +5,17 @@ using Robust.Client.GameObjects; namespace Content.Client.Nyanotrasen.Lamiae; -public sealed class LamiaSystem : EntitySystem +public sealed class LamiaVisualizerSystem : SharedLamiaSystem { - public override void Initialize() + public void UpdateAppearance(EntityUid uid, LamiaSegmentComponent? lamia = null) { - base.Initialize(); - - SubscribeLocalEvent(OnSegmentSpawned); - } - - public void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, SegmentSpawnedEvent args) - { - component.Lamia = args.Lamia; + if (!Resolve(uid, ref lamia)) + return; if (!TryComp(uid, out var sprite)) return; - if (TryComp(args.Lamia, out var humanoid)) + if (TryComp(lamia, out var humanoid)) { foreach (var marking in humanoid.MarkingSet.GetForwardEnumerator()) { @@ -29,8 +23,14 @@ public void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, Seg continue; var color = marking.MarkingColors[0]; - sprite.LayerSetColor(0, color); + sprite.LayerSetColor("enum.LamiaSegmentVisualLayers.Base", color); } } } } + +public enum LamiaVisualLayers +{ + Base, + Armor, +} diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaSystem.cs similarity index 94% rename from Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs rename to Content.Shared/Nyanotrasen/Lamiae/LamiaSystem.cs index 63837f60e2b..79b913d8d97 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -1,9 +1,7 @@ using Robust.Shared.Physics; using Content.Shared.Damage; using Content.Shared.Humanoid; -using Content.Server.Humanoid; -using Content.Server.Access.Systems; -using Robust.Server.GameObjects; +using Robust.Shared.GameObjects; using Robust.Shared.Prototypes; using Robust.Shared.Containers; using Robust.Shared.Map; @@ -15,11 +13,10 @@ namespace Content.Shared.Nyanotrasen.Lamiae { - public sealed partial class LamiaSystem : EntitySystem + public partial class SharedLamiaSystem : EntitySystem { [Dependency] private readonly SharedJointSystem _jointSystem = default!; [Dependency] private readonly IPrototypeManager _prototypes = default!; - [Dependency] private readonly IdCardSystem _idCardSystem = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; Queue<(LamiaSegmentComponent segment, EntityUid lamia)> _segments = new(); @@ -40,9 +37,6 @@ public override void Update(float frameTime) EnsureComp(segmentUid); EnsureComp(attachedUid); // Hello I hate tests - var ev = new SegmentSpawnedEvent(segment.lamia); - RaiseLocalEvent(segmentUid, ev, false); - if (segment.segment.SegmentNumber == 1) { Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates; diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml index a4408122cc6..f4b5d6fc3b7 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml @@ -29,10 +29,12 @@ description: A tail segment, hopefully attached to a lamia. components: - type: Sprite + sprite: Nyanotrasen/Mobs/Species/lamia.rsi layers: - - map: [0] - sprite: Nyanotrasen/Mobs/Species/lamia.rsi - state: placeholder + - state: placeholder + map: ["enum.LamiaSegmentVisualLayers.Base"] + - map: ["enum.LamiaSegmentVisualLayers.Armor"] + visible: false - type: Clickable - type: Tag tags: @@ -60,10 +62,12 @@ description: The end of a lamia's tail. components: - type: Sprite + sprite: Nyanotrasen/Mobs/Species/lamia.rsi layers: - - map: [0] - sprite: Nyanotrasen/Mobs/Species/lamia.rsi - state: tip + - state: tip + map: ["enum.LamiaSegmentVisualLayers.Base"] + - map: ["enum.LamiaSegmentVisualLayers.Armor"] + visible: false - type: Physics bodyType: KinematicController - type: Fixtures From c647da97d6e4ca01d93ffe8e026eb5977228b1b9 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 26 Nov 2023 02:07:02 -0500 Subject: [PATCH 03/73] Adding lamia unique melee --- .../Nyanotrasen/Entities/Mobs/Species/lamia.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml index 9e67d1b4b1f..92e149be177 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml @@ -200,7 +200,19 @@ range: 0.8 damage: types: - Blunt: 5 + Piercing: 1 + Poison: 2 + Asphyxiation: 2 + ignoreResistances: true + - type: SolutionContainerManager + solutions: + melee: + reagents: + - ReagentId: SpaceDrugs + Quantity: 60 + - type: MeleeChemicalInjector + solution: melee + transferAmount: 3 - type: Pullable - type: DoAfter - type: CreamPied From 30aa81d1521ed4fbf95ade855ce1f2292337ecf4 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 26 Nov 2023 02:09:08 -0500 Subject: [PATCH 04/73] Update lamia.yml --- .../Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml index 92e149be177..7b1fe952e16 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml @@ -196,8 +196,9 @@ - type: AnimationPlayer - type: MeleeWeapon soundHit: - collection: Punch + path: /Audio/Items/hypospray.ogg range: 0.8 + animation: WeaponArcBite damage: types: Piercing: 1 From 6ed9df640b20a58487f1c29afef96f257b20eb59 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 26 Nov 2023 19:46:35 -0500 Subject: [PATCH 05/73] Making a pass at their YAML --- .../Entities/Mobs/Species/lamia.yml | 100 ++++-------------- 1 file changed, 21 insertions(+), 79 deletions(-) diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml index 7b1fe952e16..608f8b9176b 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml @@ -1,10 +1,10 @@ - type: entity save: false name: Lamia - parent: BaseMobHuman + parent: BaseMobHuman #parenting human so I can remove most of these components id: MobLamiaBase abstract: true - description: A miserable pile of scales. + description: A miserable pile of scales. #TODO: Add a better description components: - type: Flashable - type: Polymorphable @@ -16,16 +16,6 @@ baseWalkSpeed : 4 baseSprintSpeed : 6 - type: MovedByPressure - - type: Barotrauma - damage: - types: - Blunt: 0.075 #per second, scales with pressure and other constants. - - type: DamageOnHighSpeedImpact - damage: - types: - Blunt: 5 - soundHit: - path: /Audio/Effects/hit_kick.ogg - type: Hunger - type: Thirst - type: IdExaminable @@ -55,7 +45,7 @@ noRot: true drawdepth: Mobs scale: 1, 1 - layers: + layers: #TODO: manually fix these layers - map: [ "enum.HumanoidVisualLayers.Chest" ] color: "#e8b59b" sprite: Nyanotrasen/Mobs/Species/lamia.rsi @@ -125,47 +115,23 @@ - type: Body template: LamiaTemplate preset: LamiaPreset - - type: AtmosExposed - - type: Flammable - fireSpread: true - canResistFire: true - damage: - types: - Heat: 1 #per second, scales with number of fire 'stacks' - type: Damageable damageContainer: Biological - damageModifierSet: Scale - - type: Temperature - heatDamageThreshold: 400 - coldDamageThreshold: 285 - currentTemperature: 310.15 - specificHeat: 46 - coldDamage: - types: - Cold : 0.2 #per second, scales with temperature & other constants - heatDamage: - types: - Heat : 0.1 #per second, scales with temperature & other constants - - type: LizardAccent + damageModifierSet: Scale #TODO: make a new damage modifier set - type: NoSlip - - type: ThermalRegulator - metabolismHeat: 800 - radiatedHeat: 100 - implicitHeatRegulation: 500 - sweatHeatRegulation: 2000 - shiveringHeatRegulation: 2000 - normalBodyTemperature: 310.15 - thermalRegulationTemperatureThreshold: 25 - type: Internals - type: MobState thresholds: 0: Alive - 100: Critical - 200: Dead - - type: SlowOnDamage - speedModifierThresholds: - 60: 0.7 - 80: 0.5 + 200: Critical #these values aren't final' + 300: Dead #these values aren't final' + - type: SlowOnDamage + speedModifierThresholds: #these values aren't final, adjust accordingly with thresholds above' + 60: 0.9 + 80: 0.8 + 100: 0.7 + 120: 0.6 + 140: 0.5 - type: Appearance visuals: - type: RotationVisualizer @@ -173,7 +139,7 @@ - type: CreamPiedVisualizer state: creampie_human - type: DamageVisuals - thresholds: [ 20, 40, 100 ] + thresholds: [ 60, 120, 200 ] #these values aren't final, adjust accordingly with thresholds above' targetLayers: - "enum.HumanoidVisualLayers.Chest" - "enum.HumanoidVisualLayers.Head" @@ -194,9 +160,9 @@ - type: Climbing - type: Cuffable - type: AnimationPlayer - - type: MeleeWeapon + - type: MeleeWeapon #This damage is most likely final soundHit: - path: /Audio/Items/hypospray.ogg + path: /Audio/Items/hypospray.ogg #this sound is not final, but is a pretty good placeholder so we might keep it range: 0.8 animation: WeaponArcBite damage: @@ -204,25 +170,21 @@ Piercing: 1 Poison: 2 Asphyxiation: 2 - ignoreResistances: true + ignoreResistances: true #We're basically going for a biological hypospray, but ideally I only want the piercing to ignore resistances - type: SolutionContainerManager solutions: melee: reagents: - - ReagentId: SpaceDrugs + - ReagentId: SpaceDrugs #The poison is not final Quantity: 60 - type: MeleeChemicalInjector solution: melee - transferAmount: 3 + transferAmount: 3 #amount to inject is not final - type: Pullable - type: DoAfter - type: CreamPied - type: Stripping - type: Strippable - - type: UserInterface - interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface - type: Puller - type: Fixtures fixtures: # TODO: This needs a second fixture just for mob collisions. @@ -230,7 +192,7 @@ shape: !type:PhysShapeCircle radius: 0.35 - density: 2000 + density: 2000 #Density is not final, adjust accordingly if the number of tail segments is reduced or increased restitution: 0.0 mask: - MobMask @@ -238,24 +200,7 @@ - MobLayer - type: Lamia - type: Inventory - templateId: human - - type: StatusEffects - allowed: - - Stun - - SlowedDown - - Stutter - - SeeingRainbows - - Electrocution - - Drunk - - SlurredSpeech - - PressureImmunity - - Muted - - KnockedDown - - ForcedSleep - - TemporaryBlindness - - Pacified - - PsionicsDisabled - - PsionicallyInsulated + templateId: human #need to make a Lamia template, no shoes - type: Speech speechSounds: Alto - type: Vocal @@ -265,9 +210,6 @@ proper: true - type: StandingState - type: Fingerprint - - type: MobPrice - price: 1500 # Kidnapping a living person and selling them for cred is a good move. - deathPenalty: 0.01 # However they really ought to be living and intact, otherwise they're worth 100x less. - type: Perishable - type: entity From 950b7b3c331efeae7adc4e2d823591f328028128 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 26 Nov 2023 21:04:40 -0500 Subject: [PATCH 06/73] More lamia updating --- .../Entities/Mobs/Species/lamia.yml | 25 +++- .../lamia_inventory_template.yml | 109 ++++++++++++++++++ 2 files changed, 131 insertions(+), 3 deletions(-) create mode 100644 Resources/Prototypes/Nyanotrasen/InventoryTemplates/lamia_inventory_template.yml diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml index 608f8b9176b..d3aff3c07b2 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml @@ -19,6 +19,9 @@ - type: Hunger - type: Thirst - type: IdExaminable + - type: Inventory + speciesId: lamia + templateId: lamia - type: HealthExaminable examinableTypes: - Blunt @@ -30,6 +33,15 @@ - type: Blindable - type: Clickable - type: InteractionOutline + - type: InteractionPopup + successChance: 0.5 + interactSuccessString: petting-success-lamia + interactFailureString: petting-failure-lamia + interactSuccessSpawn: EffectHearts + interactSuccessSound: + path: /Audio/Mobs/Animals/purr.ogg #placeholder sound + interactFailureSound: + path: /Audio/Mobs/Animals/hiss.ogg #placeholder sound - type: Icon sprite: Mobs/Species/Human/parts.rsi state: full @@ -174,9 +186,13 @@ - type: SolutionContainerManager solutions: melee: - reagents: - - ReagentId: SpaceDrugs #The poison is not final - Quantity: 60 + maxVol: 30 + - type: SolutionRegeneration + solution: melee + generated: + reagents: + - ReagentId: SpaceDrugs + Quantity: 1 - type: MeleeChemicalInjector solution: melee transferAmount: 3 #amount to inject is not final @@ -211,6 +227,9 @@ - type: StandingState - type: Fingerprint - type: Perishable + - type: FootstepModifier + footstepSoundCollection: + collection: FootstepLamia - type: entity save: false diff --git a/Resources/Prototypes/Nyanotrasen/InventoryTemplates/lamia_inventory_template.yml b/Resources/Prototypes/Nyanotrasen/InventoryTemplates/lamia_inventory_template.yml new file mode 100644 index 00000000000..223c592dac7 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/InventoryTemplates/lamia_inventory_template.yml @@ -0,0 +1,109 @@ +- type: inventoryTemplate + id: lamia + slots: + - name: jumpsuit + slotTexture: uniform + slotFlags: INNERCLOTHING + stripTime: 6 + uiWindowPos: 0,2 + strippingWindowPos: 0,2 + displayName: Jumpsuit + - name: outerClothing + slotTexture: suit + slotFlags: OUTERCLOTHING + slotGroup: MainHotbar + stripTime: 6 + uiWindowPos: 1,2 + strippingWindowPos: 1,2 + displayName: Suit + - name: gloves + slotTexture: gloves + slotFlags: GLOVES + uiWindowPos: 2,2 + strippingWindowPos: 2,2 + displayName: Gloves + - name: neck + slotTexture: neck + slotFlags: NECK + uiWindowPos: 0,1 + strippingWindowPos: 0,1 + displayName: Neck + - name: mask + slotTexture: mask + slotFlags: MASK + uiWindowPos: 1,1 + strippingWindowPos: 1,1 + displayName: Mask + - name: eyes + slotTexture: glasses + slotFlags: EYES + stripTime: 3 + uiWindowPos: 0,0 + strippingWindowPos: 0,0 + displayName: Eyes + - name: ears + slotTexture: ears + slotFlags: EARS + stripTime: 3 + uiWindowPos: 2,0 + strippingWindowPos: 2,0 + displayName: Ears + - name: head + slotTexture: head + slotFlags: HEAD + uiWindowPos: 1,0 + strippingWindowPos: 1,0 + displayName: Head + - name: pocket1 + slotTexture: pocket + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 0,3 + strippingWindowPos: 0,4 + dependsOn: jumpsuit + displayName: Pocket 1 + stripHidden: true + - name: pocket2 + slotTexture: pocket + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 2,3 + strippingWindowPos: 1,4 + dependsOn: jumpsuit + displayName: Pocket 2 + stripHidden: true + - name: suitstorage + slotTexture: suit_storage + slotFlags: SUITSTORAGE + stripTime: 3 + uiWindowPos: 2,0 + strippingWindowPos: 2,5 + dependsOn: outerClothing + displayName: Suit Storage + - name: id + slotTexture: id + slotFlags: IDCARD + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 2,1 + strippingWindowPos: 2,4 + dependsOn: jumpsuit + displayName: ID + - name: belt + slotTexture: belt + slotFlags: BELT + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 3,1 + strippingWindowPos: 1,5 + displayName: Belt + - name: back + slotTexture: back + slotFlags: BACK + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 3,0 + strippingWindowPos: 0,5 + displayName: Back From c2f4756052aa6c75319443cb42f4caeff0842d16 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 12 Dec 2023 14:46:30 -0500 Subject: [PATCH 07/73] LamiaSystem is returning to the server again --- .../Nyanotrasen/Lamiae/ClientLamiaeSystem.cs | 36 ------------------- .../Nyanotrasen/Lamiae/LamiaSystem.cs | 36 +++++++++++++++---- 2 files changed, 29 insertions(+), 43 deletions(-) delete mode 100644 Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs rename {Content.Shared => Content.Server}/Nyanotrasen/Lamiae/LamiaSystem.cs (85%) diff --git a/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs b/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs deleted file mode 100644 index 135d44db1e0..00000000000 --- a/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Content.Shared.Nyanotrasen.Lamiae; -using Content.Shared.Humanoid; -using Robust.Shared.GameObjects; -using Robust.Shared.GameStates; -using Robust.Client.GameObjects; -namespace Content.Client.Nyanotrasen.Lamiae; - -public sealed class LamiaVisualizerSystem : SharedLamiaSystem -{ - public void UpdateAppearance(EntityUid uid, LamiaSegmentComponent? lamia = null) - { - if (!Resolve(uid, ref lamia)) - return; - - if (!TryComp(uid, out var sprite)) - return; - - if (TryComp(lamia, out var humanoid)) - { - foreach (var marking in humanoid.MarkingSet.GetForwardEnumerator()) - { - if (marking.MarkingId != "LamiaBottom") - continue; - - var color = marking.MarkingColors[0]; - sprite.LayerSetColor("enum.LamiaSegmentVisualLayers.Base", color); - } - } - } -} - -public enum LamiaVisualLayers -{ - Base, - Armor, -} diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs similarity index 85% rename from Content.Shared/Nyanotrasen/Lamiae/LamiaSystem.cs rename to Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index 79b913d8d97..fb4263eab5a 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -1,23 +1,32 @@ using Robust.Shared.Physics; -using Content.Shared.Damage; +using Content.Server.Damage; +using Content.Server.Humanoid; +using Robust.Server.GameObjects; using Content.Shared.Humanoid; -using Robust.Shared.GameObjects; +using Robust.Server.Prototypes; +using Robust.Server.Containers; +using System.Numerics; +using Content.Server.Nyanotrasen.Lamiae; +using Content.Shared.Nyanotrasen.Lamiae; +using Robust.Shared.Physics; +using Content.Shared.Damage; +using Content.Server.Humanoid; +using Content.Server.Access.Systems; +using Robust.Server.GameObjects; using Robust.Shared.Prototypes; using Robust.Shared.Containers; using Robust.Shared.Map; using Robust.Shared.Physics.Systems; using Robust.Shared.Physics.Components; -using Robust.Shared.Maths; -using System.Numerics; -using Content.Shared.Nyanotrasen.Lamiae; -namespace Content.Shared.Nyanotrasen.Lamiae +namespace Content.Server.Nyanotrasen.Lamiae { - public partial class SharedLamiaSystem : EntitySystem + public partial class LamiaSystem : EntitySystem { [Dependency] private readonly SharedJointSystem _jointSystem = default!; [Dependency] private readonly IPrototypeManager _prototypes = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; Queue<(LamiaSegmentComponent segment, EntityUid lamia)> _segments = new(); public override void Update(float frameTime) @@ -37,6 +46,9 @@ public override void Update(float frameTime) EnsureComp(segmentUid); EnsureComp(attachedUid); // Hello I hate tests + var ev = new SegmentSpawnedEvent(segment.lamia); + RaiseLocalEvent(segmentUid, ev, false); + if (segment.segment.SegmentNumber == 1) { Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates; @@ -64,6 +76,16 @@ public override void Initialize() SubscribeLocalEvent(HandleSegmentDamage); } + private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, SegmentSpawnedEvent args) + { + component.Lamia = args.Lamia; + + if (TryComp(args.Lamia, out var segmentcolor)) + { + _appearance.SetData(uid, LamiaSegmentVisuals.Color, segmentcolor); + } + } + private void OnInit(EntityUid uid, LamiaComponent component, ComponentInit args) { SpawnSegments(uid, component); From 89a311ea1fae4c1d8727ff0a4b820c2f5434d6d2 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 15 Dec 2023 17:01:42 -0500 Subject: [PATCH 08/73] More in progress stuff --- Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs | 5 ++++- .../Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index fb4263eab5a..ebd1ed9e699 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -88,7 +88,10 @@ private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, Se private void OnInit(EntityUid uid, LamiaComponent component, ComponentInit args) { - SpawnSegments(uid, component); + if (AppearanceSystem.TryGetData<) + { + SpawnSegments(uid, component); + } } private void OnShutdown(EntityUid uid, LamiaComponent component, ComponentShutdown args) diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml index f4b5d6fc3b7..7cda0ded11f 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml @@ -34,7 +34,9 @@ - state: placeholder map: ["enum.LamiaSegmentVisualLayers.Base"] - map: ["enum.LamiaSegmentVisualLayers.Armor"] - visible: false + path: + state: segment + visible: true - type: Clickable - type: Tag tags: From 9234a361ceef4fa1a3ff7c0e69912ac4050cb54f Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 15 Dec 2023 18:00:51 -0500 Subject: [PATCH 09/73] Create LamiaSegmentVisuals.cs --- .../Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs new file mode 100644 index 00000000000..2aebfa41c02 --- /dev/null +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs @@ -0,0 +1,23 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Nyanotrasen.Lamiae +{ + [Serializable, NetSerializable] + public enum LamiaSegmentVisualLayers + { + Base, + } + + [Serializable, NetSerializable] + public enum SegmentBaseVisualLayer + { + Color, + } + + [Serializable, NetSerializable] + public enum SegmentArmorVisualLayer + { + Hardsuit, + NoHardsuit, + } +} From 05edd445f7e77f499fcc0259a1a57547fcd8e25b Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 15 Dec 2023 18:06:46 -0500 Subject: [PATCH 10/73] Update visualizer --- .../Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs | 1 + .../Entities/Objects/Specific/Species/lamia.yml | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs index 2aebfa41c02..86c21d895c8 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs @@ -6,6 +6,7 @@ namespace Content.Shared.Nyanotrasen.Lamiae public enum LamiaSegmentVisualLayers { Base, + Armor, } [Serializable, NetSerializable] diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml index 7cda0ded11f..994f5285ba6 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml @@ -54,7 +54,16 @@ density: 80 restitution: 0.0 mask: - - MobMask + - MobMask' + - type: GenericVisualizer + visuals: + enum.LamiaSegmentVisualLayers.Base: + baseLayer: + Color: {color: } + enum.LamiaSegmentVisualLayers.Armor: + armorLayer: + Hardsuit: {path: } + NoHardsuit: {path: } - type: entity id: LamiaSegmentEnd @@ -69,6 +78,7 @@ - state: tip map: ["enum.LamiaSegmentVisualLayers.Base"] - map: ["enum.LamiaSegmentVisualLayers.Armor"] + state: segmenttip visible: false - type: Physics bodyType: KinematicController From 9b29ee04bb3100cd09bf0c746bf98f6c0129c2c5 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 15 Dec 2023 18:07:02 -0500 Subject: [PATCH 11/73] Update lamia.yml --- .../Entities/Objects/Specific/Species/lamia.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml index 994f5285ba6..e2967ae6c0e 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml @@ -92,3 +92,12 @@ restitution: 0.0 mask: - MobMask + - type: GenericVisualizer + visuals: + enum.LamiaSegmentVisualLayers.Base: + baseLayer: + Color: {color: } + enum.LamiaSegmentVisualLayers.Armor: + armorLayer: + Hardsuit: {path: } + NoHardsuit: {path: } From 294edd367d9ac90daaddf264977dbd8a35d7193c Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 17 Dec 2023 15:45:01 -0500 Subject: [PATCH 12/73] Revert "Update lamia.yml" This reverts commit 83214b3a2afd0840fed79c95d4ff26f9093883da. --- .../Entities/Objects/Specific/Species/lamia.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml index e2967ae6c0e..994f5285ba6 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml @@ -92,12 +92,3 @@ restitution: 0.0 mask: - MobMask - - type: GenericVisualizer - visuals: - enum.LamiaSegmentVisualLayers.Base: - baseLayer: - Color: {color: } - enum.LamiaSegmentVisualLayers.Armor: - armorLayer: - Hardsuit: {path: } - NoHardsuit: {path: } From e166895d8de585a5117c5ced53d4612da7811ce1 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 17 Dec 2023 15:45:05 -0500 Subject: [PATCH 13/73] Revert "Update visualizer" This reverts commit 1f49a80ade092b7984553027ff20eaf72dba9ce9. --- .../Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs | 1 - .../Entities/Objects/Specific/Species/lamia.yml | 12 +----------- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs index 86c21d895c8..2aebfa41c02 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs @@ -6,7 +6,6 @@ namespace Content.Shared.Nyanotrasen.Lamiae public enum LamiaSegmentVisualLayers { Base, - Armor, } [Serializable, NetSerializable] diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml index 994f5285ba6..7cda0ded11f 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml @@ -54,16 +54,7 @@ density: 80 restitution: 0.0 mask: - - MobMask' - - type: GenericVisualizer - visuals: - enum.LamiaSegmentVisualLayers.Base: - baseLayer: - Color: {color: } - enum.LamiaSegmentVisualLayers.Armor: - armorLayer: - Hardsuit: {path: } - NoHardsuit: {path: } + - MobMask - type: entity id: LamiaSegmentEnd @@ -78,7 +69,6 @@ - state: tip map: ["enum.LamiaSegmentVisualLayers.Base"] - map: ["enum.LamiaSegmentVisualLayers.Armor"] - state: segmenttip visible: false - type: Physics bodyType: KinematicController From c5bc6e8478494e72e8d29a697a2d0afcbea3addb Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 17 Dec 2023 15:45:09 -0500 Subject: [PATCH 14/73] Revert "Create LamiaSegmentVisuals.cs" This reverts commit 46c7c6e3b50cc698cf12344ebc47bb5d69ccb7fd. --- .../Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs | 23 ------------------- 1 file changed, 23 deletions(-) delete mode 100644 Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs deleted file mode 100644 index 2aebfa41c02..00000000000 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Robust.Shared.Serialization; - -namespace Content.Shared.Nyanotrasen.Lamiae -{ - [Serializable, NetSerializable] - public enum LamiaSegmentVisualLayers - { - Base, - } - - [Serializable, NetSerializable] - public enum SegmentBaseVisualLayer - { - Color, - } - - [Serializable, NetSerializable] - public enum SegmentArmorVisualLayer - { - Hardsuit, - NoHardsuit, - } -} From 2f67851f2d00fe2e651960ece22fa51449b7fe31 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 17 Dec 2023 15:45:12 -0500 Subject: [PATCH 15/73] Revert "More in progress stuff" This reverts commit 60759e2656feb64c0c7443a11943fadc46163561. --- Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs | 5 +---- .../Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml | 4 +--- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index ebd1ed9e699..fb4263eab5a 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -88,10 +88,7 @@ private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, Se private void OnInit(EntityUid uid, LamiaComponent component, ComponentInit args) { - if (AppearanceSystem.TryGetData<) - { - SpawnSegments(uid, component); - } + SpawnSegments(uid, component); } private void OnShutdown(EntityUid uid, LamiaComponent component, ComponentShutdown args) diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml index 7cda0ded11f..f4b5d6fc3b7 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml @@ -34,9 +34,7 @@ - state: placeholder map: ["enum.LamiaSegmentVisualLayers.Base"] - map: ["enum.LamiaSegmentVisualLayers.Armor"] - path: - state: segment - visible: true + visible: false - type: Clickable - type: Tag tags: From 00a826c0aadac7c39361e300d28935efd0f6df11 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 17 Dec 2023 15:45:15 -0500 Subject: [PATCH 16/73] Revert "LamiaSystem is returning to the server again" This reverts commit c484b58cb30edb9bf64d5b2722bbce6546657e55. --- .../Nyanotrasen/Lamiae/ClientLamiaeSystem.cs | 36 +++++++++++++++++++ .../Nyanotrasen/Lamiae/LamiaSystem.cs | 36 ++++--------------- 2 files changed, 43 insertions(+), 29 deletions(-) create mode 100644 Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs rename {Content.Server => Content.Shared}/Nyanotrasen/Lamiae/LamiaSystem.cs (85%) diff --git a/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs b/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs new file mode 100644 index 00000000000..135d44db1e0 --- /dev/null +++ b/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs @@ -0,0 +1,36 @@ +using Content.Shared.Nyanotrasen.Lamiae; +using Content.Shared.Humanoid; +using Robust.Shared.GameObjects; +using Robust.Shared.GameStates; +using Robust.Client.GameObjects; +namespace Content.Client.Nyanotrasen.Lamiae; + +public sealed class LamiaVisualizerSystem : SharedLamiaSystem +{ + public void UpdateAppearance(EntityUid uid, LamiaSegmentComponent? lamia = null) + { + if (!Resolve(uid, ref lamia)) + return; + + if (!TryComp(uid, out var sprite)) + return; + + if (TryComp(lamia, out var humanoid)) + { + foreach (var marking in humanoid.MarkingSet.GetForwardEnumerator()) + { + if (marking.MarkingId != "LamiaBottom") + continue; + + var color = marking.MarkingColors[0]; + sprite.LayerSetColor("enum.LamiaSegmentVisualLayers.Base", color); + } + } + } +} + +public enum LamiaVisualLayers +{ + Base, + Armor, +} diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaSystem.cs similarity index 85% rename from Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs rename to Content.Shared/Nyanotrasen/Lamiae/LamiaSystem.cs index fb4263eab5a..79b913d8d97 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -1,32 +1,23 @@ using Robust.Shared.Physics; -using Content.Server.Damage; -using Content.Server.Humanoid; -using Robust.Server.GameObjects; -using Content.Shared.Humanoid; -using Robust.Server.Prototypes; -using Robust.Server.Containers; -using System.Numerics; -using Content.Server.Nyanotrasen.Lamiae; -using Content.Shared.Nyanotrasen.Lamiae; -using Robust.Shared.Physics; using Content.Shared.Damage; -using Content.Server.Humanoid; -using Content.Server.Access.Systems; -using Robust.Server.GameObjects; +using Content.Shared.Humanoid; +using Robust.Shared.GameObjects; using Robust.Shared.Prototypes; using Robust.Shared.Containers; using Robust.Shared.Map; using Robust.Shared.Physics.Systems; using Robust.Shared.Physics.Components; +using Robust.Shared.Maths; +using System.Numerics; +using Content.Shared.Nyanotrasen.Lamiae; -namespace Content.Server.Nyanotrasen.Lamiae +namespace Content.Shared.Nyanotrasen.Lamiae { - public partial class LamiaSystem : EntitySystem + public partial class SharedLamiaSystem : EntitySystem { [Dependency] private readonly SharedJointSystem _jointSystem = default!; [Dependency] private readonly IPrototypeManager _prototypes = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; Queue<(LamiaSegmentComponent segment, EntityUid lamia)> _segments = new(); public override void Update(float frameTime) @@ -46,9 +37,6 @@ public override void Update(float frameTime) EnsureComp(segmentUid); EnsureComp(attachedUid); // Hello I hate tests - var ev = new SegmentSpawnedEvent(segment.lamia); - RaiseLocalEvent(segmentUid, ev, false); - if (segment.segment.SegmentNumber == 1) { Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates; @@ -76,16 +64,6 @@ public override void Initialize() SubscribeLocalEvent(HandleSegmentDamage); } - private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, SegmentSpawnedEvent args) - { - component.Lamia = args.Lamia; - - if (TryComp(args.Lamia, out var segmentcolor)) - { - _appearance.SetData(uid, LamiaSegmentVisuals.Color, segmentcolor); - } - } - private void OnInit(EntityUid uid, LamiaComponent component, ComponentInit args) { SpawnSegments(uid, component); From 14ebfad8a65b8c14fb0c027fb8cc67df8afe0586 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 17 Dec 2023 15:47:58 -0500 Subject: [PATCH 17/73] Reverting to the last state where we could spawn a Lamia --- .../Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml index d3aff3c07b2..94e7c4a4d1c 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml @@ -215,8 +215,6 @@ layer: - MobLayer - type: Lamia - - type: Inventory - templateId: human #need to make a Lamia template, no shoes - type: Speech speechSounds: Alto - type: Vocal From 53f50ddc45c8ec44b10ff8f222134f62bbc2c4e5 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 17 Dec 2023 16:18:50 -0500 Subject: [PATCH 18/73] We can now spawn the noodles again --- .../Nyanotrasen/Lamiae/ClientLamiaeSystem.cs | 24 +++++++++--------- .../Objects/Specific/Species/lamia.yml | 6 ----- error.txt | Bin 1500238 -> 0 bytes 3 files changed, 12 insertions(+), 18 deletions(-) delete mode 100644 error.txt diff --git a/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs b/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs index 135d44db1e0..924978dc9df 100644 --- a/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs +++ b/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs @@ -5,17 +5,23 @@ using Robust.Client.GameObjects; namespace Content.Client.Nyanotrasen.Lamiae; -public sealed class LamiaVisualizerSystem : SharedLamiaSystem +public sealed class LamiaSystem : EntitySystem { - public void UpdateAppearance(EntityUid uid, LamiaSegmentComponent? lamia = null) + public override void Initialize() { - if (!Resolve(uid, ref lamia)) - return; + base.Initialize(); + + SubscribeLocalEvent(OnSegmentSpawned); + } + + public void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, SegmentSpawnedEvent args) + { + component.Lamia = args.Lamia; if (!TryComp(uid, out var sprite)) return; - if (TryComp(lamia, out var humanoid)) + if (TryComp(args.Lamia, out var humanoid)) { foreach (var marking in humanoid.MarkingSet.GetForwardEnumerator()) { @@ -23,14 +29,8 @@ public void UpdateAppearance(EntityUid uid, LamiaSegmentComponent? lamia = null) continue; var color = marking.MarkingColors[0]; - sprite.LayerSetColor("enum.LamiaSegmentVisualLayers.Base", color); + sprite.LayerSetColor(0, color); } } } } - -public enum LamiaVisualLayers -{ - Base, - Armor, -} diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml index f4b5d6fc3b7..01b84c01723 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml @@ -32,9 +32,6 @@ sprite: Nyanotrasen/Mobs/Species/lamia.rsi layers: - state: placeholder - map: ["enum.LamiaSegmentVisualLayers.Base"] - - map: ["enum.LamiaSegmentVisualLayers.Armor"] - visible: false - type: Clickable - type: Tag tags: @@ -65,9 +62,6 @@ sprite: Nyanotrasen/Mobs/Species/lamia.rsi layers: - state: tip - map: ["enum.LamiaSegmentVisualLayers.Base"] - - map: ["enum.LamiaSegmentVisualLayers.Armor"] - visible: false - type: Physics bodyType: KinematicController - type: Fixtures diff --git a/error.txt b/error.txt deleted file mode 100644 index 753ecc761e3f1b8cbccfc3db43bcb9de8d280f56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1500238 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�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∨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 Date: Tue, 19 Dec 2023 13:49:16 -0500 Subject: [PATCH 19/73] Update reptilian.yml --- .../Mobs/Customization/Markings/reptilian.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml index d1ed51013a2..2238671ea0e 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml @@ -2,7 +2,7 @@ id: LizardFrillsAquatic bodyPart: HeadSide markingCategory: HeadSide - speciesRestriction: [Reptilian] + speciesRestriction: [Reptilian, Lamia] sprites: - sprite: Mobs/Customization/reptilian_parts.rsi state: frills_aquatic @@ -11,7 +11,7 @@ id: LizardFrillsShort bodyPart: HeadSide markingCategory: HeadSide - speciesRestriction: [Reptilian] + speciesRestriction: [Reptilian, Lamia] sprites: - sprite: Mobs/Customization/reptilian_parts.rsi state: frills_short @@ -20,7 +20,7 @@ id: LizardFrillsSimple bodyPart: HeadSide markingCategory: HeadSide - speciesRestriction: [Reptilian] + speciesRestriction: [Reptilian, Lamia] sprites: - sprite: Mobs/Customization/reptilian_parts.rsi state: frills_simple @@ -29,7 +29,7 @@ id: LizardFrillsDivinity bodyPart: HeadSide markingCategory: HeadSide - speciesRestriction: [Reptilian] + speciesRestriction: [Reptilian, Lamia] sprites: - sprite: Mobs/Customization/reptilian_parts.rsi state: frills_divinity @@ -38,7 +38,7 @@ id: LizardFrillsBig bodyPart: HeadSide markingCategory: HeadSide - speciesRestriction: [Reptilian] + speciesRestriction: [Reptilian, Lamia] sprites: - sprite: Mobs/Customization/reptilian_parts.rsi state: frills_big @@ -47,7 +47,7 @@ id: LizardFrillsAxolotl bodyPart: HeadSide markingCategory: HeadSide - speciesRestriction: [Reptilian] + speciesRestriction: [Reptilian, Lamia] sprites: - sprite: Mobs/Customization/reptilian_parts.rsi state: frills_axolotl @@ -56,7 +56,7 @@ id: LizardFrillsHood bodyPart: HeadSide markingCategory: HeadSide - speciesRestriction: [Reptilian] + speciesRestriction: [Reptilian, Lamia] sprites: - sprite: Mobs/Customization/reptilian_parts.rsi state: frills_hood_primary From 2ec632a145f4ce8c9ce0f52c674846f8be8f5529 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 20 Dec 2023 16:49:02 -0500 Subject: [PATCH 20/73] We were missing the SegmentSpawnedEvent --- Content.Shared/Nyanotrasen/Lamiae/LamiaSystem.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaSystem.cs index 79b913d8d97..585725e9b1a 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -37,6 +37,9 @@ public override void Update(float frameTime) EnsureComp(segmentUid); EnsureComp(attachedUid); // Hello I hate tests + var ev = new SegmentSpawnedEvent(segment.lamia); + RaiseLocalEvent(segmentUid, ev, false); + if (segment.segment.SegmentNumber == 1) { Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates; From bc8e48c5baed76874daa5b223c992113558e2436 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 20 Dec 2023 21:20:26 -0500 Subject: [PATCH 21/73] Update lamia.yml --- .../Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml index 01b84c01723..2bba21eaf70 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml @@ -31,7 +31,8 @@ - type: Sprite sprite: Nyanotrasen/Mobs/Species/lamia.rsi layers: - - state: placeholder + - map: [ "enum.HumanoidVisualLayers.Tail" ] + state: placeholder - type: Clickable - type: Tag tags: @@ -61,7 +62,8 @@ - type: Sprite sprite: Nyanotrasen/Mobs/Species/lamia.rsi layers: - - state: tip + - map: [ "enum.HumanoidVisualLayers.Tail" ] + state: tip - type: Physics bodyType: KinematicController - type: Fixtures From 94ea027a0292215c2a2aa51f784f3cf30302db3b Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 20 Dec 2023 23:39:12 -0500 Subject: [PATCH 22/73] Now requires engine changes. --- .../Nyanotrasen/Lamiae/ClientLamiaeSystem.cs | 15 +++++---------- .../Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs | 11 +++++++++++ .../Entities/Objects/Specific/Species/lamia.yml | 6 ++++-- 3 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs diff --git a/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs b/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs index 924978dc9df..6402a5fc12f 100644 --- a/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs +++ b/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs @@ -21,16 +21,11 @@ public void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, Seg if (!TryComp(uid, out var sprite)) return; - if (TryComp(args.Lamia, out var humanoid)) - { - foreach (var marking in humanoid.MarkingSet.GetForwardEnumerator()) - { - if (marking.MarkingId != "LamiaBottom") - continue; + if (!TryComp(args.Lamia, out var parent)) + return; - var color = marking.MarkingColors[0]; - sprite.LayerSetColor(0, color); - } - } + parent.LayerMapTryGet(HumanoidVisualLayers.Tail, out var tailLayer); + var color = parent.LayerGetColor(tailLayer + 1); + sprite.LayerSetColor(LamiaSegmentVisualLayers.Tail, color); } } diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs new file mode 100644 index 00000000000..b66c203d62c --- /dev/null +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs @@ -0,0 +1,11 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Nyanotrasen.Lamiae +{ + [Serializable, NetSerializable] + public enum LamiaSegmentVisualLayers + { + Null, + Tail, + } +} diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml index 2bba21eaf70..b6f27ef48b7 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml @@ -31,7 +31,8 @@ - type: Sprite sprite: Nyanotrasen/Mobs/Species/lamia.rsi layers: - - map: [ "enum.HumanoidVisualLayers.Tail" ] + - map: [ "enum.LamiaSegmentVisualLayers.Null" ] + - map: [ "enum.LamiaSegmentVisualLayers.Tail" ] state: placeholder - type: Clickable - type: Tag @@ -62,7 +63,8 @@ - type: Sprite sprite: Nyanotrasen/Mobs/Species/lamia.rsi layers: - - map: [ "enum.HumanoidVisualLayers.Tail" ] + - map: [ "enum.LamiaSegmentVisualLayers.Null" ] + - map: [ "enum.LamiaSegmentVisualLayers.Tail" ] state: tip - type: Physics bodyType: KinematicController From 878b155f7afbc2161666b295ba53da488137fbbc Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sat, 23 Dec 2023 15:58:26 -0500 Subject: [PATCH 23/73] Markings but not colors --- .../Nyanotrasen/Lamiae/ClientLamiaeSystem.cs | 31 ------------------ .../Nyanotrasen/Lamiae/LamiaSystem.cs | 29 ++++++++++++++-- .../Lamiae/LamiaSegmentComponent.cs | 2 ++ .../Objects/Specific/Species/lamia.yml | 7 +++- error.txt | Bin 0 -> 1698876 bytes 5 files changed, 35 insertions(+), 34 deletions(-) delete mode 100644 Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs rename {Content.Shared => Content.Server}/Nyanotrasen/Lamiae/LamiaSystem.cs (83%) create mode 100644 error.txt diff --git a/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs b/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs deleted file mode 100644 index 6402a5fc12f..00000000000 --- a/Content.Client/Nyanotrasen/Lamiae/ClientLamiaeSystem.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Content.Shared.Nyanotrasen.Lamiae; -using Content.Shared.Humanoid; -using Robust.Shared.GameObjects; -using Robust.Shared.GameStates; -using Robust.Client.GameObjects; -namespace Content.Client.Nyanotrasen.Lamiae; - -public sealed class LamiaSystem : EntitySystem -{ - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnSegmentSpawned); - } - - public void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, SegmentSpawnedEvent args) - { - component.Lamia = args.Lamia; - - if (!TryComp(uid, out var sprite)) - return; - - if (!TryComp(args.Lamia, out var parent)) - return; - - parent.LayerMapTryGet(HumanoidVisualLayers.Tail, out var tailLayer); - var color = parent.LayerGetColor(tailLayer + 1); - sprite.LayerSetColor(LamiaSegmentVisualLayers.Tail, color); - } -} diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs similarity index 83% rename from Content.Shared/Nyanotrasen/Lamiae/LamiaSystem.cs rename to Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index 585725e9b1a..4177dc48af7 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -1,7 +1,11 @@ using Robust.Shared.Physics; +using Robust.Shared.Utility; using Content.Shared.Damage; using Content.Shared.Humanoid; -using Robust.Shared.GameObjects; +using Content.Shared.Humanoid.Markings; +using Content.Shared.Humanoid.Prototypes; +using Content.Server.Humanoid; +using Robust.Server.GameObjects; using Robust.Shared.Prototypes; using Robust.Shared.Containers; using Robust.Shared.Map; @@ -11,12 +15,14 @@ using System.Numerics; using Content.Shared.Nyanotrasen.Lamiae; -namespace Content.Shared.Nyanotrasen.Lamiae +namespace Content.Server.Nyanotrasen.Lamiae { public partial class SharedLamiaSystem : EntitySystem { [Dependency] private readonly SharedJointSystem _jointSystem = default!; [Dependency] private readonly IPrototypeManager _prototypes = default!; + [Dependency] private readonly MarkingManager _markingManager = default!; + [Dependency] private readonly HumanoidAppearanceSystem _humanoid = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; Queue<(LamiaSegmentComponent segment, EntityUid lamia)> _segments = new(); @@ -64,9 +70,28 @@ public override void Initialize() SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnJointRemoved); SubscribeLocalEvent(OnRemovedFromContainer); + SubscribeLocalEvent(OnSegmentSpawned); SubscribeLocalEvent(HandleSegmentDamage); } + private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, SegmentSpawnedEvent args) + { + component.Lamia = args.Lamia; + var segmentId = component.segmentId; + + if (TryComp(args.Lamia, out var humanoid)) + { + foreach (var marking in humanoid.MarkingSet.GetForwardEnumerator()) + { + if (!(humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings))) + continue; + + string segmentmarking = $"{marking}-{segmentId}"; + _humanoid.SetMarkingId(uid, MarkingCategories.Tail, 0, segmentmarking); + } + } + } + private void OnInit(EntityUid uid, LamiaComponent component, ComponentInit args) { SpawnSegments(uid, component); diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs index c33ec31d848..5b81f0abb77 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs @@ -14,5 +14,7 @@ public sealed partial class LamiaSegmentComponent : Component public bool SexChanged = false; public EntityUid Lamia = default!; public int SegmentNumber = default!; + [DataField("segmentId")] + public string? segmentId; } } diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml index b6f27ef48b7..15b8cdd583b 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml @@ -14,12 +14,13 @@ restitution: 0.0 mask: - MobMask - - type: Transform anchored: false - type: Tag tags: - HideContextMenu + - type: LamiaSegment + segmentId: initial - type: entity id: LamiaSegment @@ -52,6 +53,8 @@ restitution: 0.0 mask: - MobMask + - type: LamiaSegment + segmentId: segment - type: entity id: LamiaSegmentEnd @@ -66,6 +69,8 @@ - map: [ "enum.LamiaSegmentVisualLayers.Null" ] - map: [ "enum.LamiaSegmentVisualLayers.Tail" ] state: tip + - type: LamiaSegment + segmentId: tip - type: Physics bodyType: KinematicController - type: Fixtures diff --git a/error.txt b/error.txt new file mode 100644 index 0000000000000000000000000000000000000000..d62f8b58d6ac72df47bc0f13a75a03537e825419 GIT binary patch literal 1698876 zcmeFaYjYb%vaXBI6EXjR-z>+T;Tn;;PE3r0mStPB$CkEbk5}x)i4zn_U2Ib1A}PyU zKmMHaK9wkS6}r)=Y62iYW++60K%=i&d3p2A%>VEI{ciMf^yTQo=-udObTHZ&{Wdxr zosG`*_sQtJ{=PeUINBUN(*Nzz|I%NNNB6bG!_jN~-qU*|ZCAg43&%Lr`_HxK!_imz*1K@LUA;aT?dvR#_5S8CBubd+2oB;p8m1^I@iB=CwWq5x~GS_ z8|T`JyY=5e&UnT5;+@OyC};FvOSpG0b-jCfR)>1Voa=?o9Era>x~IExuB&@L`gf4! z4V@9vccK4hl2EQNUS{>)4q1J?;~x~{w{ZnC-Fg_{W zUF)(rzg>NPrhA{hH+jyx`W|=LRzCZDqu1yS>cihIy??tS;{!T27fPY8`YZC{gjta*B?afh1o>5`_t zJ5eG%xwPc>?1|*)o$ed!i#y1wJCwEJ9ps7iYC3ThR^703A9DYO9cfa|^1b|1cXCf_ zm;1USt@ut_Z1wJH`z&{*fg4S@IqKSCx_;|ktL=SE-n*T#UB-@~)i&iN?MYi=Jyzka zO+UXrdBgWayHEf2p-*p>7>m1$aZ9(Qo^c{aL!bM#DWiD$vn!#`aO$!^ZD z%Nn)MddQt^j?v!VEKqws}x!?p3f`xx~ym=d0i0Sx1<> zr~i~DJdkZ;eZSZGFt0vZsMWZK{pZ+s&!YWrBKDtkz5f$**nzYd-c{fAPu{KPvf%6X}NJJ;^JmP^F6?@r#GNuMD9-dExN z>}gFeJ0_|-ukJenwr~+}_%83K|4JwCQ+{_}NMy6VafgJ`~KwJXg?ja zj^#l%h5WLru0v`fK2UdlZO_<{!fDqtc{lPqm&(;DN=ABq-EuMgdM2-Y@;*oZV43=K z`Z;u8UB6anu3++7^SeSkNd9b3K4i>nte)T9KFgAOGV4nF?@TIRo5I}pr5VTvl3B5g z;p*L|S?An+*Yf)`Yaf$$ZBlO2?=Mep^qocbRrh^k@){@aP-7*QcZKOW#MK@1Ytde$ z`hF6JPCuKxzR7#hUT@30&e`YE{XF~iVf%_E??HNhK^c#<&J9Cb-nFOaFzp$qXEyna z)6e>^?4_cc0_rHFs|{dG(W0mENi4J>Pg`eP`45;?i@SyslJY z$oU|#WIW()kfT_p2a}%5H0kX+!^tPwwaw&pPu{^Fbmga7v&L3gmSvvyJkzsjKhN~j z^tu+$(U`nzsZD@abs{YBQV9FY5EYU`IF5!AgRaV_db9z+(Z2+6d{btOj>z1{zB~dUBk*M9CCj|!xY!>NApJ9}@yQ2r!C~xUiG+AOK z)I0~5v}N!?`&UN#jQS<*g(UJo|6o3L$=bG|YXZklbj zyxm(Vc}v%XYqp!E+3sJfq~VLXMBOZjx=z3BsVWR!%T^LYxLjSoT*0S!qX_C^hOhrZ zKF&uyH;c%cZ>5$edj4D2>iJW(v?CcKMn3a+QgQjBtG@cZ{6*w_HfBov5DwG zFJK%yQgJgS>(Mnz78Pw&WKsdgx_K|0*w8nmju;c%%0UPu1vdwup%+oT$zi31iZQTZ{=UjDbs z%?*&7yGzzYsdv94S&#h$ET@`QA5ri5#yzm5bQ9^1E3dAdmYokzrR<5c>6v_an2S^i z;qNz9)nt$+KXnyuF+OACw_IATXuf3 z+={wJTYrtV>|A9kUEjzDgVXb)d^9R?42gBAT7Rj!PK=*S>Z$l_&Z}5XPs&9{k=KdY zzf=U-pc6kxSM5u>=)Ok>h7=$3=yCm{$LmGtCu^?V4z9Z$+*Yl}A~QZ|)e+i=Zg0jP z+6+FGp{#ElvA=f2{`=7jokP32$lk|-9)}JcbU39eh1DNzhRhJ0{KGNd`_8p8zwB&X zFI~4@`d;3xA=}h=QFGJJ{Q6qkP{EeV7WD&nRM)X=ls?r`_*eK-^k6u2J$3DR>V;~~ zb|g(djAL=4_580c8CrBDT7FE=L;o`F(SF@}hhe^$dsVS31cy$)BO= z9;#s%=^wQt(^U6-t8;xnj^w;vHg-x{y{fXSOWAc=xb{kL|7rd8)?(wje!b;BQ=B2P z8db0P^XT`)pU88!9@GaDmH(+9++`~li>T*EbPsD)Jgnu&*0K@y)CA?t=!5mi`5@$qc+oo1FsFd%puKfuFE2auoJt+@)sBPzf1>j|aOC0Ikq7)_ zW~1$f*pXMcO^OjCx@t>tV_%o02ioFM=(699yi*jhR8M5WII|DFq%J?l+pQ#4mlt7+q@W%-Z+tEBd{Srf>}p4v1LDW z_Bzu$^l5@2v7vp@yNR>qJ$gJ5b9*nQu8E0lU%FwS>ErJsUU`a-hKq(RW$4M{TBa;$%BPnWCa+g}9f zV)_r-j89Bfm~jXL8Yx3oVB0kE^_lk4XvOO|W9A;(yiDseh7`y3!DP$J@!SEE{nz@` zu8^npMt?EMGF~g!$g|{1mo-nZU%L7}UB&)AcD`uCGs&EFp|kA5v`@NL3%d7D$}9Bi z=ya`=?fs>m^+!oB^N)@`O`ro!sg?R%Yp40PX~%FmJ(Jd1m8ht%f{00xCqdugl{Q;8 z?{>-T2lGiVgp)V9)T-SW9>|alX%;fqHtn#7;j7GD|N~wEmvhmFQM_Ir5vS z!)N-3#>BSdcEP%>@wr(O`yMzw8D@p+wT zeUnY#3@7)~Z53S4ch8CLvplR2?B_4K$6bts_}NRz2%baNdfC!C_>+91tzv(uIcE2M z{~w)EJn|5oo_aEM$8z1iTDtv0ngz|tEOfj({LW@&DDOlTTjwQX|`X{#ErA}j7@)|f5>Im)?JY# zmbq)&w)D&+lI%KCes`8}4X)Q$Nw0UwMEN?pt9X*i-ubR1G%Ir;V9mlmyXZt=CUL$L zo9Vi$>snLGy&7L#H)(a<8-c6iEA``>P5j#>`MHk&NmlbfYYUtCmFy+nTZ1WK0ZLY0 z*Kyh_3~ap~2TEgxuH#(a^_UfAjd=vWD|`UomT3q!6@$qLCjrBV7=%R&c)euy>hl2W z=9T`Sbp_Uq@4usU7N>deF1-!m?DlWbUPCc23wrxth9>a1%3>{#tA?&P%le!Jbkw3M zVq%lsow1$xEm#kxkP_?s^eF>IG!~=XD79w4wtMZDORY;SsM2sdVbj<@2I&KZF*Xc{ zcq5U#OGg826E!!?N{Zi@u62zI?|Qd=haAr$TQe_D=X;@wcn0LisJkNDLjBl|v@Drb z)`l^+c1K_9Gu{DDgd>svoqNZ|&jF8xpVQBiNcC|0d2h^WE|HOVR4X3?@oSIb$v1DCz%16<7#vTh9zZ$If(#PRVd@h(~SXuIaG zpQYWvCZgBLbw#hzxGaw=yvnEHuAoIPmAOJ&7+Vltuc07(a;MXm1!??FXTo}l-5}cf zF(UMRSt{~KWYOE%cQWi~G&JFR{Y=l-kWJ4M4M7l6i7J<`ZCOfix0<*mePS+Q!+rVN zp~3EjJh^Kyw7$*$084O8@oL`L3)vUrxzo9idz-)0jwZUIg-2snb-DIyTSJc)O1dEE$@tY6@{7pFG-xVuZcC*jle>(Q+iMEZGW*l0pAtF0ul@afytuJ+!8zJH` zb{iZqiw5Ad(ZPcm^1Ro#GK^LHUO0)NE4EkTq{ZkXy}rqHm0oXtosO&2;wlZx9T_oP zFVlE23SI7Dq#=FGQG+>-B-|OF4G7|!0x7nf5OSB-VWj)?=yXVQT7$ghp4?F1 z?s4c;S7V1=ic++66*08sOA%Qyy7$x|BpxH&9uKZYBJ=E3NjB@Q?Ag7$Yplb5n2C@&|Z3WImn=skg~2-TgHqv$7oHNWJFtxXa8RL>Wsn7U_9erhqu2 zt!+!Q81Bg}-;-NAVFg$}N2*F~8htK-mgTRPY5E>m=A6zRXJRw7uPl$xr}V_NiY)t_np4-8 z!}R5%EitvGRGgMGOWYEhg_>kxtQ!toBU$r_UGe)211Xm_k6t}`jaDWi!m(&SxphzBI}#$5YZHrsw6cE?h#Zc33WhrXPcuC5;b-+tne*=~H)U^qR|DH(o6c z=|W!eXyu21!4R{t+Q4y*WzdhsJPeV_eOYz)FrSBe=XJtoq3;iUYObb1iGx91%Gsl? zL4VV#b%rTgtj#dp33uj9pTxS!1D6P|1`;`@Mb$9Z8yYw*0m+Ga6B{-OJU zZ`wpJkstX)xEtI|@(xG(yy1>JH`4AcPx>ld<90&#uKvlew#|zWUv$sh*dABQmt#iH z#;n;%`Gk!dr;tUCZCBU$eEt}FIsL@RZS#~$`qD&hZh8joJ>3a0+kx~t9c*m++3cfl zh`~$@dZ6{@@zOBuN0+&)%PD#HtqRWDtY^C!`Y9389y2d&=eJ$yr$~29xkS5+` zD|#=%`#v8_L|{PwH3;{{$Uv-B)Ph8q9ESEuIg5k1Ck4qR2rLtOLQ{h`QRy3}h z^AI86^TSt;^JeHib4OUsi8?sJXWI}mM3it8UcVUodPEf#FOZEfTMZ}kwR$ks#J29| zE!NNL>)F-heVeu3yqD*K?*&Gx!3w*z)hE<2v>DN%ZO9 z#llIf>2Fk41K*8bYzA#M8|9ruG0qb%pw+&k6{)gEL*|HvqrLM&d*>}_)&Z%!7P(B) zyxYP$YcoS?4fVjn9cV>^<%5@>eqv5P2%NoHbNy20w8se^Cy)m$j}uBIk*q*XC46ZV z@I;c&d>8ZmUylA;D*%=r6CL=uSCk%OsgNpdN$1pX(rLK{Pt7$?UN1FE`&>n4@*_D9Y#0x$&*QNti+|q8S9~v*8~UE$L;K8? z4_Z^qY-t#4?fH{wRGe3w`OKC1&Rm)8Y0+E7<3BnoaOd4?$39Y5Z1uxU_b2S}$*y&jX8+h6d+@U(T|>-gp6FG{8F?f-|46o^O5k~TmhZDVg19!e11bX7%#nSM5vIoo zHAvfoaUJncWH!gY9BISy5qreU?rE?jzpM<4qAwn(k(-Ah#&m>s*nFh*^XcX#H;=}0 zQ$7PFNA{`tW@^|XHBCH*`#|&efsp)T{cE`OKgvJG+y1C$y071`^r*M$^}+-11$dI`2JW-`~*{z6p1+21(l2{&)t>9RmAl`n%^9T<*Qh-+QTv zkgm#}^T--mH$9h6CNsNvGb8IQX-|CH8gIZOr0G7}`pHV}E#XD>^_2vHsjFl0x`EqR zH(;Jj8h4k)CR^ja2<7;2>I3B-qQ}}EYuD70_F;}g<++~E;_{3ac09^41?Py)mm`{L z%AD)`qwYT0f2&`HgOG09U`RyWHMwE@jMGq!xEBzf$#@>Gl22^AJLBKXSp@|$W+IXL zoA7tOH?r6lisSLi&a3(*5vyN*IxCN1=O4qS(vwSC`bm^4c**ovr5C2N4xDu`opo?k zcFRLWGIbivBbnP6$)sAUM1R?I#rqYAw9D0Pl&f-V7cUE4Q2@&BtO5+gzsIQTlhTr`lYwMt41`W?oFs z4KW9X8puoa8;zDS<&lA*m$1#sd()&xOwX%f%302A$XPfJf897dTF&N-I}Yz1Lgvld zB`Z$Ht@*Hash@$-i~d^%Yqzb_+nTP9-}^#5c6hZ+fjOVa0xs9l`_AB%Y#fSTO?T$S z^k}KA(b!Rk0A@Ur(T=`=^@hG%u^v*3n|mD2dUDp&;#f~z(tBUpypBO!qCq!>22jal zRX)tEjMJi@Yc)rfNVzVIld;Z|3I>}>gLUIm=2-X~n!|v>km$zEu z&h*v2dIU|CF<#)I<_>L)J{!;KrOMp+0A2&T$O!r>E5Rx(wkl$0UkS|&;_~>(SHklp zU`grh_4eHBr=N1-tVa4ylJOyHPCknM7MGoQ^6kI_Bi~e-BQJ~4Eee03qk~<>3JkJ0 zeLX;a($;kCXdj~s$+BaBu(rD!c%Eojo+y=G-Ir^X{M4wO47iJlz-^ia*>?vdQ zK;=`Q+E1TnoKJ__9OFDLVe7_9Oy#95VMFy8vtp^)a6RUe3)1;4UEQ&;8%+mg5TU-l z2KbL;B)#s;***Oky>j%A$fUN$EJtx1{kx6mAKtpxZG0uavpkQ9?|3_9#XD+WB~Q72 zalzKvkj^jl5O zpuML%I^w%=H=OdLZ>W|EtoT6p$I;S7prtA2Xf{szFxXk@vP{fRE=?|o8WAQ@p-ssy(3AKu^x?Ao(H;5q=U)l%7HUC^tY3=Y!OtQo7Ix-3ddRYh<#P^QZq`|DE)>hcSTUK;r$f=Dn%Pj)p4e6vi5&-2;NVlmmUUJl z!&7R*8lPv9qvI7@Ua?hf-y5v0E9;#`SV(xYH6HevdKRQxwDGwI#q#VvS@|=&X<3GE zqz%uzbzOTiI4D`1J;ceL(P6=NIW`$G7OqjguUJM52Fhe|Fz@nD`gZs)k&JaD_Z z>R4m0b$g=QA$qB)lJ)3iouiiz0i8dQZ%0lvUdcB?{7>ZFf&ahMs}G9e4?2Cl`vK+M zs_3tu?vDwb)E!t}l&Rwuy)@gWFt53pQ`mKmpNBI6ZQc-mX=l0-`0iwxnKu#dA+IN|nrWr< z+cM0WstfBIz!h!i*t5^bb8*9RaWN|IirxRIXM)6;jVJ%rtud{eHhR-zcdNunv59;o zf&(@y$!GFh)jRF8`}v*Eqxbx?7`KC6nqOMZ+j3sbP3@!G=tlDl-UV;q-ROVxJJ#my zeqsmY2&c_hCIf3(yvaS_X+){JKbE=j+VkAwe5!ph*ZE95gmkV`dCvElw9=kXTDrY* z=9|hW$9=kGy{cuMeD?E|9;>t279+6K`nvSk6QO@yT!pJOjhOh9d2a87U%d~JN#irb z%B$w{)T4+x1$n6JA(r|q`5x2Gw9(oP=|WqskJ2Ni=jFX{&x6b&1BdFrXgspr(Q`@3 zb#`S;<;CRlqwLW;oz<_IzZ<3Vo-7{x`U$-s?`A zTy05a_e=S|{W|O3xT3i{XW=^QrpAVOR;-Vs37(5}J_}JJQChTucZHZyBkv61MKW&t ztff7P)$;vwS+ZVs)4CD$$(H4@wkkXb zVY8l%D@G^tIce=@v|3($>M>!HrJ;*jQyHD=C}h^;H2OKu!>p4t>6Sg|vUJ;2c57!! zPdommR*X*{^C?k%xoykgAgPUSXYWmF!ha|yXgwaRv!u-=zE{E4h`w8j`ELqy{y2_n zXWQFT`3Pja=u&#Av-zMnVnb*CLfoYdy${O=%YCF*AH(bYz=5_775ESv$?^EcTkV1U zywR%-y|SuR_DWv`xKHP9%XNQVeX_s!Mt_zb>qm%@rzY=hb~=6TCUJ3#7eOQbw~li- z<_4wPHo9?sn$di=oHqlyhYY+5lAiY+e=1Gd$VTi=vZw72bk6Y5;L`DPUy=!%4i*|K z<|ycV$tHVHMB&-M5**fwO8G~qE+l~RY;Lnhuz%juqZ3D zrRI?=R1Ko*Qgd^q=0Ahiaw2_mCf@{x{9*7~PUI6`N(05ucl0?d#MjyaJ|b2Rxqw>) zmPRilFuMk$GrO37tLc1XdofmHzMpg-(f6Y+;!pZtUf1pR5|8!ULB9LC*~=z&?aI)b zB$zjS5TvxhMe@(0wB1uKwT|`H=gBVk;q0Cc^DtgG3z05 z?w7i+uN0rr`M-JHrNbTt9rn1Q!pn8o?a^V4?3Bq7tdH`%sY{YeQsbFLJNGE?h8|Q@ z&$}Gm9yv-8+!Sd{ZJYV{WSPE}9VAL35=gg*vSyQ0={Q}AczM)$bED4r%GSf+uP>qt zNX*>+Ah~|6x;Rkw(~zS8i9e9cQyq`gpO0A|eOZLa81deyi)3onM}t%?UVh@!ZU;ZT zMw+H+$JpV(^Gp#RT5h!w-pV@R{`Hbe?h)jU{1n;8i}5ry^V1^c5pD4Hm={&vN!qvo zhVN~TeD2kHNmG-xoTj1h-)cEZWDe*^UenQc+VPi(jYaF*pnqLVK63Z%D2I2y(+VTw z2!oX0?XA9WuE-#~xy~CT3jtr}VoIE0vRNKym`@kko$aRzC)g@v$zI^|(O2G!(k}~S*ZaJ^3;6`+{id4gg*3sb{=+LQ;RUg^@!Q}ho^{xd z=%-mdAGPhJSV^jba`eTSZr;VZ97kHFd^3BlRKB~cvNMOvn7G`#^@>~i80&2-{ZtdP zPGzT=9bkNte49qA{zZ`saZ5St(lO|A-LZahRu&)cNUDs*G(GB|=8U-Genn2!$=lg{9y%(_;{J z^MRu#S4K_pSY%o>VAQH7Mndi5?+if#z`jSoIaPu+bE0Qg=iiY8W>_% z#RbvIj^bhL`LVKAC$d-MD`Fh{IIv~B&;EwIF8ZM6TzFPhGx5UfXctvSI}bUwOkX*g zGfi_lPv@`FB$gkyIxgqwOvg;&=c7}pj!WYtqN^_h4#}t1LBFqhw|*|N_pVyyUhC6j z0`4fYim=OjW4oQoO|;8YbkN~~uGXFxc`hrw*k0u8hF4G5I`C4Ad5`CEBx&oGFRS;c z;o!G%4(~c~Q@c*ovQN=#ptqMH+F;s?;e=b`_@W$Dalee!dpyc{;{PR-(fzVR>9f)m zmtr>4WGZF666tkMmOzHV25b8NyRP)wxYX{JO4>c)&vb7up9kQQ=8`r{($HzdogQC! zd;zuzQ`=(dykldZ^<wL@SrMjfKqz#iaaNYYA z^9WqhT++HFZAab^81JR#M^Edu5~re+*LhF#_q;xrzHUB4pyB0Bla$8lmPn{|FRP0R zrXAU3)Md0hdX3!uo*@y|EMS-9uwM*54+igUB7ZJS_H(wD01yBoq@-f4eF%JexpG6Wql znYfT2@uR#pcpy}aBQw@ZB631zecmNOSH;%yjy`whhNtEGb-5WTH)MrlPiy#Qu@i~q z-ffM;RKxpXnjw8kj;3za=pE(-*VLGKf9u#^%lzEi6P-Q@_UuA7jk+f~fq~A$`@r&H z@vwK(KJU_5)Z35|D7Sj_UxBF&Dgx7KFX&K?zZvu>pK%UdwTxs5`lR;@oymq)jMcuK zhfD*!`8EPmyJbngD31L?J_EgZ$)uc5J?<-AJKbo?Ycuy-cZ+;U(*@XOoY9LC=A!H9 zalCLzH^X{9UAiQe&!4?K;l#|~}X zJIzzzSZzt2wsoU@?@C6tD>@{(_I2*|d}JG4K{R6cSi82)a5VHI{xTX1k0Sj}mmYo` zx|Wp3n$zVu?Hk-R%NpHU67!X7*Yt?#dD*-!)8+8+(mo`mXW{YQka#a;y5${8ev&+b zgn-he&nlHk)Bj)@FC@1h7JVMX1Njd4508qo1JB0uDJE;!K{qbd=bK(kvCnar-(Uy_ z^UyDXEHmpOZr_E6luL4Y2JJoF(GfwHklpg5ZwQStRLai7>t$dn46T=0yfjm-Uzh9Z zm%muG4<5->^`i;=4>|K*+=h~ZES_q$oG3T=@6jJee~|6G?%J|CU)CZb^9|4z=kgS0 zd$Zuo?#((%wrrFv^%MHMfo8kYfRcd$ryj$m)+rtySOfXuri;&AWl@+?y9kZCqhsys ze9)eUI%;zTFage`XaA+&;CpPbrPWyO3Ha=*Mb5s8SZkUyHgvYh6;I-`JK-tsY1#qx z+}+zneBeQlIp!mmGFD15Ynx-g6|We)D46XkUit+F$=R?npi0HADHgf=()?FciY}$8lmLhb`7|?er2C#BPOrWfJ`l*FF<(> zZCg9FBVgBn#3?pK1vK$c9>_(=c<}z}c70m31~h4_nOHDe1KJj3d!nB7xuz~_cf@zM zDz)-{id2HbVLcgrs}*}B?~2t*jPi5v;@&Dw026(upV6ngBW?hwJ@1s;%->r3+0c>M z$DZ~V`N^BkV$u_NB|Tb;1NKc^NquRvmT_yMz%v~$-GVGN>=1N#SF~E*70T^qId=h% zVx8<}f3LAro`y?YoL5jj39?M$x^d-ANjv$K(wH^kAm<4q^E2%OJ_Y+>{haA9@|}^R zImx1MefRCk>N}evUc<33lfIv|($8c;55jax>|eC3SCPDaIdgPmHLWUKNf46z6?j}% z?CF#AZsR1qd05#ffsZTj5SPH)Q$4hJKMx5cZhatJt~4j%66g|0ywv6xHu72?+rlp} zZi{#DTuudw$GSPXvMr9FOCYt+%c_BL3Ctys9>!SVtqMP|EZ&{uq721ZUW(5G77d@J zedN>^rjtg)e@Sz~|DhQ<+)$CDtW&9`!4Y=NP$H z4Kg<$Kl8qHEZl?plG)NoC)TMPhy1`xX}@#*vwA<{7QUChGA;T+4GS;Z!&bQAMM^+CCKn7Z1K`YOk?b;^886^D|3sQRx(AI98$GZ zo-t03n4Xu{PLW@_jwyeOm)VD7n_iQ3NoB)j)@QC^BO~L?`uRg zSpLI|O*-v6kym{$^a|Kk3{`5`f0Xq-lVzP`-Wb=pk!oY?Ka(wv=WyrKD|nHw*Mi14SXT$!C*YZsm%12pvxGn zGHPG=xv%p_Dv9IIb*)E%8@ds${6Ozh2e=<9Y5Kc<5w~-;kz4z(8M#sV_#CJT)o($eA+Hyb-&pgPvR!nHq;JAx&8W>`HJ@^pl-^bLa!a+~8v)zKu9^jnohh)X z^lCfQ7W~AsWkrA%ZH(O74Y78_2UhFS_+ePK{Fxd{!Tgj1`5g9C$@Nk7Th4ZH-Gj9H zblt0Bj*afgC9_;|nLfE)!Buq0b;+GaZl;mk$yg$OlD^+)TJRWZJc1Ch4nfViR! z-K8cgKkbY>3K|jx{ip6YXb_x-{cxA*nFs3jM$ce(6hEi-nF@l}!SAykm6P#NDj{h5 zAGJSv34IKe)9JUzJO9=Dn0ZuG)5k2z@+!#s{ov!&;P|sA4^U4Vt9~4PYVtFt zVOFcJ*(%8*`TH$lp`|$`>kJUP0(7zD%{z#hr1LO+10R)qvRQcR&~_*Ec>i5T$9IUc zD|l^l4)6)U>iI7Cxp6na+g^|UF5jm-&mU1$JNMN7v5Foql0C_hn#`O|A__6n%2lQ)Z{PPCJi+Qc z%URH_ac^!XnIY0gFX_{Og+(rWiQHM0=d64xUHcz}eClVJWOw<6IdjMvQeMB;rSr{q znAEVT)=Xs!U!$KPbypHfCJuf;sn41otvimPv+7B!FEkmB^t(htP3{6~-;MQ_$Nwke z?vU0~4o<>H#aEyLT~j^NJLQPL5JaF$-=mm^rwn3PFpof=~hu|$4(CAQIaF(Hybe@8gEl~ zLa)v8Y`1%xH?y~Jm&QWt=F_P0GQn7WQJ#;gG59a-t)iZKIIgRl&7QQ1wa+^D^_6^B zIL(*Bbo$WeewLZnw$;xOv3cz8b^pQ8h@e2_QNoxtl-PM) z>&Bl+C8kV*s9z-}E%$D|40zz-7z<>E0upQZINHiOBwb8Q1Z+A-^=lQd;}ZYLDtyYf z{7z@cxqhYp{BG+}+v5x6zTh6gusxr;RpjKBBis97EvI)Y@7v;hTdSV=MtA-~nDY>{ zdy%|GD$>YIyf3WUp^~8{FIOVTKIafEv!2+Z#SEr(jwMOtS@7@vIeM;tPsW-ieiD5; zx}(==XGaV{q`h7p*}94@y-HTadINi$OD5|?e#8gKqv5hwe=6(dk+yN?X&Q=q(~gVt zxMwmNj(Re(vdU}Cr=7*7o>>|JxBWys)Dmy9+&4^*n4VYTGY>xt=S>XpB-?g6f9EIp zs4!HT8J#hXnvK3heruV>=e4V*IrG{UTlcG$g#f>c9-L{j^qnr5sm++V%&-op)px98 zWROZoiOd+vTT_?pGIQHy=Fym&S6<8RGIP^prWP5d(-^&A=Y>_iHD9SACcV2*Qp<%ca(te>a!;XSv|ivKsP3H`fd4z^3<2)Ot)Wr0V>xewWw!x(vAt9e=W%Om#6W zRKrVg8FCrQWyt)m8U)&9=;q2$O=p#MWSiT%Y1#cP**-LvBP@=vT(>8GKS-i;o1EJ; zoFTU*RwtEU_rwq`#pK+Ex($s{Vs3NGY$yl>9a`Lmx(%I&4c!q^K|U9mWZvVc{#)G| z+yP!QPl8z~)9_crw<>Bo zsEa$+*)Xl=)u)=vFEpj^-#RKh%D(;@mKC5Q-(&}?{MgRN9LC2qY^=V=&$grnem!U~)<3gtf7koS8oF$nK6+f;H_vM(8>UUUE_Ig7bIIYM zDiW}$FsBv~b+vP}eHMEthI3CA92;J)g{Pf`S75SRk`JO)dpbo}Uj9t#V_~ypmX7=tysOQ|1-H6-UIi7}V<+?AbxZUX)wD)vJM|`K+ zfB5F*N8eC1f)98wMk2gRaBY|1WlQvfkSDrVF+Z{`E1U9S=r}?gIvamFm2{x>4<%Wb zLAIDVy`$LnnSR^E=sm4SDnUN#ojrL&``Vg0)P{>~B*)_$HmCT5WRH0e=mKH|_DVfF z`oSmg4eM01Y-xNL5Q|3@`6idf;eCj>cUTRx9jjltd_B^*U7;JXsitq31#u?*(Xfe%aFXI7Bfu97pSRINke;-PWT= zOGN*AqKXlDY}W{uW1VJO=`4aLnxYck8Sd)b{bkD_Jnh;#mDy7GQgU~p2*={8JgVuI zKcbAdz02aiM}HjsK|21gie#_5iVLrvp1x`P{66^l&AUiMGw&_N%1mvdXJ<`Db2^ru zMys*kevC_hEQ))d>KdBJ;DcfUEa{&9AL!Mo{?qG@pZkhSkjOLrbuMjr6mlAD%N85@ zoS1|dgFJeA&iS1{Bl4XO`bj)vdqw+h=si3B^l#&jH5C@|nr(G>TwNPiM_+dlIK1_d zD`9=49j)`MKrT65USqlf+E>%&ip1419rO3z*z>RDpUm5&dXtC;T+8)`}0hC3XKH2Ah+0y>3dNUDH--z+9AU`BA*32wT_)< z7ugZna;-Z-vfn8l!ghC8FWSUhs$ff3REZROH)OO*%*m_|+5}27Bs=*iAnHW-rBdYC z$(xy-G~0c39v_j^JbPTZttY0#4?9$h?W~XM=nm7hDlF=;nAy6{M@$HAIuZ1=ygWEo zZI4nSuD)El1(Nh0(wx%>56FuFIKH>Q1!VzNEO2_n93DaMM zOu@*k!J=l%)MOUvUy|rJU2scSzUPdnI$XWp^4*n7(_*3Awwecc8rY7Y22p1{7<+f+ zy&-6{s3ByV+JN_AhD?L=6o=iPG8A|Q8<4QLbSDK7at`gCF8?sGQ$YV?P z^jFln_e1`^rn7pQ&CWG@Iy)%JWy)N~nwMmH%00>Si0OGX`K)Md$k`q0|3&aAO3uO= zc0(9;(|iEK6uPsc@Jdbt3hV&&Q}`T_Ur(H31tQFVxqB&*5JG%mCd~-pKaC!)mye#Dq^|8SJz46Dr-# z0!x(0F?u4~W2UQn%GB1TUcJv&8CG{U-BYg9*7rkCDfk2K!4P3OM{s>Pg7aDvj~q)@ z!~@#l9?ZIXFfhbpcgqyxN_`f*nP$7wz;2+jCEbR~LF?PlwPo~kz@Y!6n0WD-W3FYg zs@1c}tC#Jo%VfaBrn=$qljmGsITNRm=lxQjN@}T^I1|^vvf3a!Z{+Qi;&kmksLehd zeY-yNjcO{8hMHbGj=nkic9YRJP&ey8RuIui*PLJpKq&pi(=4?k6o*WKVKYFIo zR?NF{D?Qd>$jA-L0>0Gwf+w<%b`~=C#M5J@KK*~F7XaDN=IZl~8{`%}e>e~3t#x3f z;(*wx`73`;mL-fmw#%z<(`TCRF=Z?`N8(VDJ}(wEF$a6gb*5>L)ymU-6EqvK4AZo& zP6;XeNu4H`3ya?4)8@0Mij?0anvm%!K1JI*Y%H7C*vRHE$tB`La?59@OxL77|NZ(q z2i+c>i?(&i^{z(P>E&|Cuc~w7y!Z0B$#pJz?RezTYnan#|L* zzU#9)u9xQyY+n(rXjtTb8+XTyIkol{e^x<2h!RNRj zpJ_D&d_D39a;k_Q=MEBWN@jNi7uk_rG_5Y3TZJTMDe)>Y_4%M%DXXS`; z)0qq_SRNs#`=-+%71Z=VquV&>Ig*4_9Tn%xP3tw^i&Ezntk#0D%CAx@jdww9)Z0(k z-?sQUmNPH+=Uw{@dv5E4ZY)O5EDt?@Icu_8o^QJtU4=bRIwUv9sFd%W9jZU-Q_Y%UVBHwgcRF zJ~H|&coX<_-oe?sIxZWDZtCUQ5l-`2z9xuW4?-l;)Y1_>+eDIb-(or@?TiY%+xbSb zrtj9ry8tOX3Q_LA6n%fM8n7q&4S#~}bnj#-;dFhFEOx(}%dBBM%%J^~^mchA1a~d3 zjr6IBcr1UGC)M9mwExr9L>I3b*;{VFA|R8v?cggs7Wz|K$r%}Bc&qP)RK^LK{Ixlr zD-oyraHJ<%CE!9JUbCtv{-N~(3#nn*L_`r}6^<$#-2Xb5@Eb zKGzenNvO~DJigV_?VfvJh&5R@M;6;G!S&NWO$}dvR-@VODpi5^B{eX&=zm z&z!sebw~2{mtYTF=Ex|a-4EsGQ^EV2Ub)ZTXtw2OKe5{rF zUjMCT8Ad@qCys0}vnKHssd%Ovpn2Bh{OE#h`CE$(?n)Qhe3)`1aXMyV8Qz@V#+h#D zJYMPdo{LB+DpP&n=-X3=hV76sxbeR zxTLI>q?jjZ5ypoQGvqNwdlvO~(kkEw(Fbj2r8f-J$APg>juZFwx-XhO7xZwz}%izBS=2 zo=JS+C#|bPt;BuF5&ll2m7L`^Z*Ir5deY|o*mt7K*948Pox+;x)O?>Ft$Vay9<4VL zns=YTPUpNE%fC3TQ4>roez>4Ixghmw+OBY!q&38<=NVsY2e zXEETSSK9U6l=bG-7DK8n7N_}aie?SQm1>4uCf!4I54GGwMgR2G`+_7z9soMAt*^ia ze$-YVOHm^lYD-_>QglC+XO7WEv8*n9a^ChG z72Fw3N-1*KeB)AmGvCSf^DaD^lhLoCyTaEx4*uPF_$1vv-71x^8YDMz;gREb#2l+~ zc^x9JX|`!s(>r5L?n^z(%fNbUnDLXJrq43!PO2&Xq-wMBiQ4HIc)n}3@?G=eYfvfi zMwJsUq=&3(hUzdFwy}~dN)Yh~=nz@grvh*p|qMcWzJTo>Whnde6zo+w$5LMIn^o%59|;|$Sf=zM%sywXycYRhhZ zEoQOp7~Q_5%h>#7tZP=nm-2In6b{rKjIK{mb{b5;BDV&>{|=YEOcg} zX#&voW%mb5GrG;|96hjVR%)qXnKK)>6#MXAH@C5qQdgY9jOkP9*UR22hSJHxTO;cv z82zz^dz@!K`JCfoU!%_kR(7dQKWO{*_jBBY{M3mM8#*dY*Wvv+sEv`ck!smU)YQXN zjFtFgk?m6$D(V8y;`UO&ZIr<;HAMx6)5CxZetxtm|2JU;A@yj;H z5|i`Hy#5}q$vd4)VoT{n$nD*=X9=h%-UFxnQ8%wtAQDrtZm3OT4 zG&YpwwE8(vd$5)Jy+3FW{;dR1dv#%N)CQY!`z}o*iFje8#GkX?4F^^4RR?udjmUp=QPRH=N-}SQH zO=dXn;?ca{*MH`&{5$4SQWNQ!N9(>`yIVO5A_e`{7Hyqn|aBmiynlUAFm?HVZjs86BQXu~PaFRf zegue2sTOr)(X)p0$Qmw7z6}Q|_a$AvUB2fb-;EzT%)fm&_HWB2*O`$wl^I!^Ni6qo zACCRo+4euhI4Aj!`Rv_PgTj1h`l~ssaWQyO?k9o+#7Ty;^K;+JTZH?_GliiTJwwZ& zc$UsFz&5&PvBhPGPr&l{J9hM;lLj^9pnS|*Hf%hV!!FFv;_U4TG{-T&xW@6<@L1?x z39G?aW44Z0i%qZ$NqQW5Qn@4z$%(CxByn~7@-2>n?#Vd-Xd|)>$I?Trg=X7)yT;O4 zC-ZXVba(eV`25V}Jdid0UB9u)=jxh~`a{;Etltl^I+R$+`K_+fv}o>i{cX%DjmNZW zOY2hpu4CJDabv4`%}8ygcpezV(@#Bc|0P)@O9eXjOtN8?vyno&OVNqLkvN+Ik*=FO zj_^Ls^PEFDA1ROV!*nJ~jzQCBEy_OGJlI;Zb9reLiqF&Vc5(@6Yr|M=HU0dYX*2)m zv=+I*a#Ar*zbR}NISy>OO}(?JR*lq9JG`wLV%M0iG0A%^uX3EboL08=ZON7l~t_nzhR>sj8$7;|as?rljAC~P|wETvl78IYwtI`Q^#4_y~l1%tl#b+>~N8_QkPx`@34%WEC` z?8QszK6&+A5hxHUp1t^@~uH15{sYowW5U*3~u z-{VI4g4fv{wkx76!Bdz)!wh=5AI&3fbUWg9X}xc8N;0;|F8 z2n@zwM*klDar6iA7yl|g(al>U_k$f__Ef1I*%5+5z8zfSAXLWhs9!37or&WF(+XLd zgh))+j+^UM{*v?U7wfQaO`29X` zO^+S?p2}l1`yP4w`8JW$7bnc!EA~pAi~sEvtS{bsJ8NT4W3_6B>btx=ldov=cGFI} zu4r%RvYCmf`VkY>k)KKQz=TaDZ zrdc=q@@T%K3t&2%-208MIv?k%oMh{SwG-;*K8&qGlrHjet~DFXDzyrEl;^cct5%yt z7p%R&{%W3@^={28lA3y??SPGLRpi*pv?-Eus<~1p(&>1^h9}KJOwFs`P~We!;8C9o zb;WWVPjt^Tf5eV~cg;3<-Eo?Lqp8C@<$2V{J=b%`)1D@AcUAd`hAoeK8d>(KVpKYN zjq`BnF7-=yB*ps$-Y8Yf)H0WI6x#Ux=ID9Q*?3*EHRP!@oy|gMY0J!6;rev(5|>6z z|J0L$RoxZ;Y)g0ksi1y1=KH5>&#!cpGacnJaK+nl3CjPSB!JrEuk@ea?X7CEPw5fU z^RiwM9Iw6q(z9UYc;AO1eIH77VyT4Ql}@yd)#Wz6{oGwEvfgguESyx1a=fRF52f4o zX~nzJiuCs_=Ru|VC)cy7mWrJw({3}R8mT(Y6ws>MkuUCUfbT}tO6r65FI zeEwK>Kdd_qEIg!iOTUNMe9o$!ecV(A^JLt$w!aTYIYyA~@pECFABEn6)X&P6g6JEo zpNznsvIp*Q4)Hh_BY*UOA%j%obGEbNUFhkKRtxnVNGCNZo60DF<@5B(E+7}L^m`hY zI97_JbuH~9=RR+G%+xdf4^@?sn{Uo2?-j$@kejkjGRUY`nheW0Elx_A5Iuh>ou)sB z$?AF1jp(x=l2B8B`dfm zh66q%cz*L&Zov%ChofXxxjch8tvUmnd8v5`*xoq7psS|NYUao|P%&)SY23bT-)pk& z=^3>5bVo;Ik^@<-@}qC)UfKi*XCn<;L8%OuNhEPfO^zw`z^2(*YUzFmp4l5oXn(AN zgv{P2TfGkKBN!v)@y%qEQXb)WJTpXt*UI1h!0BKXd1;*7juzV5$LlU`t_?MbA-*k@ zm|0dYPPX__7RxGz&|l`=PKrHWc+KQCd_QWG&{Bt^zX`Fi zeNy}Wdh~a7iYeD!F;=$oPd$n}=5S553{CYQ^kKhW!7wk=RQ7berU4&%y|fl*d^q;| z?RC0FBSV2$6R-b)ewS)2mz>(U3+p5~<#nt%2LV6ly{yPPMM?1Uu`%GVT~bFS3>B@O zC-XenJo039em#}0)`_-!YKhOIjo9Wo=`wOYu$a%KjgDjs$;gmF+|6S8R726<1Qt{J zz4)zkyJ$b@?_*hla@5RuuuWuA9&hXi`;yKC^hpeK$(wIIc7qYm#^Xnd3M zP7a>&Uxj}0>!U}PE6r3x->v9NGCTK{@<{S*S#4K-0OKZ(7kto z&rN(W--vga@@f34`xWx}V?feh%jY7#q{kF>;hXAub3UFkzON3GWOd_~cP4VWlUd-D z%ks}4v%l&Xrx{9Lmjwpve=Rvb&v>Zbm!y8K!*XSj{0m)6%5h7d5OOH5>_Y4BWmt(; zVPZ(|YSptZQ7p?55Q4V#lk9!YjgWg?-2 zI`0i#7gP7>00oxDwoEbI2vxE4j^e#OBn@nd?|jftCXU!%$^AF}dwRu_K4p3b;x!u^ zz$ZBvf4H1U&3&%rN?lF%VJknbs9W=#DQoYh=1i|5OZP+F?RJG8^}MNdE7;X6ClHZE z@`BdQU$pbRT1PUxW9ombqXhmkT%$Pc!DcW~^HXZ~BlZ^WWs|Le!NlG<-o;Y#StVF+ zUFPeBe1%J01N}740|Gc%%bVuM%K3i#<4C2sTb|pRcQjan`oWE|j6!+$9~gCS^bfhF z%MY1jDo*iIUP{hwecInhNBVcUggn!}n0N{fg$Fu$B=5K~B*!$phWrQJ=hxCxsplT` zqIIPo+Mz7pBi@A1rkgLnH`<G^G*=x_J7j$1Zm)k3x)_(5_5kvO=s#%K3!sqrH8(cN)11c4p~)a8};cS$S8N zu}9;~QF-0RY#Fmo&u}@@=?jgvgtc<6_=mg#=mPS!r4`{)_3zOiM}H7{aJ^NfIgg=) z*I?-7Rz(fF=O1ro{?Rb-#dg_(KVw)-xn*p$&*g-*bzjYWH8kF7@Ww!J!MZJ$=<@FI z-+mO{b|N{V<^X&TJef|HhV`XhPW0x;ki$nVm)I`v%{v>p)&wPnrGXqyYTLfvgw&gR z6-Ikic@@U69!_l><*NA0UDeCZnhOAb1%yGf&z!c~hL8kMhFF zoX@J4`bnPqf&6g1q788{V2r}P+|i7aXZj7k1h13a_=)z)>wWzLgTmV<8^4hpk8ixy z9@x(ty`pE6p_uITSl@&1dG58Fx<5l|H|rv;Arkm7paYL9xJfR7!)xZack5M4u?z{M z9%D=1Y-#4Egprm`3Im0|2&lvF1sc+Pz?h3U4@@Alt4`R4ECwOjJA2>Ht9~iTI0-Y1=;<<> zRlOCYucm8GSr*JRq<49~*_r)%X|t?CITkkC(jt$S@`lOJMNSo->gyt#OV^O5L!R;8 z?AvaQ*V7u;$|SW=bQCV{O5+-^yrbYv$5Mw$+m@n@`Q@ifM}n9}Zt0!zlm(A7&O%qx zn}Pq-%UW#?Kkv8oRF;*<CCtx%((d=BGd78>MN-rs_DSxm|-ci zZ(pkkrmy!Rq}rE$(etmIUd9SBZgM$Z*tbHwb0@vSiQW#?wZjqiwo!&3Lp8r48t+2A!-;;v{fVFCer%ir@-SrJYdi+85AgZ`Iv;~0{#htmKTEvJ z>x~lG{w#jdEvt`0C2I{^WVVgA%snU=Yl>V$T1kjrXjcbdt8HuRe{1#C<#~x%$8Tqs zUTa>>?>UO=%TXMu^A@vSy61$zn`3Tbd0(eK4Az;=j=Qcl?s}EjiYdr+Ah<7Nwv=_? zzO482p}P7)+`800(lhm{vWVWU$uH0LA&6WX_8*<`|EY7Q&+FgxdNR`A_{5XJ>p0Ms z#?8j7hz!E!)#sX`>z>7GZ~-k!v?*^N^wf}0GV0L-Zhw->?q*;`F;Rh@b%&pN2Hcf) zgoA&#qH92(H{lsw&*)m$Sesq5T+d=rYsC7m*Dx1-jdQoGWJLdBuVu zb@;XIY?(2!m?rrqFs;9+z_a!PzTy=Ni=2A0BOHsWeZy9}CnED%v)!pMEO?EF88!>P z1sZ1at!$IT z^|dFh^j6xfdEF&Bk3$_(&9qxG*UZ*B3;B7o0&x~Edhn$>aPNhgV9k~}*X}3n;Xu-A zGi)xxtDPjv$|p~>kN0{H{vp>AGq7}@_*L(|uZS)7w7>IglFo;05*e1@MDO@a9qc() z?;Aa#i_tKRoX68g+S`ygyq}f#P*MwWRnE#wxt{qt;C!+1mtt_lS@%puCv(sJKpMZ( zYhu%{f+X&Rxh%QGu8DQiBc|uotc$isP|<@!$l~McfI@5sv{<=qobs5}vyYyAT+QrbgIo7&)n>aP`1S*>7-JBZcM)}MyXxAuk%`61&b@#U z)>K5e?5w)%H0a(er0=etKK6E7zM5mi9uF)g9@v(Afo{}DS&D%XRkfKVn?kYa5PLlC zHw;pjev8U2CKSClfUZsYn|_yTMD}>eWg3%~@;& z9Gn@QpylA?yl2&-9?{=bAJdY6HkE(2)14ABRM+{>-^RDx#sx> z%h=X-6-c#RzP~h^5T(!a7gx(+tsA!Y&DhG2aotyblr{fGm?zh9tbbU?14-qs>W*Q( z7(bJ46zGJ@iS45H+ZwaO%d7dPOR05V`J0aacjeh;+uEnP2Ged>P4pi6j!Z6mo71qe zctwu*GFW_Aimbb%pw-!yYu?c3uzBDyZuEK$bY$T>AM}%)v+Wgo-5fu?zTD>^?|rG` zqt%a94W3@7+jzX~8XLbT-;@p&uw=^f#$_y-pM$=~-VU8a6)pLBB1L(RAZI7cBWqKx zDPL+WlMlWa{h+7&A!w6apGG}NCu*e1^<>o3t|!SjK9|f8c`R-QLAh6Y^;n2$?DY1T zH+tl{6E9{Rc+|_3wuj@$yFAZf*iM{GWtuvTgEq&r`*w7<@dxqjh`<|NMa)c3pD*>< z?>hc$FV(81n>gIgA@u}v8}96^A?&Q>%AM7Zlxw+0ek_jaLNAHBCc8t;#xT44ua-+? zA5Pi!Yg4IpIUORW<-VmwLxws=FVlTXB5jYse;KVt543Wv3*(t8oIX|vLe^-6OdCED7_N4o~MG2LpOHh`4V;9inZHu58hz7n zXQJ2kIAlrcWGH6~65|--;-xSZaF3s$p`}Nbc&?@Sga_j@v0js|(w-)*C<(_#lE zFM53}=e#)xF}5`Q7VRvZJIEdXrI?f5jS5G^A|9oy<3hQewUyFFUH&%a-^Qb~w}9Pa z>`XhFb6>8T`x2j3E_d6ZHW;>cX)S<#Kklvlt|h8uR*U@HvlaoLM~&{%g7IPZ@*V*8f4U{>-#0wf-eOBq-s*r}=0wXTbPi z@gK<+OlI2Lr(6xTz;K+|W=0OLN_U)j)oawRA{%&qE*m$uQ)xTX*_HjoZnSe$bT*^X z9H#DHl~ei{FlA;rlVzfZ=u4p-4hI`TPNMFcljSV;YRal}>7#6YcFK{B zX}E048;a;z7dmUxGa_qfmZwzHZ!|rFHrf*L+LW_2`{)~5Vdkkh&bt~F<;0Zqd%RbH z#?5-p5z~!mF1fqc^1{<-6p3oHBi%1w4Zpk`!FVp5-g1M?7%@F@9PBP#BT`atr@bH3Zfpz8kf$c(X=^OSGh;7V9{bs9ZZ@@eaHaJd4A;TIXc6D%CpWlKc;8 zMX5St?~|(Q3K8HTJ?2^FqsBK)fcQHIx2Q+uDj!`RC&GObSZVls53^(vG-hqmS|K% zu;;@AaEaNTOos7K4Zl5INp!C zrdQ>>kV#~Gbg3-<9I(~5 zVx1wcIcwtos7jJL+{@4_9ORWL4It)c(s_n#od(@`s824`HNBou;aYUD-FItc8;P6N zw*?Q4IWbHGp;nTqAP4$8GA}G^yPj?k1aT)^ogY2EvgYS<1udeA>aRB|6AiD2MXcT;ZhT@tZ{x5vXQ&$rB~V85>z#_CHwJ7~DWvCu=Ty6LPhWYN9K z>uRfOp3+L6C9HIL-e$ILG<FK2&9uZ)c_ZTJo56(qeF%6c$oNHwT)g)Op5rQFK8jvB4uOmsYpX zpfPw$9y3$-mHL3(mDw_PPiP@BSKf7}MCQDH+EKyHP~AnZKPtS=6^)RWh|vh$hQS8Q z=S_G;>bm8Q^Ne0uj*qMbeZc5NT^b>j>QFINob&${VcEG1XmmNsN+63-<=T$)vWA)JV8?z_i5@R`(a!CS9rwa+wy-Tf{%aY5|X3|Y8YNfkDitvzXrf8Ut4)_*|W%4{#v$@YWXO0Rxw%=&E~$+Q+Z=&y7Onk4Cz1vMo$*H9PfK3PQ{*P z5gmUzvu2;3(HoM{YshcbIU$)4Psis&aYf`@UG! zC9g*E+7`_-L^m}w59NJbZnLg?EZl^;pz^spwNf_OYqgY# zA2E~jz-RWZ(u-mpFH4`nyP)FZZbc^y_vqZCiyh^ySH|z^bpxBX4ljWRZ(Uf*SwAj& zH(T~5SsF3t9vMBz8@(fcle8TPoubbQ2p#<_FMD}ERM}!xP2+h!p4w3B3v(N*xECpB z)?XYsE3dK9WA$|j*r})PLIo!Lwq{=jhEV3mqV9B{J5?jDs8zf z%f-@Z&lo7>y;WQeT@L3hhjd}4CU>hMW9D+`ayWlEv?dx$uQOp)^ew+UzpE5lk!n zQ6AImdS!SUA0%A|Bl?n^NYY}pR;&=L;U*ain5wP4Fd_A9g6SSVvF+}R8RO5iEghWF znl9^xwr-WBtqSnvL>=Iy43$fW*9Cs1dpytlZNv8GxiJ$m#aYR^Pi{eE_Fi4wn8KWH8}*U- zPUZG3ml{|OucYbTOvubtWTe@r>y&xwl+*`$A$hPlGxVK~pLEH`UBzg%?4MeeBX;XT z=kreJhBF*jYtHsG3l(L?I_Q^6(__W{b)4B!?4f(#_~v#js{wDep@%ca$HOLyx9-jddgplDx%1h0ehBjd;bpK->?KTFi|lG5 z`j_f|k0c)oIoQ!LnLK|o5jC{W@$-N(&_8Bl^vn26H*_X@I_L9%Kg4SWi zxvwiY(lu;^b;K2I=-9K*$XCJQR{_#$c&X{Q7(JRdSJOWROrUwDX?7@=+c+(RevvjA zhdB02$;VInoAm;|b!YUwUSDMImB*e@mM4#3d$#>}Hw9)j)Ko@K>d}5oYno);l^17m zXE`?EvQ_)63>{kkcwtiJ%%1kimgRNI`(C+h-E`TSL{8h-sv(o$RG=O&^_yu!N79a# z<-rFsi}qf>PxRS`z<#i4&Rysl9Gf9%NW?n2csFL%c68*UPuxP$09#MPW*L{(&H=+ z-q3r$NrulP&6bt-DD?WGQ05pdCP(#567XA+Q^o3ers{0WW?8>X)%Wtqe$~3gH|x)P zK9Ee=bjh1*+F+K5)Y2YaP2cs?UUvWWz+nl;Sz(6sj2pH z9Rm)${)p93iFr8IG39mJE-|-TVq(XM@>t9z=C(@==y**nv`frwmY9c%mFQ~Ye$377 zA3a~s7m0y8L;sJ`$|~0}w_C?pX9SlR*D+-X-owBHc0Z@Qzk@YM?MPDRPNyzr=pMB0UPq- zQ&#<4ne>0^9N-53ts|?xp=rvNhes}9^X}{W=aO*po1FV$^6K-^-#rgM`uFIMqd#2x z1g+Up`b3$?vvCd@Hq!UXG$9FxW0pAV?{u3k`J`%?E-Zg3_QC72^l+e%(Px2u6nkam zJl`R?`nX@u*z@G+vTbX5cl2EA{7`&dRz3U#ID5;kK>kw4ra}Qtvn$4S{0rTM#)0=^ z{RX;Zayu~M%5`QQ6+YFKTNS&{vi)UkblI2EWoWKO>vc(naV6yl0 zS6~2{e3Dg1r^5DmrQh_j$NnB_zT$=|m8}wCL+`xRdsMev>OY?!>n~OSpPb0@T1|_6 zMh_3q*AL0pH%|)d*46!>Op@*ewvbEG?VT&omZTTKZoo*5b#z#-$?YsYwr(2jZ$!Tz z9GrU6@*HiKUV0w-QxQka)AukY&{w}k&$ut- zy`+cbZ|KKyHT{(LS6QS#lpo1`qU-mG;1|UHQA6#U=l?)?V_sridq+{{O*H*BR2yC> zQhqz5N22lHYWkp*VUv~-9EwY}kCEf5Rw-`B!0J+sOO}xCL0}2zj#CN&c@?rKH7tss zB`?@;zGK;0kfh1?%+EOvSjvI!bwrP1hiIy3OObBxXMZ#M+5ambZ-&tAPIUId1Gmp7 zdwxYpqQ|(^FqYdhmn4^@rh8nJB<7xL=OyW=e6L(xC>I`=DV%Flz) zSER-#a@})Nbx$KPlU~p6Ck9)TrSpKY9xKm8mg(S=U$hk}2GB&MUQx*#1{i~)E!Y|9oK`g||M6TH{Q ziz3g)cWgEreKFaqb=i!^Pp=OzKGoal_2$><9Sv(cnIW0RpCnVtohBm0D>IH$-{~WL~ zs}^8VUMa@(EFhkz6WQlDpC?wB-^prx&GVX#s~bi_ojU$t+e`b~_}K9%?JdCXslz`Q zqxgDFzSb(@dIq8lNss8Wsfqcj2-{I`;rqmU~(lh)i+zU^G~=tq*6{m=!R z`4qP0olpHROv;E3<7^aOr!t47Jkj?*XwRv{)I_Wo!JY+bL1j1H2}>i+0W};t&h7ep0q4@5OqRFzJLm zWByL+w`|IbfyY8_0R7xViZwKvwChd#}+bMtN+kni#SZg{XMg4-WUDqXL8WIJve>ujGB2tv&1cpa_ zq2s}!1Q#O**^fWe#B=ExU@h{DO+={bj=mwTpLuzPXE?G|8*fZXW37C`(Inqfs^?}& z6cY>$%fga1{W!mt#GE;@rB!(t;zRRDR=J84R_6zuD~xONw2-Yv$AP8BZC+`c3q9fY z*%na?8WWglbEQ(Yqa!0bCoO#IXT1xe3D*?O!Ew!}yCY8w+>3Y0(b3;p`+@Inj178V zfv&;NcYkb%KNjWV>N4~=APh*7%h0a;fZNkQV}3G3_k)MBclRqeV6KU}?A7|AQuCA| z>!9zt=;{pNbwizyBD@aprsnmj`~~xnQvWD=KTKM%jy>h*c#bkX)iJ%}^J+0wnx|hQ z3CO~qRQpup#e9@>S*MMIP?x5$HL8}h4TUFW%c`S;2a zZ%pjfJEDB6yHwv1WvE10XVY@sz_V;*U`KNBM$dFp((rrGPB6`>;wAq-OD-ZeiCRzl zMk7<+&zluPlzSC#dze&MkGE~vjnZi6rJf)W@u8yCTtaf2L|qfwB;V%F#NSb>K=bk~ z+sI!Hh8Vd>QTMzJcI~|+8ojjfY1W5D^pg_kQTQ@7(__U+ZmVu;R%3`C`?$JBFV`JW ztGKON&1&u;wu<^)xQlM9;Gmz&veH-45#tLX_sjC4x7B3?T<>lL|I8z77%{7!f2ze= zw&k4BXgK=BswrXCs3NEH~Zfx`U?6W*;5GSzn1T5PWHCAo! zb&tDOJ?{Qi*_aD;)UsZyusU~z3B=^c~8 z^qnplyf?16D4(FsJY{-_fQDUm^yh%l&L@^DC$~o!?45x{F?|Ehaz{wQ6acI9LICd)%Ngx%3|S^Pt>_Q;*W52m7&Zcx~$`8@Y^W9?6q z##%YG9$n?VB4*dhf(2ZBs+i5|xw*^uk<>xr#}T2NOM7p8+P=KXG5VEuM(HZdeL{~w zhD0Fqk*^1V!?IPu`E5rAU0z@_=^X7$C-PV^TN{;}PmNqBBMFzI>yx90p~eITc`0|i zR*r_w>Wx~+n(RDn?p*BORxUHo!oFk0!3+5wd(sYIXxJF+ z6$lwTSL=I=rEB^xefbGbJCmo)BOwrB4wG7NtmB1NDUa4}0Y zk9SSFxd;V4-sz-qDLn*gPCNqc4fZvOiBVxiRb%RzMl9@cV06NaD3z)d1%098;`Q+V zGW5yal&(3^k*M1JC{0!C1vUMi;vSgv!W2vQdWLvCv(eMZEq3(mm=1~cF?_qb`<8js zK3gU4)aCieVfJuR3fn0E%FBuFr$`uf9(xa4sN9byrobj2>zhaVx2d_=C)$JC z)gg8@K6_A3iwC=;U^}1%HGP(IIe4n)Y`sYqDF@9_Tox873&d~R9>3lCjLD=YGe2L4 z9&Db2ZsYXsl@IgE!T2nzNmrB041J9GPAp))RhK1vP|03}Hwe2cW<%+#Lgp3B6N}4d z%!tjiddOF@RslB&DtXdv5c%$ylNp(q`E~!{_ zs}W$zd}L5CU&MG<VU57l11(lbP|=;m`z_(-X~a>=?qQ*5p# zS#;UJuX4%q>ZVESZMg>c7I}qN*ZW->CuM`w%xLS{m)pgg%P2BV&(&m%{xJ6|n7l4y zx5+{-E*J19#FF!1In8g<_fu(XV@^4zX$Yt3Djt>h*YI4=^jyzXB+JlGuadUNnfXD*d5thea=p}-+1gbQ=0b`bMySYMhDj6 zVtQy!W5#vAPo#XR^>I3}J}h@@eNJlfYGskS@#%&}>Fs0W5u$bNvSW11u;)dFU_RXv zWL*H-oZf!PdKjv`T(TCU1CV<3ta*PqR=kRM(D&jmV!>e?g5FZ$%3O|T;Tn$h>P2|( zgY5gsjCXTgV0w(&@Vc6$C>*1xyJN9U*6aLAF?#BWO;UF;STh#ZTskQNw(<RMZfBG=QV_LXP$ z+I#jIh@0F!u9WMU>!c`M)+3^ZZP%ygur&BpphnZMne_YrM}7u*)yvV}3OXJBy~6X0 zoCNb8@c|>BfvTPh{cV*v8ySMsoR7z|L*m)t90s^D_;ypHZWqqxMZB z^ZuyZHS!RR{J$lOWMwQ8-XHz?Nj9f_(j}qWK|b&6XDPqzD|xZU`cDR_@oZn~=-7MX zGUAmT6=OLj%WxI#dl3ivFZt3wW2+{{pZ4T;N7Fv(mI?Sd_bVzLT_#qSKS(CxDv<`A^7np39l;{<>LnduqsyojF!G_T}VVrldDB$ZYHOmN6#+T8*bU54~qm zCHThQg;>vK7Ca4S9(y=_(3%5V-qU}&mXpDun5T**f!HxTnU#CaTwb}6o&+FHYDXs<* z*nBU28d09T@@lUmAL{<+F#nVF|3+GBUwXB9-6eN-RWE8emj}hTUaD!((EWAF^RG}w zM>n}VuT4JGQ+_UezpUIwzutqP`cdbC%{!Q(^&SUI85u0al>731hF@`HpW^XXt&q>g z^O^B8JomTg^>K9;TI6Fq46NF_itEe0TgTN`7gwL3WIPJ`lAope(&b`x<)Q{_`7U^K z^dI{u-;QgV=FNd)*Tltr7S-$Q+=?Db+N_KJx_X&lMGv(qm@!ly<+$ctUCr5GDf5d( znD;|9Q_b9;KHcfj2zajL?>!pX)ty*(J-Q{o(<%|ld*=785ce+JyIAh3n7_vj*XeHX zxXb6>^sNcE8g4ay3K_jK{am)ys97IqZ{zmDJFpsU%X^+piA`;Co%>f8>h9t*n_o(P zVmHmm30VK$3NN8t^8U1_o$I%~z3|((m zo2GVXRvi)bYnBJ!D)!}`jk`H>l(brrK1G+xD8e0zy`S^0R5sJn)V!K^I>v=i0J?{? zBXA;bGEI08@Gkh>-l`_zPmh?MS2Ittz5mj)@ThHQ)OIRF=bcs)ebmigj(^+JIM#EA zbKYQ(hC$sgwu;j*sP83Rze}#{sLynalFnd1i-&2e$+$2U*)t85`C|OEZe8^LdM!P1 z7BD1`=J+{X#B4Q!6}<{L1E0}PY){v@Avr$_ui47Fj?vlTqh512PQ!cFU5vilw&#oS z#IxpVe7@OGp5wfA<|CL-ovNl)Mx(gzF;np;@wH4}5-HJE+W zym&d(aGdMkyWsO|1{?fd?;8#ZtLTX|82$e7h-OVH`A5)>Xsp=NFiwbg67;I=`ADBz z_vRz*-{&^ky(MRNmA`rQ4)q5ff6kHc-nymWS`nJZNm_nJTD6Svnd;;oaM2NgJ*OU{wB z=-%kh>UYs!*V+H6#dN3gVopY@#D}Q&vK|F1SnlbUNzn9(UbFnH$*gm3v#`F?reeFL z8e*yb89V^`g)xAxJy&?|m_cvYj zk$!^wMy$>2hr2On*O5bX{NF9H0m@-yFFVoy@034HUxV|#7qS(txbaA8YL|1?{?GDf&$P#gG3VTU5H_1AX`h#4Y0u;z zgY!{`3Np7j%8%q$c8Ha&si-UKI8A5WdjVVX{&(Kh3w)j!!6JqA!*@!vAmF|>B@gXJ z<@~Rm@%$se~sMS3wW%{ zjq4jjDT)53_jM|(?7J(O0_87{THOC5s%?L7uDtz-79pjaCNGAYOwP!m4Evn-~Bw)pHeSsogb+Y z?e2zR{cvk)4*OQeGkFOh_jE;>R`2>OL-n!jO;=UpCYAUEwOf)0o7IN}4$2Evy?}_q zmN_3|UZ(-6I@Ec_nTVe2T*bP#MXwZ)PG2c;4fsk~Uk2g#(sAfr5L^0hptIjA!l?1T z%I1PHIgiQ~CY6=;0Q^yBL%$X52#5&z;KL4GygB+-@3RH{5$L$EFTG7au2TQS*(UUb zo?q|WWy;l~fc0)wWS)HXU0NHtS~cs-lN=&K>-RFBnL6(C!us=^0oIECM$66_#H?!{ z#%5jIz}U)>SDZTHwS13;BmH#r z-|~jvDV8{v{Db%Ob5-Lv>1Md6)$&T;>c-h>yX*9=7H6h9Ghx|YMzk4=Tp`RtD)&!b zhHjf60|(+Kvi`uHtzYr+gw29wc%j;CdKuG?bFvrS4*>}QNwBUQcRKcH8OIb01~2}X z_Druvo2Fz{jPxhpFWGd2=0b_^;U(X8hasjyluvK${0Qa&)sFs=M2_P@PJ)& zCQC!U7p4c6@Hl7$-hUTR-E@67`U~Afz5jghFZV{>8(p?HI#lwvt0zqN#bJ*8I`V5> zYOe?RCGx>nWE%GFI2XzsgK2XV9w`?KgQ2`u%QI%HoG~knXTY=Cam>AO58rYxAdN(G z&%&l)|4nhs--{*?J(ZMNBtp-JI7frY1Vm_@EpZS(_m#~js>Zvq>J**`6NPMg5YkVl z8Q$w-mf75)_c|7<_~I`^!jpM8vS^hI@$a>-E*z=T+5@RZpp3BJ)}=IeUePe z1{unqXkR^)OYS`RA~8;8rB8OfT1AH8RVDYqc)~|{7ebd@5U%5i73w;-R_B)X3~aU| zu0NHf#J*0;YQZS5$T?o+`lIL7MpPFeHWGrI#y`3Ckvp}Zu z4v5UBJr}x`Gfv)l?tk>}(H}>DPzLm`Lcy;OkN;k4l9kC6cEdB?jVA!pyP@yX9FekK z8fdS&UPjZA0`KbQUA7im8_PsMYHGIhv(&@u!vQ?A>Y3H+)8va^E0%}#wc@jAZqB5S z#WBNSs?~AB-L`nG(Q4KjH8^rV%JDSB67V~TC161`-|UVTV(-0jjEz-t5zv$~?Y|2F zv0nT{qU2|vC@y7=9_O^FSd`59Y-EJ(e6Gh=is1S79f zpw5A5kM!!e)63Q=ubfHu__^e)shjDq2?9|wZr71s?deP%OB;rzb$606T|xb1)7c@u z*QLLk|>*e?Goh@^}X_P^wdNb z*{d#_M%=m;GLhws`)6bSXp(=7H*+~=tHw&wyfV~kgAGw3Z+IbZXjT^ei;C<~dIs%S z;f{_-?J`{L@}qAkmav*<^Z14MCJ)l&azmh43CG_!!IVLg{ePn1ZG znwXEOc&kOZqsZ}{-rWz|AtAAUDz9JYlcth|@59EneZsYRt(t-wIrR$Xufm!lx|zSG zrs|YEH~mqX-U)~5RdA`#V&B|j#Z^>kL|%sZ_;)K_5RMGE|XtJ%7kS;p3 z%eIlrdbfrs7gw*O?~W_y-=XxOVoul`u+&O*qvOks4xhbxER(k( z{qOUB;gc;=KTnHw7O`$@_TRkL4Yr<{fLNC<&lYXoXAc(D5kB=*($}-`PCFwQUDgk% z#*6W_@?7_A(QBowf;RF6={9{7s#EcBqgP`*E!IM*^(ghMoeO9P{W>z{U&tS2f@)JW zj7RjnqMaw=C=wYR=|8?}x=oZR`cyE#&1>~7^SJITiD_237Sp~fPZd@uNMxzDX~#v* zY$qc8vpkJ{&C>s=t<}})WC|KY)}*wS0!)wT4{ud_@Lrk-)**YaE{JdtPJ4CKpF(Ai zOXA{v6;`pKYwJ=ezf4JlPkFzhpPB1KG=$feP5NK>XjjpRG3Q)9$`2s&Y#s z5wr1WzxXbhGn{U+S9~esxqXZr>9KlWI|fH@^JSfpI)sr*#y9PYng9J#Stv5KR@a|D zkvPSEJM_t{$y0ki(DQ+-S#L58d7OVf@R9Vd)isvu;l6d_`9SXlw%lG|%Umn>LcRR9 zV^;F}96g=PZ{Gfou8UVg7ynb<`?2t{J$d=Ns)>z%b$Rlz zo$ENyT~VNS0lTTW(r$)nBU7^_%xbP{y56)=fi9Wr#sg|=t|JrvJYk`Hrfe_O*s!9F ztDn#P+R)kp7vVFiVmG}mR@l=k>6))}M~-w~%2vZPU$RcR{(tt~wkeJyS^u8b8?oPE z-Wf;iax9*N92<5ZS+?1~EpaT_KKD6nI1nH#8w3l;GW+T8{8dg-Rnt8^Rnt8~4`etj zV4k{X=IVU7^2*H8IWdN=hf>q*!geuJ#cY>lALH4F*Sq3{P@7EJl<6N=uZ#8FvibXE zOcz_~W&Af(r;_ZaKCKJI^`_$)(a7f3dkk5IEcy~rU@HPA*(@eU8?xrvq4Y3q)|NzC zhAdOz&>io)TD&dtSHx^_mhO}?n`JgDMpoPYqsQU}u~+%?xbnCM)6_5x-e2*{6SwEg zyFvY|n>X@%Aq_S8oZ|AKrkBges%txj zUb%aW;UB6hVyhZb%UqVO$*z$`ji-C0#U69dd2{`QS4Q1)&C2?GUt0CwX=L!qdDQd_ zm;#;FuuVtbWd(ay&&r&wd1KL{w`J=RueWzZ-AqV9`KZ68*S&UXJaO43)u7xu5FXOD zJU(oVghx~}wwSa6m$7CFZMh0fBQdK+Vn=d)x*HEiF{tPK{iG-KH=rz^F;hmua};$J z%}>wWm8e%$~7|-)e#d;HzxC<>D+wgj;Z;?G|ugxqRm9BI&?qTGvpDeleM(Z^HgqsD@Wwr z81n`~$cEc8Z($!*^Cqir9kz}HQTq9Z=f(EI;|qU_MWjC}H>#Vy$BHZBX0#hvk)d0x zRsRGi?jKP1D z#9@Z9hlH_3`O|G@>o(1wT3mOhaorPFzp^Q_bVVBynUsw4+UlE&M z4b4vz)e5gw%(~x2dSAG|?q_j68CB6rx&qB3KOB$Tz4fb$3fFEmRQVHOcSRxat5l3H zB`!U>)h%G9$2AH%KReYEJiV>*Udpb>BiSSQLSE;3RQc80^3^Sqj-aosuVWj_OD9WA z%24)hRUz+03xYaf{1&xPXCpm9*uc2%D!-e;Ra?c)n3*awGkN9=dGMs|D_*IG((YXJ zMHjW(2beKg+A+2}>M9(!XsS|CtK;>3sb23#$<&Vqx>uHSLixn2T-^37R=s%1*4g+B zs;{&nN96cy;>|z$P?!eYmu?nwHs$pz`JN9PPN{W2cRY?)aQz_nplDYHXVN2?7>xev zNWQ^S$N1FwYpt}DbPIhaI5@dg4erX>y_H*5oF>n+O8Nd4-+wUpDDMaD|EVY{{41J% zv`hUc7GrvM1>OA2&n?-j(lpPX?-K6uQjlC{)w?Qi`E9afVtKTG#imiT0 zT;NsJXl4BoQ;eF0Uc7~7!X_G>P0{1$qOxkWY#TI|_kM1JuCKe~+B`*KA-tw>TeERn z^R2t0ae|S}w_G-f;=b}+^F$gQkW8*)D}1hxG^E{6q)}g|`uDq3=k}9m9lcU~Z=Iie zBo<4xBKeWLRaA$veUa?wRIa{h^MEueAIdjm6;*nB<~harh14CdCE`LgtJ9pC=KwY3 zxI}=u>(aPj<5T9#r>qIm)Sugg7Q@ zuHsbhGkJbi8N%@C`5Qf&aul<-W^eCKYsO~18?o-^^7BaSMVuYS*^^Fdh#wo@8)6Zr zxc<$}rpc|O8yk9m*-+ivcp&(qckxfb*Hc$Xgc+#E4^yZ*04W|C89na)@Hyf!{!d|shOH2YbYvUV0_?Ku9rK*dE<-s#zu z-p3>DPi~H47&VMeiWsz4uT7ToT0Az{(R=ad@PjAf%R{zt3*V z!KL$p+xq+_q~iODFAb}P)h@EM`C=7@(y)3ixueC5=PTzN>pnX{hEEF72|2>=pJGIxItH`D)B9;Md#+@Hue8*=O!&1i{vra zYzY^Gb$YYebdig7)N)NbDOP1)1sd9CuF85O)}B6_Q`cMbPPl|$UEkNG+>iG-m3nO2 zpT>7tor#@a)AaMK^*m#5VzbuUN0$9T?zYRA=;`SWxvxjeH_A+qON4VJ^VfCyR2k89*){<6$D%TYRHtX;SLAb}0s6M7DPT$2RTONg?#Ngf z{3N#@j`GMgvAyQ;`!SPL@tLpWMbDx0e)5&P@m|O(ixkIjtHL}4Bn1?qnT!7l3byL& z;k#3w5oKNdv!~&kXU>k?_?Z6~ydHcZul9$Fo8QU5u-2xcn?*&}hW~si`N@@h@&_Z9 zD)0hmNpwa*ezs)HfH4E)xw(62=7(Hm^Yg2r(=4CQ^I=vGU4|c9=6WChR37`M_y_at z%jw&<#k13K&Q{*;vTo&zrlAL4sgp%Qy}_bJsxN)az)Pb>a%zy(rG28}aV=4msu|%K zzmwnb?f;P9$D_94?VjC~{UO5huMvLxRAM!=V*RjUlO_jH=bp4%H{G=RwaZG6M;i7w zf}2a}G}C>$dUdUc<Z4mv{aP}OkeO7yz4`8b`|dr7({%DURXCj^cq+G?$$#441ST)VN5dJjjhRZ_ zzQl0xqv{@$vWcp8Q{Qg8b{8}0Y1z~o?c>WAVvWuPpBGXA0li?FnDeG4%2e(=e;-Me z&9<%2xon#uu?dNEPizSjHkC}$S5$S8>^x?p$(f5I!(S<;{8T^s`!^(C$+d!9 z18J|csmt!GU7Qc*HU)2G{RW0PtH-pnbBei5nGlt0=lm|4GnaRhXI#0goh*EHl=HxC zpf;zs`I*z1E1OEBPha6sp3Cfj@vWBsl+5W$o;P$q$s7EPvS*SzFz10+K9$?w%Iomk zk^IiwG@gZRKaz8>d}5Y-BHyN^ode^Y1Wc4-A_Vg(VQK2Tt7ih)=a7rLbS~-7a*Rv) z-udoNq(_zSpKO!Arst`CtJkia-GSt$?BRi9S{}Nx4}=9#692Y9J+Dc;*!! zj#um&Yh8pti)MSav=2>L0{nEf%D>DNi99>DHL88(dpyHd{xqOv!`33Btu?V| zs7}{2*o?Ko=MqtWlFWD`@;V>#pmv9p0#C$_D~PF5x& z^IcWv7E^0@D=`>b)~_35xZ%L|2bJy*S~T9MA>`m~dxSTO*&a^JwrDKU6Stm`X`1aj z82nvwcCWFhkJOs)?PDCbSiF@_1~%LGaBN@wM(7t3^ZYT2j_Ua`ou|51(5sPCm1pYP zj$^+3+_ozh`BkR}zHu?zX=7Zbk)!9zuRK3@H660) zkh{hqdfs@1<{seio^j!Si~ z?0Jm;s>92cQ^S?aiGD3i+@)}3-^w?4D#ub~yq_{2)N;Bn1bgIdQ@Z(KG7lFseqYNm z4&*wxk}Nt^@5Yac-`STlM2YZzo?{%!vCvs7LJfnnVvxWB zF?X-z^*%W32+}#?yOBDBdE3emhsUf4GmQOu;}jm(BaZk;ZaEu#=@7O%nk~$p)N8>3 zuZj0%Hy&K_r93Xb!XInqcjTCO=JPSTT|LK7-I>5q4+p=E&U7eeav+}@>J^kL`kwiH z{9O;-QP3Kqf;g4;pc)n4(NK$0X!gF~8-q{*3|_%P?=4?+@nDw~`a>Cs8w3 zgTE)v!aN_L3UBMSN_%r`2kUG*SQlG&&}D_X?7*kAHa-mGI}l>aX~ZP zp1SdfjnmLx>Kx8b>Ih|NBR6O1x@}L@nd{0P2Z|c$H|}CWYvA*VD&?F-m2+d{oLU<&ZQ354<=?d?}~Dh zi6UzmJvg3mpYC0?a=GKI6ABKkDhB(k3IP7DDmurv`sUj(^SAT#x3l7l4u=xI8c>pY z@zsG%Rq8&9S~e>e{9sp}ldfu%CHZsZ%yTxOW*L>0KDO!#Q=3k$RI(qp6jMZoWE(!_ zCk}6#U}IX#Me83_nM;4lpDzE5|E`PSpN#xuegtn5kM3t*AhUl^b?0M;7@qu(Ey%eX znW5*tqUTr1s;=cfv|h@61=TWtzZRt@d$*Ovfm;aodq&}ji;7A(*GZjKnhSm-M?`yG z$9Lstc=}pIA8FP6AEO>cf0XJYzK|n-aA%-Lvq=r5lN!(mx5pJs6@0_GR4j8XmGKSm zQ(U>pKaMO~e4pN4XT`P!XY_~W>om+O z-cPR>deaUhu2L0r^|m?;`PixiMS0oWI6t~7*rw;LG?$AzH>yWY-&1_dm}&d3!H;s4 z5qHv=qa7x32OixeY30Y}na*a1b0-6SFW&-lN}D&ytVz}gziPX6~Hr3Os}hkCDSHpXvBZH!K;XO9fb>Z5{4Z&D6{Rl6DW?D-hKE|btsJ$m4n)jTb3 zEa}&a&!CF3l~Ha%RX+ddhRn7x?Kloq=MiJI4w+=NkDSfyQc;AagScYXaW}-RWZz#q zUz%bS{8Z-*=4ZiH=bUGqb5>0GotXK##x(onyOiUYjqcnKw^<#18LLgRcvIp#X2Wb0 z)G4RqtKJfsB2uFqKAlPWpnftYvmtBCF>;SOMOGXydC!Or@~!Z&;|iZRYDyn#KCvI# zvRQqicD9zxXPa)bOj~yUCZW!XuWiSD7`_%g-C-F$V}7rIzB}fIcy-NzWOiUQyhdGK z`PkLqOVCIc%E@SY(D;rY+a1&=b@eQo4BaYknhaB|&VnB0^$k6So>|bNk&&Ut&@)?X z&D>A=Axl^RtKQgb?ULErvm+BGv_zXYomKF>lT~lnoV(0ZvS;Byv36Rk&hG*;YiHJO z5!P;F677d}xUeO)*%GQ0=iSnRQXsQ)4;P?jzfyy_|Z9wrHX=K=&8t zTfE%Z%;%%Ju~=uN(H+3%26Xr*qN8{wzg@~Ls1DIk_+5DXzULIX)UcRx#`D>AtO`Zm z_uIi2Mf)mDb2v}UVHZf$E`ZGryXrh%>NycbGS<+vtk}OkD#F_1N;kAWDq`E>yrUi; zt741JNBVp=@5IjlS7E14z5*~VaA=! zw7Zu5U9-)!i+eI>>(_*ZV~zn?W^Q+|b!^_xj!nPKQ0HAfch{)zgHHe2mFxDsT+`R1 ztNRDRFENo?w&1 z{>b<88+}LY(PDlF=P;Dtna;_UE++QyJncUn$~)q|52I(Fi*=&Ml1^{!wY-q~cs;*u zY$!1w_xnjd{&<`h$JB`qI&bw;dH2In_lchQfy-Katmxx8G)>Hkz=OS)XM7^P(xLy< zAK_5WU2P=&2fVV)Pq>@;39!Lz1uLn3O=4MWGRLuC{#x+7>@}}nouz0u@nsfdm1eV= zc~(0B@}oR&xAe#{3z=?=wYkKz#BlBN1^Sb$=T~PPRhdHTMsGjIraeYCM^jOfF_TuaTJwXD9a7lKlPP-riYRjGR4dDW^LvNwvW3W zySQsZkklQ9l*91Yv1;io9*3x6ndTgHfkd5_oUf^TEmzW|Ftp#w)pROcE|#7xPrLH( zQ@Mp}jh#zJV#oB6E4LPn^L;B>aay5|vjX}++1bR-rI^zwnNW2-I&Qkh$zrfsu81xW z21`rzv`br8jln>U?y(#9o9||b?agz}%X3ma(fOL!Q_vSKNn*<4h<`VYQgAdf2v8OJzFVk`)KQ~lXyH;$e8 zA`RQwrJsgB%gITe$|wG(#0cZDp{X~QDIZCdDj@ezzSm311yDi7{+qwaSaoNuPL;WK ze5`V_@pCmR^L%XlD&FI>OF>niO#-P zH4To7fV+=h#wTg;4WG$>s@L*;ab)wCvX>ky{?YyZ`)IPbf26+xQQ?&BGKsVP^qN*C z3za^*YNoTE&jmSJleu(Pf>vqRkY_JkNtuOY4)@<$YI+}5PU zrP{+M^+Enc)26S=XT_DM$B*A1*azoQTjejO;)ZZQ_T7uVQrD@H>Kn=V(~W} zf3vUJbk$5d-0V)v;9x;>2Gd%Gh%4i zhIOk;xp?ASu05+7%vLo}pG-`-BNm4kjC_Gx*#@yMJ@n0wP%loW02!iclhx|^KCJxh z0#pXVY|-a(9`HMt5?fx$_l&)xi*$ON>GeOmVvV`B&RoWFD%VeVO~cD9cu6zJDpQc& zuU6}-)+cU=E`yCG{LJOCtZ(YR_D#i}Z#JKZ&IdegiD%5klSNtZLHBhoOjlJOzZ-1L zX@N@gWM9dr3;#f*N6rAt`c8BeR6)sX(2(&BoMtOpm2nBr^Q?=p5v6PdaSgL3&Lzf~ z#0$W#g~!!pcAMhA{w8d7evD&2?0#CD>h51EWtVd8gChTX9fqih=-k?T6g?I6!e099 z_dt-W6&mzi>>kF#TubB}WBW&W)REw|nKRXmggMpe(no$TXNA4PF7mUQJLoH>`$i`{ z3LcRPOMX6ZD32#Y37=M~JWG26EJK(rLl~c_;ITjbI-sUqw)@(ygP_o~>!43+5YphcU3w;uHuFrgSbCq+`D#iWAE=7wV&n_@v1xPucv5D!s|nr~ z>EJW^?AgwxX2&_gsl1mSGyL25ZFOGmv9SN-kNI|o{L#-6yQ$$LR^>K&G6~z z?Q4g{lrQFb0ioa#&H~N%l_77?kGO00io=>%J3M8+y^E^|DR#dSY*1;q5v%4i##jx6 z1w&;WHmQh10t5EVif`)P`=?lQn3&K5>NyhS_wj$x*sQ=A&^>ePq zJkeD?EymDgwktR8+IISplG(|n=;GSAl9ghKWT`34>d4aU-CY5YM#|4 zR#UZjeyu&#aeO75+#7lQ6Hytb6RO60C;6ML)$qz^axOzTuQ#{7d|%3D>VFleDyvhi z^t_BOn}siXA$%lyaF_wUA2j{%1-s0(=6Aj|Ce7{-Ub_1aor)vBXUgr4@W#9H6Ro-5>`qOD-w)+KUsr{R9!AI0 z?TIMtK{&hQ`GlCb%d0ZInosS@s-W`ulhS+GCBrjaMCODvb0Cs>vJ ze)f1)vC{>9_d8#KH7@0it8q*{dg@~}Sjg!;4NW@BPaNm0ucLe0(#a3w%1i5Qn62{% zyVOlq%x0JQplnC5L@fkPn>pfsj}Yv(_JsMF;!Pbi)6oV)3}4J{7Q>f%qP8`$7sBN~ zlS)LK1@W3Mgn>C6eC@tfuMdhJ6S$Tw$F&fv=SJyywo8!%{%6rBRgaOLy-vN?W7KD# zmJ8033woA#+6?@E3bNQasWZ94MnsP*zv(Bx>tK2;1tx9=YG>l9TPriM3|I16)PRrW zU8KIxkTVN%UWsM@;5><+LmOYQ*rfCk@x80gQt7vGDL#k|weQ_@Eb5G*LQkZHGO1+K zb=8tsq;((nyQJt+yoD>g8~jn{qVsP}{_WOV*88y1d4hEvRTk;9v+kwK$?4;K=h)@$ z8IyT&T#v-!mF@ybRY}j~U8CBtt$9pK@6V*R(it-3We0*@oj3EdL@snMr+(B=jnV0q zYl56yJ2kzYquZ%`M%Yvz%AeduzUg1_(}GG5+9RD;>#IZ-wapT>P0k<5E18P%yWp%2 zV{FwcQx@s>?Ae9>?jE9T=aJ%{*evCOgy-FNxCwGv;cmdt$RzSt9@3+(J7B4#`QmTXz< z*&;H`4Pj$-<5|ACXLl4qVSR!|hiDDHOqo(|`%?d@^Ko^<9;$BUUrn>4UrIzttd&y> zh|i$v?^ooAe*0kl(TAcvCyP58ormo?C6_Ikh&sz`-tXmFWv0Gzd!FTGu2z>yO*$;l zj}p_=Ar(bgQ{FMJ?UR15B*%|`pPn=68STh*dE!31lB?%%WFKue<@{J1>QnIqrRM1+ z&Gb32ItjB zG%B!a?s7$}^F!EX!KMg9*r`O;_fy&1J;KPtKNIeUUADR0^|YKNo>rK$iRsp*{LID} zpLy2O=7TEo>XL2*LzTr_@Kee@*2VhRDo|C@Up*aF%Gh|8nwHlCO@p9@hJr=`O~eX*WhbbDYPm5XaZ`{97N{^3CCuYfSm zBy@RuJ@r<>T#D&Ad(e@=FQUIbl=C^QY6v7t;-q;|VYFkksUq_aX$-40-m6e)TP)mK`zAcTsP}Br<%yjGc!DVYf z{jW-}V|kS@BP!0+RpDm60kiZ5EF$9prKM9145jmAPnOS?maD^`JB1-0<6E&s*pUA? zo0M8O-%It_A=DHPs4~0nn>4)X3<962d;LR6k9$+LzU%k`s%O^=(bQJshN{77FPwpCxNYWe>$wZG^K@lx6sq(`&< zo>}^P=8Zb0@DLXp<}50{l&oO>mTt?jS^1H`bk1HGEU&Y>61(%A*lVUx{iDL$zY~VZ z_fQg1AGv6hO*t@F{x!mHpANo|Ya_Q$()1wnWHjcF&22Z8Y-0{8B)C!La>7!;$_8%p zo%{`EQw94wL){Wj_$i6~{5;r_xdl17`RXV_LxX=MRu26$)s z%AW7Ej>|BzVbL@W~VSo}8=8Q%x8`Xs@8UGj+D0f(*>S8i>UMFV+LV$G;tCII8}*Bvl`>)|F`fIsL*bNo13ou zDyg3NN$^!IxSuNOZDalUSR6N792cW;9GySNx6Q23%L(iqStHghU$s)|M=b|Hnb6Of zDZZa?&*f>q3O^4=K}{X59}bxOZT$As0{M7s+bIOsq>sR&e;>n=tA8V(Ci?bSu5BL~ zFN>$_9#17||JbYW$yFdU*N1ZZx%^9hgkSyWem|6VK(2n}Fmoceh2!yz zU*#2e9lE&j%W5NeRiZko`B#RonWEV)@TFW_eucsCW!Xo0Hp@IiGev|dUMe0wy5g_Z(bYgaM_q&}#WT4ssO^$1 zOpEZ?d`es&)RjJGeJ1f4(HO6MD)+-(YQ1?#|WpOt#d z={d#rH&rH?^_scfT(_9yv%Tge?`L)p zTd&yX#9jjKEIbaa2pp8M&6l+r5wGRW-@R1lAp^5DEzbH;ytOfD57Ck-XKV4kO;qdB zKW@1!vZNE={Nw%fk6ohbiBqc?s?1h}Xlhce(odj!A(58$E-P0A3k4TY7cZ%n4GxSA zg%*45OKlW>&9cZ#rwq{vOVj$Mz7l*L4t|&T9u;Mr2lzTU`;5@t(#4X?vQFp2R4KG0 zM{S-|!^V<7C4)8os~wY#3oU3(uJ{;bw8DE>7tG!X)(lgwRHJwA z&CumA?=(MZs*CcC6}_*xqV7!eb0pPg^!le_lfIJQiNlZOzW0NF%D-zC)JJyReQBJv6@|~&YeE+$;#FI7%V<3oxeGhn3-P7ck(Y$ zv-P6Qc13lAP&h4}xtXs6oL`!J#;?GOx--s`es*1+jNT4 zk~w74k(T=7YD@>ZJgN*&_orIueUs!-N#_P&NacTK*teRA2K4 zI^{XLeW~e;cl0!|^INWGwnUv(jh|MdZhX@$!&u)RX0(bc(DY2~!5gs%$Kq)~9eg7j z6Hc9Cp3YW}LT|0sL_JeBk#o8y^j6Ax$%qMp+KDT45(fLpzgJO)C(?ezChN8Be4y19 z7c;&0;owR)C!1F^TwzC7U4MMAuXS38X0K@8P-iaM=8);t^Ahd>BvK7jWkiUzbmCI} zeBkM^me!ME_O))KCfw%-H*+gYUaT?{#!B>qm6&eFs1W}lu|4{naT~@w9E<49L(b+Q z$I)c@q0U9I?wxA9HLh63L(+{;mdgy8Yx$qwiNRhA3vuZbRo60E>%HuFpyqZWkDv6c z;5C^A{HS1tQe5dHH>ysnSsgov=E>DC_tRgKN4*uM(*&87|ttVaB;#-D7OHN^LLRBny-j^xL3la9sgC2Ex4$+!Miu7_8G9^H;I zsdnybl<_N8pZ%p=HC<1us~*K~D6~z4Z8omP-(-xo6o)?vLh85Ru%{9mnZGY$cQj$2 z3?tsD8`sNy)u|4LiY|}DX?aS?M8x(v^p{m0B0|HEv^j zyFTu`a=)*eYzs%NyP$G88DpwHm(SL8TDenB7KLLtY<8L%j>!emD$SQtow15bJ4Py2 zfyFG!T5>7_)`n2*}&QL2wl ztw-tp^eA;@C3U~rR>Ai9>3Gu&+@o$1!($5U{wc7#LzPY`&yN^$Q8i8dZ%Y3V16@co zbUyfPaDQ>O;gpGw3$$Q4I8*hMw_nETEC;94zUqPgpPZq~8F=ZW6r10g8(TlTn%kQ2 zD|k(2s^s!4X3Y#wupjjum^%51e+^H%Tj$|wsB*cA@Hi?Q@1+`|HIH|$gGsIOmE42M zC*|OD2bP~}myfwBqiVB!?yptL>qlyf!mZ-ziiSe2^x0-&E?=y+7!+##cfEjHGZY#M zW3P(R;JNJF(~g%b@y7V%F!?NgtXCa8G23S<pZI zyV!!wV(m~W8}6*@Vp30N7p(AOSCcP^<8pX8wo6Z|W>Jr`SyspLDU5rvKB`LFV-1W^ zfhh5!Iasrb7E`J3Yo1yjtEuXvYm{Npo(V6=*0(D+b?DXL-(tU*hIA~pj(-nif_tno z;5(_#EMnpXjN`S$lGCSoU&-qZ<*~oIpL#vSamCP01LS_DlG`MqStbd2rSYCq!T&1L zd-#5se8ps|eW^j9jvv20{ubDssdmU`s-SRPtQ}MQa&rc=b`PB!F1L1DBcGbDskF@0 zGSk?0&6b&>OTxP4PY^KN8Sch$_e{L1pC@@)TXSWjD;+xdx}~SiTaz<0jjs-M&m?YR z6R_r9@j0wYY)7P*8<${a}oO~Q@FUylm9 z4GcM920zygpZ~J(6YRMBAm@AS)Ei)A+}5Z{=J!!lAK%OVf%w@zhNsJltvc%kUM?qw z$HIiIUtWu=S*6-7tk9u6N;8m^!BhD*{*+9D-0_Y4jz)#wVP%*T&jfLDl;Z&#F_kg> zLH>F>_+n5pv(fU*d2T&SQPv$s!NrDD3cAcQjlpf^)SB<@BZE5+^ug)s-mxxsy=sq@ zS;+SB)UtW;-1x7QCs`BUsa;#fli2*a@p>B!?|hUaCpM-vLS+X_e#T~iak6e!}K_BFbIgwkr za{ej*zLCAl>i5R?+mf@AwKA{Eux41BFV=h~VSa@_r^aTg;N?^Wx3ygxQjcKDAe;2M zv|Wa$hl(dQ)*7D3NQokdEFSWtk@og!+u0{{ZQa?YbP`u}P9RzluM5fNF+69c{x(+3 znAWX*ZMJ=!z9BpWJqGLYvpX#LP6m$`*sM^CuVTya)R!5QUDzhHw$zTg#1qVxM^lr^ z?U^w8m*QWTzhp``s=dksFQ3+^3)`l%KGr&o7T}9IL7zcyDi*;&7Q}exj)JO&lHTNHc$2DOMbtGH4@)>)>+QZRc1Ppb9HS~>! zHQUb%TTe$z96wIiem{3wzDrjjdM`0JJy&s0Oq~6DZ%Tb=Lr_W^-Ui&+#G^HG&;jyepw zqSJ$IAo2T3yX=C&I zPg2ijo^rC{Yx(lbd7*5}#bYJ2uO{t<)E>MLg~fW>A0@&%5{5Wed#$fk&29fNir)ND zs*m_WG`Sz5qy3-g!)=da*&fHXRRL7jWfM5ma!vkLH9LuG0xMEsdgo&Mf54)3xXX&~Eo*d30RWjO&|U6kyY8ob&8>Z(j$1snr}apGBLFKaWixp;?Wy z${O@B6PS>faq}i$deXbz$ms+8cQte)~io^G3F^YW((zut`Jte90Dk zFS?(7%kj8XUz>CML!SG)dlipPy36^U$+ln0V=ekefw|b|AC`=+Uei;X{M648jlZHOaG8dm^fRANJk~>|ter*rcN6I=nsnwsb64<*?^?F2lSy{4-@B7 z${Mc-4$*osJEcjLL-zQ@vG%V;fq=Gwt+3SIQ7wET8<}Q3i(lNC!$khK=r737Z{+pR zMO?|hO!-&k#!&9%li_&ANtJR^-C^t-!5VrOolUO#<0gFR1eIoVq0?7%eLWFX`Nz#i z6xSMhu@i?gufKt{;Cke5rc|>VLU%-bl-t>GIFxJPz~K^{GW%#Kk7mEvfuNMRy+gT| zNuwaz@cPEhN-I(7Ov3Aq*hIb&wP~o{$rktyz18EEx<`F4-vn0XB6)P^Ih8uM+6 zjcl@w%wt!jS-ov6JMu41NrpA2=6NRnqeKf9v5MI@f-(^2kr*S-tZ0|>`MO8tYx$m4 zJ&6AY$5(C&@khCRychgX?!#YG8JITve;OuBj{A!omn-MmdEn<_<=)EK(UGEiZWLpN z%OBs-db6sG4NGzLRf?_~$^rt9{Yr`@hofSiRz!L}1vc z=3PtEY!v-e>|ZC#oOC?03m)S)C!3w(8&LcG+n^s)3;tK^)0xW@G((90u0s!1C#K-F zvqqDT@{6-Lf0(@)^ugZzk6hnG+g!zm?uus%$f^8)BED^Z;P2m&`(ZZ7>NVQkmz)fa z^+f*jkzR}^%{|j+eIw7l8hc*+9PbfzTU^^*bNrmAAN?13kK|`F3#LVA)6PIMNzK0L=fv`A9=H>fjhpL!m_PNG>DCC7ZJ8Q6Jvt4@~0N0Um3{8>8x0TjqG$ z(Xe>%P9Fa|@;kK%tL^v055E#DQ5Qu^$Fy{9vfrYGTJ_5v^#QLQy~RI&)rpyGKUQUXvbh7&fI;To2AbEdvdSmOxQdPo|?Nr zr)3CD$HCM6>dp(~TTajqTNI{R{UjLrL9oQO@*{^PG#lf$#K?k$!|zeIK%sjynqiM} zNTdAETGrgtS06u@)d83~m2DUL8}^$^!|Se{@#dfNKvNIlk#M! zciZSVa*h{NXv*HkXJdY^4}NbFlaaEZc*RMa?6{UUeH`_ypyAPqY>Wc$HN8S|e%$T! zGckUnzx+lVpY4f{ypaFVSno?03%{WYKnE~AcKb;zBQ;L#z2WD@1S_eYce9n1)HrVX zF|DG%3{#dTSWU|8s}+aLTWUK@_3*=MKEo2-wbJG(uLH~nb8I5i4+J!)0UVfviI%W37YBTQo0&8p(;|R}8Ud7OlRfjOTCR3#iIU@5hTUJzaZ=Wl#&guR zzi}$UGglL28X;;N?S|vsrT4oN?f2W8dVnlCvCF(F{xSZXp!`Lhh>)kx5Z<^L{@{zG_=!lq+#)OS4 z`APL$cWT-Usb?}>lS;-i%#f;Dy}H~yH!Ab~R_B_v%T#iYY4yGS`dV}@sHAn;W|h-U z@Bc;~sa+L33!9c&JVh5f&9QFn@{F=0Q{ThRsn^8EMf{{mSKVVan64c%R?o6^M3T%J1m)v2L&i>GvHf6dL!p!(E&6h*@FlRw7>R z*Q}KvoNxSpf+1Dur+?Q)`?^bPv!$}7={Ud0r3`}oC zCa70)zha`r@>i-MYB$vc|2&<)V*WZBbDKobk9;u9POAF9S7Mu(OMxFecQZE0@#;BH zKToqAhVqUW=W`aD_aQcCMkO4<^=%{``x#;>6oy1Oy1S}=)&xGUeGRAiNLI7yFYh@? zgHu;~&Z|)S9z8Z9P3yqYd~mB3JDPJmQ-Sptfv?5CG2;O*N4@5Q{AAAWxHYSPT>Pkz zA$Fm9$T?n}9^1U*a(Ktof7ap1>l@msXPS=VnFfo@`x2RV-6fUdom5S;KGF)dLtD=A zOsCafZy0kBO|z1AB(B$;NGFm9TqoYr`@u(UA7I-#AI(Sd7R%2eC`^RDgPaJ3509 zWqE(-r;fJMeC8Z4j@a430C#JVd;cQ$c3v{A_EhUZaZc$mxF+gQs)_A-D$0%w8f`N| zpY?vtdWUH{o|GNka9dmWw@oL-^!-&SH;U$!7}&DKK4gn26M;AEVuOoL%W1DC&Dr2` zF1Cs|E4H16tv+CjENqr(pZL4B*zw1XQNhL^@&k*>`%xKe&!y{J*mlwRbS~Yrp7))p zDx1%$(UWJY+Rfc6JF+oV{bi~qWrk_yrTsWDA6j20^vZ>{=xRC=Qy8#q*A|QSf}@&* zpej!=zJE-W$!~;Zr-PXakMV))kxn; z7wbDgI2f<*?szn+i?^$9qRi(Sdn>k+`2i*8QCI(ra}>*5`;fWrNQInw06HGsu=iHJ zZJic@t<@eezIW6>^h|=d^jYz@>bYFM*|r`2%8zbS0Qxp7B35Zk*Cc)|*5*_!&1Ac_ z-ATt0`p3z~sAz(2=c6&3W2huZh zU1qGMXJQ%aa%8NN=8LqQeX{O6XuBx_lg=%*ylNHko@`u7XV;mPyq{LGOy8>Y3eSDC zvx;R$HY>OsR&bIZPgz@-kFUheu+!^Id~*C(YLimLwX0#oM@)}m^^5ynmt|f6s@)UE z#}NfyO^N-wv2rEHH5<3wHm*&sQoc`CcOr7su)pr9AnRQIRxNsbW`?XjAS-lF;Si8eZ~3{)6LDWT9;_T=fB0 zlUTYo8Lao3><1{Vad{oQMsV#|zBE@TJrmQ#_g5FsENnF9J~xQ18ys?ae|)dEeVUE7 z?Fef+jzwwx#ZUKEFK3>kw{1F2xn0dH=Xk~+iUl)ai9JtOZ zu8k&9w)4B?M>k*FUt8%d4S3T1t*<4|cq6!?R!in_;jqSi{+>E)`R=oJEJ@xG)9Daa zouH@Sw?RKTw9}aBxto}TohEKe{|fU+bRNh@;Yj@6Iv>Y9lAW#Siq~3I6`GIqiyZfz z{QsNa-?G+zWUc=DsO}$7tiUkD-|CIv3r_d!c9$5K0XgmJQPYnW?>IE{^Z`A)(q9!% znvHq%v(Y`wUQQoX=hL+EK56pb57NE$nfq^j@cCdUj2-i@VCsf~!w(LTL+43{a@0S? zkJ4$&PDOSF-MB}=m{CtUlD~NFaPWVFpX3pA3x06^_+Nrz?t9~24}Oh`6t{tR&5{r0 zFVvje1`CJ&g;)GPIj7IX?*8a*zm$LXK2cw)ubCUd9uC636TA?~9tc{P*X{qRLyp=d{x#fO4<3eP z`dP4{z3cmf@OvFP)};%No+|cE7(N~fKD>{o4uUtn9L*ZQn&@rtM5=i>l!#z=REH+J ze=m<$F3qd36+e?Ihvt{M_e(>G*R*@5K9(9vy!C~9%)BEyy5`=ujO>mi8aj1q$-4LT zTJT2nO1yj5?<$;2HChe#tx7x{za!;Y*X1f(+&c)z+?Q-Xzaw-5ZzM85k?)JE_-#8ezr(e6j* znBJ4J14GBKe01NEvb87jo?b{C!@T{^B+`X}c_pv(s9ggudup`Iv_uCOq z;#mis&odO>cm7OC+t1(=`NoD)gW>ZV%6nAS-@k*m?wjTwunfCI4QJ>+3Ee#X&f!3L zA~H>wD*rjb=UmDsh6mvq;M4lILl3`!AOFemclbm(qeZYxfrou1XBfN`y<4ktKBw}1 z_oMzXc|xt~$C>`b=f~$rj$fC-=`8GK1;Hah{iZ{`M+A(c|2~i8H;$m{br`7d4T5!I ze!QAS{p?2N`&X;LXN{G>F0M8xsbRZg<)7jNTq?)NTyVY_u*i80<%qw^Z{Ul4cQ9vH zax8c<&TkPos=jmloK|P6Ha6xmQ+w18tg%%F3lE~2HScu99=LCz4sVYfUvO7=i{Hg+ zO;)N~c@1fI$>Yc0Q8Uu^1d&Jb9~Fi=tgSl@%3WdYd$D|6?Y_QYc)JuE-@iVKF7ZZR zMSt)XUlV58{<46$yV>V=i8N;5-5t{KkcO!Hg(!IVyF%1+$@#(rTZ{JR&k!_QD!549 zGCwT>J0ELj|z^+&}Z{MgU-I#y9a~6a8H}$;l#qUu2IgollY6wI2@v7vGM-tx?bx~EMrWz{4pzK_tG4p|U?*rRgCwjT=3T3)m z0(4PnMI!;S4&-+-O)5y#&g1(HbN2yr%;R4q=HeKuim4cL#%J6$pV8i;-DOp>8C_=4 z`dJfikGVzHCu1hI8FOaQmfxZ+x{?&5i~W{pdR|M6hPGIlSVPtFqv|d>etKvwM9*fr zip6vZG-dny!fmzXxbBj(Pj%}*h^;ylbX`goc_ley%#T_2xcu4U-7@rF$(2Hv#2a_T z=qz5-Pv50}x~=V6mtK!~vJpDvnSKqO;SzHZ#8mN&HAB)}BFWDNPdx_J9cG5(LC@TE zf1UW0RaY58lYczYd#~K7@=MRw;`6(X&tFJ%tIW0U`)<}qd@cB*gDpm%*AlL~iEDSo zm=a$RPw7TeL)Kj*Yft8i?MM~+hfyw0wx0e~hoO0QqNT@F-Imp%?>^opAEJAe_yY@c zCD{>i#_?#wfU4jK7=2N?KNTA5gaF zI&_RO(_QtiPqDq-nr~j$Y_}|C@>4YW(a)cLAI*{YGl|@p=!)Ji^*M1IT<0t2%c!SE zvAr1<+}yOsfjNr9R1LjM%ElGnAhR z`aTnmbWJ8IGF$8umx=Pa>8rhze2*xQX<4B3`gVuK)nH}fJ?Qk&>nmHuH22hp>%F@F zEOe9Y$TfkY`BOO?&WVYSALXY;F?7)~?@8w{p@x77=93u;F1e5S^p~UiQAmu>izjF0 zinCcvZv;Jb_~lQ!|6ZQE*T1l|X0NXpfo&9?zx4a*F_LmM_LpP}l)G)1!_v1HB)#K|E zd6i%l@8XP^M5i;5bSnsZ;hRwf-cef3xJU4L{nO=kMO zkiW2&)C?38`KV8=cD#jV(lHFDecD#l)Imf|_1yVWqSEllaBGSxweU||6>PeFXL6;+ z71LiC9U526u2`kt1gTt4D>K^Z$%vhN6fpZ*&Ov93VoigMWn0Xpiz?`M=Miz-q0`p5 zA6x66hdKo-%xnf~(maP}hwd%idBYsJaHQ&MrFNaOd?~M@p6a8#KI{lHD%01g_X=j` z+4@%+^@JT}{ z?(^j*I6x6mcWb?!WRBAGxFY0@(_a~%ej@*Y%eqI`Ws-R2y2lcEr|9V-ldL;Z`spm< zJ(ykZlU=XFME-TeRxCPuySojk_q%J&pcdD-o8yleWO^pqhZU3-t zwE8GkR#_OWjHMYg%$0WEQHe~SG1=gokScx z)LjuTrOvBY*fcga&M}7a&OD>KBW%~MM9CfYWPEno6=Ga!DVI8L>@n4Hn(n}`*Nq+Fx>Y`$f0>1WN2K1+PX#M6CDA3< zJ=QM#^|M$vDoZ}<`a7P-DejkRt+j7dZX?5Z_3)oF!AoHlRa|_Fdu*sVU zm=?7w*Hqx|o{I_%TxuV+L*yUABYttK8E%UApO2z? z@(k6bsfJd2h^P)}X9U%u8#&9N%Xn1XM$V?$0Gc)?c(6mB+nTNnRTaM%o1A}-X zSH*NTPqS9ElyR>I^I80BT6Q{1cDnf3?unaJSK@~aMSbVc7LOvTVodKTsq9*g@Ngoy z5=5retDI`qBf%Y03bqTn40a?UqCfRq>T^`jh`rG3uMXguVP1a{-=-a74$+<}Cf>@iI69rM<}qjSm?@tdN2^*tAljkwu`5iyZpo;huj!SQ`5Z?a zHOI$YWc@(ZIm4u45ucY<3dkd>);70_VYr+Hmn9Z2<>VB%)hhpMXDN;)LPr&#^Bn0a z)ot`C0=3Ftj%nr|Xyu$)9G9YIsN#mrfYM=PJ>aqbbV^ApL%bG^19nhMR?z_fzx`hNpP>um5dXQ9y* zgvWWzZn)lFv%*1N8()*AZ=GMydb7SYOm+^QE!_58^f==h?GjEPt?T?OdD*2fda7uB zHKuSy`OuZ(H9eAPC1%k|1RECoah=tpa#iBJx7;kkl1}s3Qlvbm#iQY>B@3_~y~!1W zID_gI(Oq(-hG;`{{sx}54Ar*dKaHVEXHb1lKRb<_UC*6$r-c_vqzA&;iblxy-M2Jltg8!7ygV;1=FJ2${On5im z1-0-~xj$&fO&h77E#GvTnOi$&ec-gxFPH=5mwrvJRM=0wd@FH=za%5>5gvQX1gNYTe``MN303P^82+6 zS@WE0*^Q6YX-U)@bA4>*!80AoQMlsco zZ;}}ZvA+m)6Wv^ruK~9_;C|}8@h(j42Q4=)&U!1^miiNN3~wRQ$JJqK-6v+nlvKtTN*g#Y2}qm5NR9qW;Rcav1_KKRx$)WofN$MYx)Cnc#$;Z79qT zS;DFNeQy-&kyU8EfW|<5HJZ$~GJ~lkx3xHLzHwfYR}OXGz`=*x(pvC_!-CaODTDLl=uCv1GncUJradf3fPU*>sk7oW;1R^uA*i>9WT{ zri_NMyz4*YwNRUsfNAXB(DMtAV9!Cwb|k*hb~K?iHD2#I7uuynNs6 z^Avmps#V=$#b2fmS>|Z2Et1GZ*;Qmn>ULY+@{h_^0W zoOU1;5vKB;3oHAZ*fi8_Uk?6HqLBRBx=jr4dR9oY5^}nCdor57F@Gc(O71d7Z?ZSK zL1WLwKxdL&g=pnUG+S|B7L`mUEtl}AspU!grKVY*Hke6|WIC|fbYM-m(QlUcJXj%r zTZ$Xzo)AOZ&Xo^xb+NN0)vZF5f481peAscdQ6n zGh_CR*@r`8_K?mP3KL?f(zB~Jk7?T)^%2j?%%=R;v>4Brw!2nQG{tZwxOpsAs7+pA zxLGb;S68^%9^odx|1D+qcg5zhHEf=i#vj9CpzdQJuUQG&`qvU46K#K#@AS|`yvMF1 zhnU&-bDfQ1bRP*ZPoNv^md&TSOI6?U<+e?Bu!?OmEhd(bgB_1`kFW*SZ&0LeRnmJD z*LCVL$+VtBjHrqVvPRB?j*rjfwojx&qk&1EPbl4Ins#tm^wNFw zQj#IHRnJ+5^bj+oHL;$h6GALQTDC5!rYJJ4G~j`o=1QWGE9+yic{2BPo=g*}G?MXo zG^onUP1Z(p5%T%rI0i~1M9Z};*Djd_Jr6vW>sbuXum!ej2bHI$6LU+j7|MbJ!R?DbnJ5Jg(3sGhdZin5H@~)xl)dL0fgpW65O7 zESP074>6O8tyGTv((Q_y1&p-e>LKDPpW7wM!d6*-qD>1dQQN_#lva9;+r3ZRZmI9m ziEUeg8;iXy_MTtt?I)O)@COzp-Pb5dH3lcbccD{2Z@?}C=IZ$w+SugSmIbz8V-y)t z$26N|Hfx?XYs)cHX0xnk{(psOJ`+`z?q%8^#DAxDs;UJGwrjgsc`>;*#2y%WAa6vs z<~?PsBZEWFQJdv=%*02G&r2uqa=faVE%z*phreqc9xI0~sH88}sSEFVmUlGoz(>evTp|)&(r3m1I-j zt7XvRed<37Ug$PIv*{+1pQJ$Ya*_H5eAy-1vj`rub zHF2&+=1x-ap=utU73Tq-Us`uMFzQXYHS)X+U9<2#$7XRZ+JQm!rfCLmny<$wPRbOsMqY6Z7zuSv(!x`P5CjkYcOW%?cPHY zKT?sjzB5zzG*|TUSsXHx(jK#v#WD8pA+mo&>(;mNmBgL-(;J8#A0}38qIR1)X#Tno>sujL_(-lhV@v13md2W#={)IU=V$55&b5Qn5at!1WRA?lJ{`Q4@0;GaE9nH$ zm>4Cb@1CZK`)o*}Z#;!C!v9hlEQ-Yf( zqpD*5oo$ucR*H&lu;tVTg=7_K_WoAMAh=69#&uwMn*E;I3%7Hqto@pjiPQfyOoZua5T zs8l!dq_=zDz3#G?k}g@xUY0p~`QX_3bC;{&b(v~$DPHANvXwWE|9>UFeQ+5~U97k1 zSl+dQ`TFtev7wW`gSYZO$Mw~R@EGP#{ou}p?V8u}yJlCgh*~?_9YqeXz4R~enlQD{m7clJ&A&ye58 z-!|`!&mg{FHre z@8l|e?=q7RedEW{`_tH5Z3=iOn;{m*Ea@x8lWD!Tvst+9A{Qd*`_o?$<3;iLQQjY3 z==UVv^>NmQcs%->*M+~%wOSr|HVwB4JNHd@FblGnpN{`h0Bq(G3sc}uUVMQ zy05umS`};3Xre}8;?t$e8p+bU7kng)89nl*5T2*vw#i%eG4@Zfq_gaTVmP*1%EM2> zme#S>3L-2xv5SU!I>*!A7vI6a6k)PS?UOLod0=(=l}~o<34P5gUvX}p@P2y2r{dX; z9792e)UntPG@t%=rToN`(Twwa*6J&4ies$6}xee5e2SAGzi zPyWJIUmkz&ia1{x-;;0bVDN7_&T-9_t-y11XBn-x$9jA6 z`$S@IuQ6vgSl$xeF1Kz~J+9eK^0dE8Ox0YiYQDFR+#T64St=EJ{jDzdeI(T>onx7g zBI^#zzv`DQ((_oEj+$-Bj!PI_L(Tm~&Hspnp$dgkh*>ZP@;6M^xx~abVuAeqJ90lN z#JBPY^oT@o-~w$CT$*lmjO~=hcjv2D!^AXdebvADK zC|4@kEgABA`8Q^bbT_;ybZ5zPpUUU@M(ib%|HJQfHf-D3uqOo_US`7{jtvXg$-@z< zkNmo+A<2*wwBO#(Z9Co2Rzdf?;ppMuC}zFlXd(7(8sk%C`da)TSrV~*{0NUV-JD8w zE0^)Itn>b6o!w&Vv5VK|F$Kg|Zgs})%4n`MRuBay-R5-1gZitH>LW)nVzW`_snjgb z2I*S7xvgxjyEwfBO_QvnpKy@&XE!0_`6x@niiZ922lD%oV2pVOI4R#O~&tUye=Hu`t*I8{;9lX+ElC8 z*em5Rzy!=4l~ho1?Rxs&PnfWlz957|GWTNk+<1dmM`*FmL1@^B_$%jp?W;xvYy=?LKQmIiUcE^d#G_T;Ms@YF#(#LOMEm*ZZO`ROVjC1k!5FkykoPVCTn@eL(wPY*Y-gX zN;hVq=K99GIvHrkW55aT$xnD=B9l4}B!A*x_1J0j$%M4)vEzLzTnbUM&H+AZ`<2FOld=J=)_SX_&p8%5c;PY=FhL~%b|d{3{VX^v9IEqNWbTgYW#csiP-8n? zE&E`KF_kWzpqP5(MIah)O+1*NhnUZPC_a19*41w^$=CE579S!Ozjurhl{`2^rlbU2 zUr=N1NIr}|KNAmp?i2%8xB7-BPAy||_Jh76j+e$`mH6{DeM7rxwXsd@0>@hE%V%@q z?>YWnjU_jhykt(%Q)g4@j*C%*^?mAiNGz^S&~NJAE#Hf5v#a_%Yn^Ys4ijic*;NFK zcrfzYF>V4sts8KdYMq;5TV3Sg=KC zN}tz~&z4P7NxP27Zr;lAUXAS~q$i`RJ%#=lrbK9~L})^e?=))ihFfl?-FAWg#k`?; z!`SZRdc((~KHvO(sfIK|+H6Q;PUmL9J_19UA*~*1I}#1S@!rV(=t;9y{8p6wKJQ6h z+xl}&DWB@{CLtww-5iAK^s=(7VA7EdqlVE^jJ_5dI*I#bN(TO#sY1q+7*8_JlRT3S z3f0Op!5AOx*#o+OC*2o&bI*)uje&o2arV9IoH(lO9o8z`OPNOco1B$SS4J<~W5&U*{4 zN>S_KupW+mLCj(&+AvczjY>2c!8c%?p9`|z%I`!c#3jVPJmZ$pbVBYVwh z6iU=ElX;}s2|5C1@KLxp5PkyEi{d+|C2X0?#c;uv*hb;5j#Wp)5E`ZpHc!P-Tz1&7l z&pWx6qjDb`%zt;s%#SgcOq|9PALJavmR6?noXagX@qurn{S{TUy^|t^dZbQzv_~y7 zUC|<1Po2*+WA9?Up=5z@iu0HRiLD?TQGTr2Tc7z;`yIH3LarX zVCmxTD#no7f4Gc2!7YqMQv|W)Z1JN4)rig8u|DRKKIX-u89Q87>zX!~Tk|{kNVZ*^ zj`4pmcwA*vS!_!S9mtpRdHgo`*Wj;%zliU=>uaSfmeq_%V}lR!jb2HlFg==uXSQh8 zSh7X4WU*y!iUz{tE*wh+2OLKXt8$$Z;lVZN_FA8*J(4O4TWaTFQFr86hjKnx&ttKl z;T@m^xDq@2ll+9=;}L6eHRi{(w)<+n^Tw-IRoU54D<0=(cigvpFlc(5N8Ogg9Q%=T z6)V*Vq1DRT>S#_RQ89d%XQaqcn)q6;Td5u+y@oVSAbY=X*Hbkruxx0SY{)bFu|lB< zMdUwaXd`AU$$<1b{zec@wYm;zV8zcKjpK*6Swo~uIv(% zY%O3eKz5`kR1iU-w@{!V?Gw*^$Rm251SZUOZXRC~Ogw7sT= zwH493YnNJn?T1cq*p>6ax8eg&CA#8jrBeB`+)AYXlf+#3;)C0mZbf`0tUb5nXAOT; zUWbjSyvBjNp4TU@nu_|VoDq2Zw z+-3nESC@Ofbeb}J`E=_QtGjLlfgj{qLt%CHL}fn|ES}51)Z&QoKDyrzo!0D1?3z|@ zhO&3@qvUrSk7xWUKY1OtYr(E4KDiIA2fVj-u-QKOZuiN@QQNF>ok!r40zSkL_>eTU z^N#aCAbIPS@N&5|2}7VE5T3D{Oapy^YFliAr|nc8XA-G+&D#d9i$>58Xj{FtW8^Ln z$P8n=F#Q9$UN|q`9oM4F%Co$Z>;f(tJxle-aV)$lS8UL~1ntYs;J;*(JW9fFZ<;s5 z-jL&j&8EiC^p&AuvOB#lhFC*v7rj~Y_wt)!W6>UL3TAU{tnX7f6JF)LRA#8j_>Mx= z7QUC;Rm+EEq@#vv8lT8CF6f`a*c3Z2b)N@L1+V?{Tv5+lhCxm4I8x2uBwEqi zqrtZ6-gRf)^4r)+*uuu5DI|8h9MhdCj+xp^j?^^|6?7M~YP7xOyNVP)DStGc9hoJZ z#S%`|WS=;jSe;PCv{L#>z4tzIz5U0Pjwo*{AGsM-W-CMHA78KN%VA0Rw3*Nt`v%)^ z*>1yS@aC^1R%2o$eNN*&qu!(E%%6HB)yp;M1s^(Y8-ASl6s}xnTMgweX0;v5Blwrd zmR>^GqT#?aIi;GM@C~X8!N*~Ew)8tq@AtNcS|44%`D%yw+KjJ7i_6-th?$F+#W&UrT%lDnGhz z{`lGPBSXYey8qSYm|0{}5}9}`_W|phF2*V0@nLJx46)<5e)9nRwA@G6kFig%3jLi3 z&?hWXzh4tBG&g!7vbeaN3Q(t#*XY1klCIqL4PsR4$?D;?$7jXOc>hz5PVC@!SMa;; zIUpurW*^Um6N)FPd?B$;n2>C4MiGwP3(Rb29K zu9dB-kLxV0+Ot``ef1czW%QY-9)qJ3U0{>LoK&-yv)D_|CzLV`x{KbJ24fmfY%G^8 z2J`hBfhNzK^p#fPznJAkkreBrVkRQ+3EJnv<+HRITBxvPC$BV0y#h+K^LQ~<0pG(9U zv>|x=dagG=|M#0h8+qkO{IugB2~K|e^M6V&Klv4d;9nsjz8giEV3&t7mJ#; z_}P_po;+o#u$#(%pA#r_QxRlkA@7S5mcO(PwzUatFDGL@Yrak239~lytKAlD9t{32dbMVpG~c@{7OQF_uv2g>zeU_z z^-u)ofMZj&tHC?eNKeH>R9|sVYF{_PccQSpn)oQM z$<1fB58bsKe_H9>7Sr2aJGQw^mOD>fBOPf}Cf;Xu?a;|kQkTm?vgHiRo-?S`ITIx5 zKI(m$3iVR{dp5E({vPk)nT}p&osBUx#;}WttZk|)It|P6T&7!`OC0e*xSwOW;@f*T z><6!-uf}v3EMkBAxk|NH)yJoK&v-WM?W9*_<@cITwv%ZFT#XZnP;;Wm{Max)Vtig9 zW}f{lOgAx`ZUVm6dt-Q*)N}tR*B}a&u%pxGQPbI%Z8tCIldLSqdRLdp)|F$Xv|^T* zC0M`n^7zM6%qYuS(wA(QX^NVbv35|3nQh_s%6i!iGxrTMrOYt%o0tXL6*Ejd9?cxN z%1YAJ5Te{Jnct3IoLOpwKmPdm5n9`bE3qN>+;Wvy%RSRt@|ULB7v^V{I`B9S_eVOVCMBw$Ew|%r z5fyxo&ox&grdDjqd}@>FRt75Fp{LH~EqBXSmLi$%AD9*XJr;)KSNWakNHLnVB9hOu zOtSgbXJT{mO6KIvUJ+sLlE%{cs5Rx^{Z;;{el(6Qef-Hi@$KG+v%Qe6^GEVCzt`6= zWEeWTjRV>0qE@Ixmtq()45b*-_^X70HVoZg42^e{O^UX?hf5!y`npNg{WbA@ST18& zjA7|UMZ<<3HX5YazsD%|rT6$a466qcP1|JJrZ)NDmg@xD5QT6qCucs?e5kiiv-nUL z2&%y5L(PYF;X`-CM^euPlY7F_UdaF2w}y6r-`OX@u9T*T@Edv5mF!GLO9$gyzm=4Y zk&iFSMJLYTetFP6WX4i79e{jwtvd)WCz%? zN%rVT@!UM?nG8ysd|PTNnU{jYW9cHnqoSOeN7hxX(KdPPSvxc~#Dn9*^R4itvsjhS zBc4%!IxCIotV3fK)ycAT7U}s01s##-bB6?`S8(OP;b6^)`nZaiV9T>~HmQ1ml!5fS zD?uuV&5anE?7Jx+hY~&e_}FYZ$eh1T*JwFLw`UKyC%)Ztn{ZO4+p#TDzMqlu3$dWY z!0gQ>FGe@_UhFHrHnpEVf>tkl=ALyVk7v)R?xp+L*1W42 zT$#puCXM%^(fHUg7TX2&CPO1r@V}ku+vT%crYQ|~gU0m&+lWt9d(*V%8E%4@<0z^* zymJGgTM47b0Vq_ z8$Nwzo!$x};@&i6C)wJ>%+8XEW^Acq+rr+tkT3gr`#vvyot5|6_ML8f=9VjV^s(+d zczB&7m!tZKCt4GEhqFnqp}MRlz5=T6rm7Y3SI1<|-)3WX-^<_3JF<@!-x#)*g?X)e zV&UK}`2R*2!(-t@u18E}j1!h(#4x`7_4z@_mh%ZA$&JMGU_CBF4(}>g4vQ2dJb* zr2gJ^_4&9)t6AyXSf6_=*QCYzDrA|Ck4#ECV)HH2!V7u6+Vam}||(_0?@N-9r&YNc`ded6@z zfhiQ3C0x{WOpRBOeiB4eiJ*G9CftP8j9@MLw&Avk|E$Y}Qs1h1@P$)5!bN(UwKafHi#jdp>}%9H$@Z3A6R6>dLhYKcJ>1J*pJkfL ziTK|A!~xrPQ~?+(zRp{!6C?*fl|w$!{iK zK7|weMxM?~eJ)6*YvNM02I?7fLPWmapgIRNyr!{lcgMcbO$F0XGHb`! zH;Y~GGy4YXrt_yPpELGt`PsKg90zPoeKnBE*^b19)Nt_nJ~H*bBELT(uND{|>)2J~ zW~&0elJkX6BJ3ci&j4*uO;L8Mm~#K=OXC@Ryq!N zrSMn!J!zHD&)ClI!i~Sv^c77bVH$~VoMj`IVVk!0DS^TtWjY?H#_n-%xbL}S%I_je z$o3T5qCJ#P1zT-fw9(WoqOU7pb2j9X@qyg@-6@kTsrDoIIWg1O0Gkc-kY~fRM=rgG zhFr6``(kSsS=VlhT)*!YF9d&@JETG{p9kT9cuboo~?k*IF|pf2mhElr~M15SLl3ojZF+ceZvp9 zxwzGwSHELFYjwQm75iwF%ebnp99{o4bnl)3^b;V!=8gAP<5J(9QAqOc^-A< z!Adh;mYfJX&;iQ=;{)mXojtMPX;jr}V_%Eo9`V96Gj_-qU*{X&Z7 z>{S(^)>G={D||1R#vfu&e6}C9lLrN=Zph8&iJNBfbfcxoQ84DKZsPfm9 zpd**bk-;5H&Y;I(g2Rc^hntG${$CSBY-Qb_P1l5}cud7}ckIKYe$sHepF2?(Yr@8t zZefjWYWkX%ty{L9pREUkrqd^?S+PzB8lR(5eVmVZKy}%k8N)Qu(3$kXz8=u&YCW#A zZGfF0rZ>$_yXf5}RxDaa|58+!zln8Vlj}Q|ZDNn>ZcU?sQ0YQzQpS=}YomUqQw6E7 z96RQ0Rb~mYvAFK&xt+9i&mE3BEKlXAHbZ!p8N&0kd|M-Rc^C8gEJC#iH9tbd{xtRb z!X$Ye05-8|uiyq=%cGd+7NS#SZ&YX>>td^&SGWfgGltC@L}88YS7oN`{J!Al^ru%>lue0Dat~Tw<_D^LP4PF02l6*+$49VwSHHOZ z?(`aTN}Pz=ZcpqG7U#;@r(-t>TK&C85Xw8)A*$@T+V`p_t9ts?!OsreWDqc}bV~Wy zAU8AdR_MxYJX1y{oftkoFWjusELLfn7p+!cQ(Ht-r;#6Xcs#PU-6R)uo!#O}BQ)j= zu?4RbQ&sGy??p2rJw|eO8~J@+Q=$&V{kLmY|Qm|8(om6)m|UsV!( zX}lfMqtfqp%CE&6E={|P-BXqP>{F`lq8dxJY`d@;8{-`>JxL9vHLYe1RKC)Q{Tcoh zKNX*!t8*esphGigq%2FHB}>0cbZ!^qHPw1+U8EVb0<+e2O)Idd$yKHC=F7pK5@}L< zWrqO1$@_M{FE?L#65Be9Ijt|L-F}g(uEkGku2V7-Q-tg}Wa%EwI{oHRhHBJu@-TDj zKGu@zI%>Qc{!B1LFAve_cf!Sh!Mew*m-LVJ7-K({^$wMDBw97X1C7r{)=#!yI#A`> zCRwLu&QSZo^c7-zg&JMiX;^76G@a>bW2ck@ntV3ichzsHH74+lQ-k}x5BXNI1T|`f zVRw(Cj)TynP(_i)kWNWhE7%?}nG;^^Xd_ilreRZb$h~c&N}b28&LXQm>Z$9xIg}op z(~<9nYyY=Xs-m=K_bfgp%}sn&kY0`Tf?ZkPyIPI){ql(}i|>xvY(Hs6naJ^Z9d#Ia zB=H@4DVbzvmE(uK^@(ZOWtBZY{f^n7$MPS_`E&U<-j}SlXv-$TIG)_5XDoVp1~F$E zqv{^|ed&+>RjLBqi>0LR1H1WDZeeQtAA({k8{9_UBAp?pm3u>ciar8HCfAA@vuIUA z;tciGvsVolg>U77Y+J$y`Noc={up1s)Fs2dVs>HO$fFG3UEsTIeEWD5-{vFNl#%yU z89BfB_VFmbo$mi*j&of9_?1K%mtr?=q(`)QBYKl=!nn+?xlHOOq4OJ$U1cg?NVJId z(Q9daWT+JstI`<qG{CikI^~! zW9oa0`%;+4tlPzHD)VepnY-X9p5M;EWqutI8SLEdD9a9N1Ks-0Bo1TZjH!UdW%eiY zlIcSGN-(1{l)H~dyFt0nA0{hVQil42yd!Ucspgr|=8q^ptBdHC&r6qA=J1?MDr4Rh zzKa?MzFarq>gL>l8hVFIbONy_PO}i}#IsJk{7$@bT!;Gdjnv|FTI`YNT8~|X8fF3N zcJY!~fQD(SS9DRYP-ZZ#IHLykUZ;9bYC-E~TQUO*-%bZhZd_{$NIL!M^}cCtcqq99 z-+kz|uqi)Z$!BsXv4d9_wyjgo>$=b`80@`W7j?b3wqKLpU+nLE3hsf#a2$MPwH-q7ZR6UJAN&wBXT%9ud%p_bQCset-V%gUN(5M z)7ZqYMl6DgC|E8ZJuZ(feO_4eb*cO+Lz7*z34b=>@9rl2&F>mvr*Mf1z^;*@Y*{3J zK9xMe^2T$iw*71H*TG*zck;P#7x(QNVFwL6=$U@hMc!zB#Qey8yhgNxG`}~{{D}Dx zUyptWJPW)deuUjqxqf6v7!;Uha=9Z>B%I4m<+tvyOVK#NRFVHpi$QoEj|&}z=$mfj zwnMosebp=5sVwYO_p0#OYB|ik)qS7Sy9KA92QdPvHY#ZujF=RVcDX_t>e4&Rt=@SLg}{aoa(CL z7`BVXn$kK|r*g+}JwDZk=Fe2IOpfdCzGrgVZh~!BIJHd9GP%3Um5mvl<)`WkK1z&pDHGDF^VEKp$B{G90l-f3^zmutIT;JRWv7FTMJ-VpNnbkC_xvW#L4xIWc_&S~4nsy|4{&z*H zYjC4$1vR!jYYHDghy1zN^e~rU8e{5Ns_HRPPoO<4dJLkw>V6ZBWShfEr($=}ANSHt z8hk%-4%;KwgUqzxTsA&n`6ij$v^v^D_Yav9M+fk9F6p_$BHrUt@B!lq7kVK7AIWe3 ze|vA+)W)@KZR_){+W&!X+o{@{d-G~Ll}d^@PC`!N_{2`~)H&=*VZg)*7;eCJxPSdK zt~Isj)#{eCR;z_2nB}q!QloC9(eq`@G3R7LB3-Nedmx@3mW$ZrQusOv%qYil1Y2k6 z(=sk~(i|8xk^Ia%{mXPZdsXmSoj?8kz;va=^tkk6#ict!!$C$gN*6Oz1@kouP5ypW zov$c%LFIG{c`p3f&Xg6Q3Emzo?a0>d>i;V}0!qOeI$*v&&>xGg-{>sIdaOF1RRrK5 z-|3m(^&B&D;vGU~0eJN4R5#|KBoj)Hjawkz>cA_ovpS{(ALUR!v-D|9%hx z=(_nzfBC<8R7v$IJ!5)ZHY0%@Ui9Q+DXiZixH>YtG zo~!U83$s`%y#BU`8b1@6RZ~>CeRlf{-#%-v`g~%DZD~ZYh@<3JznQ^Sj6r zK+jS5x88rbh?S~&+0uuBb#hzkwzLmhIzN;$waiiKDD4BKX8W6Z{@8cle5US?QH@$9 z5_UXBrKs>gDT@Ex+%5I_TvfCBxT=cO*>Gy@pm-s+jD}vYwPx z;R7z8Pd{hkR_qi>`&yc3uHR$nIn%r3|EN2es%CXX^;t1=o=}_O9;V`SsQc4Vx>zWs zAF6+pjkkGRxE(W~cn zvAdmFo=hB8VqXde_yhR->btrJGd>@Ul6mF)3g)=(41DJGP^lC*7_{}&SLU~*`T5OgmXe?0c%<0Hf~Phx2Y*{Z)4?wC+&sCN zEi|o<_g&mwA8Lppzs*I=G_MyGzc1x^tYZlKWzjv6{(-(Gk35zod!nx{^a#gclj7_! zzGib9u^&B3SgE4{8e)6RpY+{p>4{4`Y|NGI`qPM_o^!aRx(!RU9cGg)6#ja)FfCQ<)(LH*Z}Q?g5B*^rap$6D7h66d^?7kML3ggzf1 z0}tDVIyzzKX!SZ-ox%RX8DL?jd?Hp^Tu-N~O`^@;TH^a?W6g1yVs~mj?99BBH986N zVyzy!SIg;B3k5Sw$42^d)N!byrpHD9$$THH66CXHu7j;IlYFk^Aov&GhJ&q}->%3K zeva+~+wACelxZH`yMpZ;7eBUHPv%^g?hk9@)2iOi>6L!(C0!;DJ`PQjJN4?B$vEUu zTi7VbdmVX1LEXB7Ejx7NF@5B*ly@L6zpCKKyFbXI+IXx85B3fPk8%5xGnN<1a%=`p zHM6^_64-X-b}MLlll(~zUh!Xqy(7zGM{gI+*2$EQ=IOP!R7X;;meutvSm>rEnz~!m zm(+hcKkxNA+dMPg+r+2otF{W}=DZ9{`fJ5pi`CD5n@HLkW;6M{L}_Bv-gZITi$(}$h9sw)TQ|mqi5pxD-*wz z#b?7&nuW*5=-PS}w03p7WqSI}P#0u!U9J*vQe6;*-l^g>x*F@5M>R)o(o9ZM+UF>D z^7q(`#+Iqtkoy>2;+3Mp_T0$MLublycn?dW&I7#@ygpl{;7RCnO5;ygAkOYN_yi-; zyP)6oJxyQX`krppgQua>7Y-D?RGYO$g#oL+R^ZEXtl{dgE6EkG%cWy{s_yGuX?dbg zeJYmY&CLXaM`8ZKWG)UykMVu5QxR` z7v?nut^hja_@qXX>7KR4w`@#LH-n;qb zuHTQbYkV)OY7Gh|stZIJSGQ8n%Hev;DqqjV%`th8c^a2Pc932}kV(8_uNG@!`Fg*D zVWv{OTVC7hI~$DI)udb;ZIo3M@^$(s>W=jXTr=f|$}zp8c$OE!x!r~KJ=N3n`+S7# z>a|dN!$Yz2ZuCq(ai!lL@}KlRzt$aHx0sO|wwZbP7#W`prJLenww_uP5aYY)=rFvy zy_TS(OVz#kbJ24@4%LhNNgM99y*qs|w=^{|Ze3CFei^67YW`exZ&*H`8`1Jg?M#;2 zZhF7(H)qf9PY)0^=`>d0`>z#4Fn^DI1oUjA&qp*e6^U6Q%%{mk8iZh^$N3N?9s4tl;8I;9b?}J*;kG23zfA*wQ{Nahq?j^ z8SuESJHk=*pTXY;e-nG~al16O`W;owdbFrBk-h&lnez?-?uWb3Nj1Jy!Er4U2akqA?g;Slh{HeJQ@}OgN(F z0DccXnMs$%^`%ixjOM72m+kVvF4X5i`abx(J5#GZV{jf;lYVpW!f4)A-i6V%3!`st za!r06{=6S{(tG4q)N2rTCmsZ^<~?%rR0$AcM)uLFdb2W;+z~{&`FDiJx$hN;vGKxn zA)~V?ER!#ZbDME-+{YE!!mmTr%r?Oo>28N8qh#kv(?9D(;~jzd|l-wlEEW2`Hh&8^(zDALkRVX*L5fpz$6YDZ~|0b?!ZGMUX)ufmLO zgmvvu7wu3JG4rr-?pJ8)VCFTj-RdGtT#VXJbV>6 z%L`ST@piepc{Wwk@eHIHA2@5&jWxQB`ViZsY*Vb)hw2psM{PIM&hF9cHK85(RC*n# z8U3#RWA1FWmVH#YabsU<40xk=syCrkkGtAjp<&8>wB3s~(R0=uCJ&EvJ=hfOd_?+8 z_>ZgJvFL7j6eG7~Tfs6pQ^~~b>DHBZ+x3*~XuGfKrSVfhZ7*}lR66g!@cxTM?Y}6C zL70JOlkJGAVDXO>bMC8hbTp#KvtGJ2DW+_fX8t_pNq39u0bCDo+YH_ORb5*lo`DI@ zpAt4bsxbvW{mTcsLr+F}^4nt`SMM*5dVjVWe?2#RE=vs#;*3+e*CSs+t)G~ByFmHh zgV zszN>&Hr>;L$7@By)aRn6ib(Z!md|AdL^UDLbZ_?4?v0nz8<%2|UZ}F|v2FqH^1P6; zoV**_)|GAaSD!K)Ne6mV_B|MGS@1mLB5e4%8~jf>)=F#m^?6%Q#xI;{voX;0d zxPXXO z6IDb7VfED~gU@xPxfNcIEao{M605|7$ScK(@51JTIBR;`GxgX3Bpqm80J9~JZZ!C7 zvW}L6MH61p^@^^|aoAwLIZNvc*^-s8P4YM>t-mPXvktstA#g?WWVLqm+0jRB>eu#-$UIjacP>Y_wttz;_sdTY5RTZWt*Pp86x?&Gq zwqtLecEnhX<(W3||H)RomCe|f)xdh}>wB2vGtI}jmc5J5@923Z{k{(Dz3qG+eXP!5 zKGSP3740(N_#Y2B{``s7yr1>y&pv0z=j`NlshGNNT|O5^kWKWt)lTn)y1Ttl?E2c5 zRr+1lt@^rdy9_yxLmv~}*!j45BWp#pK|SBRK-|TP9ekk)-22*K!BnVtWL<0bvmQST zxdQdktMJuMQe`EJc%s)J)2*rcS*r$SwBudY83LI`4Fihv8L^^c1L0$Ar2U`=9@@Y`E%MeHk+kdf?F_oL^yU99Xl1fH;w6A)2ENW-B7HS&-JlmkWPr#V#uiU zwq>H$H{&zdZRR4}Bzqzk9Xa#K2R4K+*o_jDrQ96&YAQ=s#bPrd_H;OJ_`zT|sr_Gv zN7+zxtW57hXJ4s3Tk*|?)b?}a_g9R@15T7!@yLh*h#YtSnTII?ofZ&^UV(KSNi@q`Rd1;&v9SX zf%K=NmSwYe4#DowLZXRz8*IR(uG4B4tKqq~dfcW7pkQIw7TOhT#DV{)kmqT9?Jq+w05dz=|9FMQa?S`A8aDiDDYpV=RB34vg4xlTOX>! z^Sk-SS>x5=-jvUD{?FAZJ>Azn)$dSwQtTe~j!G_in{)l;H{#y|T|XWlMIiUxNwDf1 z%MmMj-g?E6; zuqJhT8to*Ls6mz6$!MqDPEv84zs@2*DxEzSVjDZNefnmP+;$ShECXY7n`nDD%)ImK z9K>ViHxqZvQlHCmlWp7kYZCx>^xfnhk}vgBf9d?wqg0!|QRU%w4QV7;_u=ldyZG$e z#hvw!_g4Bx+wmsbF_2l4~IE-esN%Xd~Mf!yLpb({zbmZ&e3kw-9~n? zk^N~MCT+WqJWswR(LU+8*R&09AZFbD=TYAdAL-kk7kS6S?cgv@d@QMkI}&H>KjPjc z--}t_qU$ieQSFwQ3|E8y8dh)k{YM|OO!FdeN?4*dp^Ag1pzgP#Dw_!mC7NunTkjA4 zrOHv9UfGVH$*qgMD75hS|l9XYn zt`@8m7cW%t1K*&Qx+LB){XRdVZSHxtb9yY+B^D!JjWt#fLQNRk(|oke#%vF}*!r%e zng8>+e%ZX3>D;C(5KtX(_vh8tqTW3}l27@#I&O{st=Hz+N<*w}njP){EWhmsb`8RT z>Yk_P$PEYhUO*{g~R9_*vC)w-I`SQETV+0@%;TS8IOq5rI2FJ%t~@nzAF~ zmFz3JtbF`MHH@7zwc=h+o81!UGrP=)*bh;A`WZyqMMnua0$pjjC~ESqZAh}u-D5zH z0kI!+thv6*b*Mz3x4YvczoJ`~)mYS5!q0hDA1zF@S{<}u}Bs0F(7%(gSKdsn*i%qgRPw`veuA@Xx<+}%l~ z%}Qrm^%K9*tWh!9j81cux-hmM0;kNJBC1Tx5Pcz*V_W&dqamZ~RnEIv<;;(2^15@G zqil0_@|lfsylko)itJe%J8RoBqH1Vbq*St7BfWwq+Y?^v%EK+lxw_DF{ z|CrqhobF};8#nE9j+}0c#>sMDD+*7uQ4rOf*x_;cV#MY7491V41{$>?W+zUA-#yf< zl2ljZosQlSe%nl3zO{UzinYy%Z)Ytm-z>p!j+J!Q;$n(+ZV@xneCvqEJM>QQS{~-z zI*X(8%t!KfvW{fP@h93n{pL{Jm*0O|SAXv649pCir}i_R!_}YN)SuM$-wO+DbcA(D zzi;!M<(NqGg!(HoDVo_D*UBa$E0cC>la2nMYy+KOeSn z5!elZxth_hLx#yVAiBO#6@iR)%e6MFO6B((rf8_6)D@#_(dFH~2>Q?4t-ka5E>|Z{ zYC&@>sxjF8=m1jt<`(rRAm_emmSapeU4{RR?kys=SNb!4{vTarC7H5YQdg1{0zE`O)W)iHH_JZUvlSIm+^&3}FE#?-P z+vz#7*=p<3*5um6Jk@?R$&ZPdWbRk862$Q2$CEnkM(3zqDkh;vkR6Kkjt`%L+J}F= zEu67$q(mQ@hckG;_k#*;Sivi0sBbj2&yluR^9ODRX=_2}^-pPb^7|uKvH$Bh1+6O3(DF ze0`ulaI@??F$HFIKAVxsWE6I=jBd)|H@7>0>++uAdG`#@jzp&V7?Y=+gO4a2Bk!4fcnT<9vnD zuTwT2G&EJZcAlN!t+_i(>gfl1J#tZ-4?s-8RIhP)yZiMn74qB3o~ZC}pR9`~&$YAD znMZK$^HSlkxJ&B$K$p+{-VPGsz^(5l-{U(H@rCy%!pyI?OzU9ZQVzpp5w8xyH4q_; zZe#Q=uUQo&eWH~)OL*!0y3KUkX#D1AeQAU>{}_ywof02C9fh8oj91n!UvAQ$k0lQ_#>n+z9udw*-_|EuVQh#9^U*rp zHd;jJ9@;Hr8bihj08IV2ZO8djcXBZ2{nN|XKixMgNOu>r{!$e|L>|+I;Rf^fO?XG@ zcpJ8edBkW%FR#Xj4`dD)v#4{c7dbV!)#0rBQN`DEPBK(8DBC~O?5 zt9^bwG=1h6j{@sVS9Pv+&58HuO7R?HynkLk7N(osWqPO8;PNZJDbL;RIah<``lp~2 zI@Y~5eb@T**TmYr4r*5z>3nPJ=kN2o z;(jY+PagMPN&Se8_qaE1hh4rHzB=MhZ?3F*O|R&6sp#Dnb~Y7Z({0>m7hE+tgiVGK zwWE6s^U>v-vFBMgyIrJ}SgGkXHPq^D@yo-@<4Oqz_DZ{_T@ znrzu;LrqRROY?}&<+tC-^BxX8w$GB8_bi#F&8+L3`a|Ay8|dDaUh^YGtfL+0i^zI4 zku$k}sCj%I(jJAlZli#wcN@o6<-5Cewuz)gL0;3Nd4=e%R)}s3g;pIXiScsOq^mxG z)xE5IL{)<--4;=bve8+qxk~)VnOu&YPUTaji5O>{b#Ytv4BZ7CA8Q4ZFg&93h%Qc) zw^K} zUQjV}96ApB$DwstxnE|_>W|7*=Q}lmdw7}h;lAU;U*yj(#V@ecs+xkk8Mx+>ErxCj z?~g4U$H|O7Zk=1tg{*x=jP{*zd~`{mJ4T6@n|(O*ayOZmQPe~xdGzr~Xo^$2w;fIL zXU-QNg|35x!JqPObh0$-5|^rk(XsM&Vl4u-I(CX2)$Noci=CY>g{c%-?RE;?#yg?w zaKKzLwuMH`NbC?S(I%M+n69mTy&{${8P*>tZfUiAe`RdxwpqijaJ(IcY}6A) z4;3+k%_%|CRJ`1{~*nvDIa?s}Vad7)?bbmV(^6!t0K25a9pYM9773u=Cq|GH2# zX0~yj$f=*nyhw0l4AqyyNAx@JTMq`$!cpmC z`MKw~GuSKJ>-aQ<(rF5#b~I)TqmP??9fzznMRC@3lFv;zwn{&%Wz#>5VyHW|tge&K zmO8fXI<`ic(adgz ziCjmU?#8^@j?R2?GkxtcY|3u#mwu(Iq(dv;XGY%5Sef*9^4;dM_Y;2%3^LWde+>F| z%Vped*^hrEGq#PX`LWydZA7cGW@k4w?%iO~qW-p?JLFrl^c6o*zWG5m9Sb*Ym*I-8 z#Q3ojeMRlvv(S&1g|f$}v_n0wMzt#@<$Y391!rEVT3%N8nIf`36|WJSO|E-x3sbfo zGk?QCy_NuWUh7QrV(vR)V8=@oe~y^@jF^YYm6&Sdam?MFAKh={3u4gD ztQT}vxsAEsHpV6+IAYw!;gAUl^n7h2ypl`24%nM@jbs_GRmdh)ZR@lFkIsyf5 zQ{nNYY6)oG+d6V>&c&mEru@9yG!>Jy9jGC%5>>|oZAM0oay9r&TF77YEGk-bDC>HB zMH))0!&4_f&3m9DE`@OFo2J*VzWQYFx$8g{q{Cr4N}s3_c`>X(qegnBPaPy24OQaD z`YJspRq90bE?vV+VflCVbc3=gJsPM>;j-^qeSBT7*x!Ed&2(gbDIC(FfTh_RRNrB{ z(8^(ba?4p#KY?|O{xmTUdx`BQzz9l$eZ^1Qxn zrH|?L)hC5_Yny)XrM%*FBy9$@kR$2-?iFYvso6(|_ZmGeou<+Ji5OSGgVRr%U!!f) zasL?RQ_&?e-4310#-L2Y3SG!fYB$xRRzCIY{0(4d}BWp#| zHkpUT`OKo>N15z_8j|ipY#h&F*XS_3bj_pQpI1T&eF6EbT)&(JbKFbOHZEqGr&6to z%v`Is2&ge1SYo3bHOseCy>D9+cjn}KHb>3!p=LDdVZzVol!1C~-+VsCLR(?3euLCNDLts>Z!mu#M+&Z}CdxSa#9OWlwvA=8845TLXs?Pg;xCa-E!Hskrz-;XFhwcF|MTmLG#MdLnQ5FR zJ)eFK5y@-P+%a>h#5R7Vvw{ee4{ft!nPhXN=T9=K#fDzH2dbZo_krW16d%>}QS;*$ zn)?Apn1=l#d@5J+lzcYt0%F?j+nVrT^Mv!a;yEg?u8TR3rax4a&Y^KsEG{aHlY<>1 zf3Lo4^Ap56{mrHCPZ8_2i`geVR-gQI9BdA2sQHtq%)^|A%#zsUO6+2#@1k-rS=Z`% zGT2*t-(Ca{vn&>6M|Oq0<3gV~bNs2@((Kep zL?U_254tv@RXi2{H;?)vBP%lxyP{XA&Y0#zKkISZf!KWg+^g^^TbC+Z-MV$fBy*7+ zlW-xaCI7;8x1FkT{a|v#G1+RZ-A>MCC-Kbxtp6fF?(@vws*m?$2M+cha3-)zAlKVbHQ*^JvJw1_?ywV@5 z9!F$Yw*Z^+awEOnz<8dIRG;I1p4egjpf-=&BCqMZdW_(Vi)=<|pAF9)&(b^s{+>Sk z!(qJW>}4r?*%z*Co>M-q;L*=-CKNP3*@&>0`gG~L{7HXb>(fpne158_TFS>=?A)|# zN$;k5|E7DlZr-gQi^ViTR8hGW>!mCL9Q?OJ%t@%uv88fV^|nj(qn`*d2Vn~Mq4+mD z^1;nK3_}^&Vcd@NB__lR9Q%<|c-eMK)etAtG_)EVoK zq;botq8M~6amQ+vDViD~Uprjq5O!tj*?-bs-7&tR$4OmKJc@yCsCYc=u-jCqjNSG-^mQd{)HrUjeWlh2OVS*E8tr%!xdETu~I>6ah@Ec{db>b6qWDyst*rM2`+C+3ZN$pNQH^;3gu8w`3mx|@zs!EKu_)My+_^Lh;rQ1Z5 zu86S7runv^{%P$92gmwMSA~YZf^|Y^P8Tor|7p00+9Y~C?I$Ws`8;p#7_!`1qU~;| zuo-U~@*BC?&I^5lWW@AC)DcqmN%S>gP3p%y82LV;3O28PWRv+T;Si%1DcYXjgI{|q z`-5Ftx!Lt$8T}{%Jqy20%k(&O%eb%lmryx5-3PdoWq$G}YUv<}g z6)I#R8244~tNQX)XfbVaV^hy(&(*62aRWP_fK{8K#VVb>?s@m3=iT3`8gr$IS~hDH zRp*|#oYBYX_=vd{ItQPx<+F_Xuv1_TJuf|5$Fe(y!t{|g3~mlPF7h{Mvrm~BA}A`Z zTju_tXy+NLl~Y@%&dQA9Zi-`SpT-l9ZqRm(aTmt8D^AL00fGVB2u#1y7_mN{R`Z)@uH!yEXF9{-{|K?@uB$7m&-?h#c#mWnOo zywhiTN0~>NenKcnehSYX>iN@97fFv!kF{Fy14aDSmzu8%YD1$>L%o|liOpy%H$p@C z?h%?#n>5wvtlG9+S+i5wGya{?bI!f>NHm7lDEXAqK=*piJF}+t7F5v2>W47MUjYlWa zqz{rfjtu2e)_djV`1~%%7+2aArFUUHCiD!XO9s*pzP5vgWxYW2+sq8wqQGj?Io6p; zm=u0JisQP*9)(F!?^=Ift#?-?y79fna)Jl?gv?_(kQ5!_Y_}&O)qS* z^r)vx)Pr>b6XV&_(Ia;B*|Col?_>OS`}8e~sJ$NP^~l>{`Mcuu(NLkB&n%=Cu5L5a zJyFrSrki!(4}3EfyFX6k5$>k*ERO> zbodM&uzpmVC)^HGy7J>8bc3k7_$iqpi^YeT4asWJi^W!_Xp+2cn6JltG*w|>yfk192&LFeOm90kgMk3 zC7!9eG6U;qHrn=ZTm)STyKUx))a}qq=SX$-uMhSQk8V8zY?+S=3igYb?ut4?>>e;S z8}+v_En6Y7aD^N7pti`@w?NFU#O#hvi+fADONmu|tLa^5kh@wt(~@iy^a1AJ2{xHs zre+>1y&io&XsgV7eFTMV;U(<{H#UC(YIyk>gG@_qGO`b><()}&6dja>N}rDnvkDvdqL z5%`_y>XCC@sj0VD6d^L{_Coy1ju@6*{g2IB30CYxUwsH)AIO$PwHy_+mE?Tzpg9h+w@;8DmW z`%pRcx9R(-EVe19T+`I0@;^&N5uYr&@J$=JV>!*ZoBN)CY0%uvN@37@en;@^!FU z?6$iQyU#}FL)UnOYX4$3K2OgQE?V2#xgc0{+(>^X9*<9s#bo;m{_R*^2 zZXew~&c{BIOEMRzZAR`l%5dJ+^c<@LdTi(fw#gy%qQuB@t(eiB)UQKiYm+RQ>Ye7l z^Xb>g?ZS!uHFV^pU#C~tp4nS}&Q5s0iP%fFG#@DE=JT&Qn!HD+?-`oolyU8klPRC; z{x~1GKdg3Zb52U?YI&Ku>FK&=>CJQ0Gen!(W#?$eu-8Sp)J576WO{(6rgt*39)@l& zM;087&(VD*{URP5#Ubo19j@%<*wy#=&pl}xdF-A1``MI7>$bq`7`@^1*~-9v5Bhd~ z4}AAGx_Z>)Kk9$8KM%xlPFHgByP5uy|1U#-to`Qy(06sc_~=B`RcEj}G1&9R9FtN@ za`2{KYh$^0ggD0>{5I47ES|J1w_X!l4&J*<-cs!piaASE9pvjc(>T9wF@4UL`{VC) zU%is&*;6;cq5d@O5K}Ix*1VDTW1d#jdfL{${K{VQmAwZ7>wXtE*S6_~$LWddHYuXZ zW<->z?Izhd`Yf3Z4Qn)xn@NBEzZGZTcdiGYWlTE!ydd(6ngoj;i2pIyxp6S3fvwCV?7(p6Zer5NYIHN0`l(^h~1O!8eQkY1w$a zd32clAm71;zRC;5nk*cPD`{Lw(}$AgHj(={OoVsjI&%9!F45mrsJtG9TJbpl48s_= z-nXkG&gJA$wxm}($n5Cmk+CKMTTP_dhuyQR@-yYf zpNp}ct}J*Ot~}0gdKWYl%!FD|WN{QKI83|Z{y7ksby(;~ID|*ay4(XlByH|AqQo&_5xM?5izo%!;r4#HcK5wt4JWbzY z@SO5$FoD(2rAJ0Qd*{`DOFh)LEOeWT#{GXRD|H|oR$sT_ZcY87R&&|T=JirbgN2^l zr`&&sGB&!Z<#}&1TF3eK?pO9}vfV?W`axa}pLaOL>OBseG8oL|lqc2ujKAW{zQyBH z-68)N?q?>>@D2gye|{xw%&Yd->~<|xp+!B$!=S2NQ(m7R-8!$nxV(CQ$aoa&CI9By zOUK3H;-Z9W`5{De%pd!p*pA<6Tr>xdU6L11@~GZt=U((kXtOE)%Nk|E6+P5lv8I{4 z`B{!z&c(Hy^TR$=;tyw$rl__*|>sdp5GCcVgM?=(^%g>qK~z9e+-`Lp-|h z=;C(oivA;Rv`%Xw;?CcDGwGgiui;+f=TOnR(7(6sHA?OethZ@<(H&Tiw$(i^#^k29 zxz6LOD@}Ltoy{+VpEyl3Y67TGgQmsrIUd*NUUCPaa78chwcdy8@NTqoIyU8Ny`V}$ zRj#gw^8U}e+W*OHDkfz#H(VN`@|IoT@?r2P`K$Rblr=5mHB-l-dQ>v z`l__C4Hs2R$$l;8ix-zKE{V!Y^O|*47to^irDAbb%vrJ9WyOdSQDfV7?mcbiCMrUm z-4;1o7GE-B(6bTV%WiQM?;RQOvgF03SfVbwB|n?1XK^guA1uw+Yi|xU0sUxC-D|to zzHP6atMR99YY}SxBty5e_s7oCAwq{|x><_}fRHYE$(NP3t3~f6eOP>)El~?r@qjXGyyi znNxHv9tiDFoc&y%N@ZIftcn(A`SB{}H^(>aSII_&^a`4<^gunA%%i4;mw)yZA>Aes zT8F83UY2%VmZ6c!M9i$p%`B$jXY~eKFZJo8Y-0`;Hq7$o2g;jm(;jwmUB^uCB(_R_ zHKW|FA3fF?mUOwejQj|jiUIZ}zhleo&E2iY=i`QX zir~iWjn9WK@l#tN+ID;6dw$Z)Ed4r-B4dueE<5AfQ|8+TzKl`MH1-E}`#?Dlv%}G9 zv@3kKg)Uc=xuUEeEsw>==R%y#QLle*tjuX(jt*}&rPwUQlKlbWIH+er`CsCn?5w+D zdvYd&{VE-%ajB+-vCN)rsO%TxUz^s&?623#hAwo!@C>^s?0Ke$+1&_N^eXTSJjXn- zef^#*;sh_k*BoV2$CzyKL0|K3oQKD3x)^h}?Uk=I3xu;*zm4xV>sF8F9qh+i+LVv{ zeDP_>ox#fWh%Uo-OL^{Kced##jb&!m4S6VYz_6fg@nEchmvHvc^1|iN!*QuUZvwNk z8kDSW^|aKY>th?=>I%3g z_w~KowQhE89v$@?st8gODya#=ty_foH27bT6Y+JaPnSIs`|@^g#lFWQ+iFAj)p&&c z%-i5=cNE87=_f%i$2`%iF{hK=3Bp?{(M>e4duK{b|{Gpb9UXV4&y1`xP4c7{fM0H0$$&db0RBxH+L;|i?SXCFPIdxQBQb*r#8>o|3sj>jpR?tajp-Js@=U&Hgg6|)t+xamkrdY9{}{a+Q&Ug#Ag z$6VL$!?3~4!brnG=W}VhijU#>=tG5>Th)D+p2<10E}U6OM_t~;X(sD#25!yg-}zLp z`rNMNo9dNY1+gkHQRN`y`dVU9}N0%O5PKqwO;c&Z<3-?*MD^h_`H$Ewdo)2_9pB;Kl)EMlE9MAH5 zEZrrR?rMp*gC)+d2Du$}J3QVF*ZcA(Z{~XFk z%5Bd|=@zY&cFWZ7s&qz%YjjPGMl!#R?gLM=?F6a#1 zy?G_q=8jjSEgvgYhMUd6$2xA@-t^b2vL;Ny^5n;~+|AtYoq(1+ z|4#6j(DV24`8!osqCPtJ?W;CjD4h$|Nt2JeJQcAin!STze7tB%iE}Y0XM@F=%NH|= zm_xLoW-IjL^KeUg4kz6myNVKE?k~g}jq7*at+D!e_G+rCX_Indg3=?YgHdT@{|)~e zn{^&4kVm=#-*&kCs*`!&Da=mvJH_vm<-b#IZ!ajD^O)+-rn1~wwJ&9>*$avv!CF%f zK5DVptJ+q>JdG1O_(e=^bQz`iVF^HY}UNg9jnn4c7W>ehY*z%cK=h*Hh$2MINx}zMP zEdDf1b{w7KXZ^}H5xk@$&v^saNXNMhi&m$Iy1S=?|Ep;DjdF=o;U89LvQ{5i zakLs{fRaOzOWKZWYB*nqE2-B}_-U?>qo|vZbzK(pT*XwL-gkJ-K0__yC>LYI z41Dg6HQzIc5}5hESf+o;A52z&qr}1v9EW-@$KnZ3gGJ!+H-Xhn@9)ZfVY`^#*AM^Y z(WpnGw;hdkMgB(dl(k8Dm@~i5{2JFyzv`as?`>*`;T|kjWE=M0uolW5gK>Kl9;p_K zg25|h#Q)1aV`IJImpbS2#nf!WpkfiL?~^U@&pM8Lfqjc7wY)r5I8ZrK-&iZ?DCS+G=YZO9%tn3; z8yty!ruP%18x*hgD)cO%1$Zu2f?dgH`q!9;GrcNbAB4Ed_L9Qbt!T~?8zVWNZDgjG z`<lAtkXf_1by+ftdbfMDXU0UJ9)Zt-nW|4fWIyet*tNRi z75KSD|AE1UcKh zdM8k-m1)D>w|KA7V)hzUJo03g<7vnx(07tcpn|A=vOQmjv-k2jHtv$Ez@}X2_1hQ_ zo5fEiN`3Z;@=~_jaZRhrMX8HVXGS>A_j-J#jK0sx`MhJ4M`3DONx$&ZfDxO&0hVAe z>Rk%-Ik4f8Ssf21s&(=^XVO>vL^!MZW+wLp!Km3ZgcE(WuPb#fts9qit#|LO-a|Ot z{a_W|itjL6LH}em*&#mGX1_Lqhu;vdmYY9%e|lb@!1C1t`azV<0(V5g6!q(S?kl2f z^R*+&5%o-UIc93&-R!G2pGMxg9x9Rfiu>JRd{kF26FCv1Ta74olGZyztvA>h73zjp ziiW0D(Z49D9;H{%%oQH!jBgZ0q1Dbm`-*Z2>v^__&w2e)UO(b*Iuem0GTCbbh(A;nVLPtK`wEH9C32dBMJOv)jCHZ1-PZ_YJ=OR0x5U zYm02L=9B!vye7h@u}b>&biUKB2t}9811gDP{9c*=?95ypU_6d#(o=BreW^@vwqxR{V%&B01oA>Hlma*(A ziE&;zRzz~EBx{OPQH8=p=31L(UbLDh&8OFIUD##;);i-5xp;(Nk^}%rkSF*qxbi zB#yUt~$ zHt&^9`4{wf`O|mXB9v-kjPv;8qm<>VAJ$_Qc0HsqO->ABSyx{%jN4+j#fxE!zgP5r zD!y!Acf_80V&ivhkvwYWGR?Ew*!#phwD*}+n3|3->$xtOdXvXIfWx-_*|MJNsD!^v zR4D&YwHMVTs%X>d*Y|#{=-z@C;W@fuSG_M*+|w)B8q~!3+nL72l4a;BofG5ex-T;` z`>QJ*fl(#8!vMx4u%jRdeu8S@8GQ3VW45k1LORa7_)<;Fr$_=FGc6{cM{z@_Qj2HTj(4@}Z`krFtS}`9goL z1J`^U?uYs#ZPlE0p^Ki#lA2~7x^@B=ZhK^zCmH7}{itg+d-Xt>=JX1?O*$RVx}OHt zo!uU6u63Rr=3-uRLb_wDRQu-`yZhWi-*ybWa{qP=|KL?arZX(>+XE^V;8E*Wz!d1ZZ}rK}eO9o$dRFFa&BN+>^mg~`9Z@$E zQcynHSM~eecBDNH+2)p1=ecztJfv@Vyx$s$h^WcfV$up+#=0xCbr-ruqN_$?N4Y-T zjR%TU$aiD?vFbLny?ObJnK2TPqiC~eaeD5q&S;%*)IPrsxj}uhUVFxnAD>08!>%c{ z(REd!M__$MV9(_l_r;#s9J)Qt6tnO7+~JrkYCh0}a^hh4wP{E2`MuR&Hv7=W_NyiW zp#( z+Dx>nE8&0k3`IoRWG(CSJkjH?bw++0XWl?aAIw{|k81KJt8W9g4uvRt|Er%%?M1{F z{uYZ!e^hQ%H+_#4cf|E@H?SeYwpcw7E^PnLRRP0$ndqtA&dra*EzwG|e-?$sre^~l zugMEEpp5+_c+wAe9A1!ZRdkOUVia7*h9}R z9EY%YO&qo>NSNSasu)y?PsIQpD{qB&h4GC%an4coT-YkH<=rhFE8eGA@#A39rh@te zWcSxiI~glt^Q)nmWn?OC>7+NWnB6b#um4$`kB3#XlCD7a$oI!1_iz2$qQdnX4ORX` z*j*_Eepki#LUHNgjcx%eJ*rW#UFdZ^!Iw8x-V5!DJk%b^XL_BhVdd8z%U8FIJA=Kl zy^e1zFYW#qHyP{sjVk1gv>@~ajXq))>U5|lxV)*jZG_72mbhxKxH&V^%!tQ#*^>v4 z+rAQ&dMNGAq%S&e-9EsK$OA2&n?-jGHISapC#Pmg^=84)%xD=Z7SHwooHrBnXb(p z_Lctff79~WanE%RvCr4ylW|AI9pU-7KhQnH{miFgdr6qkT5S$?jp6(>hI#kGmNFS; z4{Yjg$c-^y%GO@U9*#~LGyh&i9_W%UgQbhQ{rcSj&YE4l+$~sNG-|{qU&~&i-@Xjq zxq9{M+EJ<1FNq7Hsv50qJYyZBZlQ1ALNj3#jm}oVB*doG@@>#q-hU~onmm_h^0TJ? zT(oV_?RA%2n`h{RxCuqx$}_1;3FSgE_YD-^9)wUFhB*=cqOd$HwK-iFozO!&5PBROv2ytUXk(>D*Q~ zZfm}ES2RvAviX+Fb#-@@=b9(d=zwH$9b4gZeWWApZX%8PI@P~FRh?^2*H52q^K)ym zSf&-pkL10gx}xoiWJf2u`=-qU`dRfarT}?Gb^d(fGu0ih6mh|K+cc-ibATr0xI}>5 z8SBmkJD(yv)w6K+ne>UZ?V&$+X4tvA`C^U!3!Cql@9~{qxx4&I8X=a)k93lei99Y~ zf+xj~@HI@iqA$3vIWnDb--^6kon4IgIDh(es%mOiMVU@-M@;Uq;>9B=r9EbZ7yD!I zpTXY;f0MHDQ^gk+C0{63-qU;ZUeVia)p2IWKZ?{6h4Li)(`iIpaj19bgD~?zD!de9 z=oqT0sD`cGVMo#EbJKCgq*8K|OILO(KYJ(3V-=U#HvpBzhPEg0t#bIb9DPF>2p;>9 ztZXjZ@Yq-vS|(JvFWo_EMl5$Haz6s8_tH_T{hJAHtq{w^e+A-e0>=zi7*50 z_%WRroO&*PJU72Tx%qQ-aPJ63KM6%J!1S8eziUHPWYssN&d5cTTcx{em8goq)G~vL zsTs{W&FB$zRJ{nevstUr^Vtl*{D^RzpIsHg-{`uo=X<2J0L}jWAsSAX!iLP++)0sy;@x#vxr?PY(;vj zxfEyNf36!}{9ON@Dbiz4A#usIB0eTivp?ygHRhv#^Pj?I$=r<#+3v}6U%dCpK96NX z)jTX8d*ezsle_J^P1S&-^no(ohePd8ZjRy@b&QUS7_3)smMrI`JT}?UTlsVN!DIRI zD%(M&O`tV0%!)Q%#=1O3m}a57hl zhG2olWhSwT48Kj6?fBQIqw(pGO){1#Mxko~nn`{aDx2EyDDc0%DX46G3*6EI!w3A|0`zp}TJ_%LU!%!nY z2g0_VH{ue04}D)3dLHj_qIzt-KaJ0_ITJg-rWxm1+jXYi#AmI~9$7{NeSG9T3KlUdSekl*VwYVje0aRVYF;mws0%*qX10@2>NVDC^pPdK$j@$?nKa&-vNl<=}I@ z+WQbUztO+2)~=%KqN1CH|NK$;$)(=;{UJ+Let)QgRiv7 zB2~S?qeiMPRux&S47@aIB&P;hecC4~9#@L0jMIT<{9a$<+dtFSqfy(+&7R#l`$L2m zU!(f!6UAz7#TLVgjhh@moqODF-TJ28uR~UPG}N%a5^gTkX=eL$W6g0pbbgoA!#(!% z*sm=1YoAZhH;&0+oHzHGMENs``b8k~S=jE7pGD{7B2243yz$g8m1$I&Nz>cA?_O-* z{akUHO&+HTXLAHk^vJ3HSbr0kypWHEGiDnzmAXB}aOqKP$JE(GQ@fdO_g%Zb@eR(k z-hs)4@>%`zGg+fE;qzP-5YP*zi8-%ZqDXRO4T*Gy<*U!!D!Nsik5#0i?XjY>iXWR*d>FJ99xKw@;~x6sdT1u- zV;5aXLA|mWdwe0i(Q&8|91aymK3Ax8uF!3=li=BUXuT70{+p?}UzVw2^IR3b>rl(K zDt5enW~I{oOf`_YwLQ*c>1#bhceMSU>2Xns=F?K$wlb%poct}h)isu z^%>-6-zB|Yrs%D7JwNF#Nj07ir2m;dAs9t3YIEBoJ6#DBw|m+)-HV}bX5Z%rRq~lP z(AGWXXzYT<{5*Wzk!|`OI=9fAF%dAgg6NvFyQ-qdwRj~yncN!7m*2mT_I}ne>ofL= z_vtF@Z33Rm>A%nlgcYWbb~*rk4MCHzm`5NDJ667HF!SJC7;N*Y4y&5(M|#;N-+_F>7}qVZQeC9f$Ve0#a(?a>90D+g+6ya`(yQ} z^7*3{=ey~7YTW9ztE<~rZpt1WIHuJ>{dFBlU67QUHRSOmo1q3$(uL<<@&0(lzOhDT zx>3M=2Eb8O{L16nq0-Db44E{lfhbR&b!SRZ_f#9<$w_nC-T0AKjT78JVWrzWu?!l(R>T1&m6Y z9@Bm8cxGc=9B%1kV7Gnu$M&^vgnp)&=lw7`YUj&rp6Yr*uSQN)o~ds;f%%Ga+b%=o z*PI^sD#UCj6XPiYxJ@6r5jrRTDeUFvu0GMtC%W}9(QO|2 z33x88v`)9C(Sp`zV){muWs4R~EoWP8U@!K>d7xvc9QeuDA&!fVl{kH^`mPNx+d&Oi zGAH__n79jZW#8%yCpwoY31A3y40gpJn`_x5g9QU6_8k*k&|tJ%FBETO%-svU-n(EO z?JNg+byH_BZ`&B+>X-*&hOu9-g2LlUUz=rxLH;5jY_9x`+DC{ub^D9-lThzjCF zzk_L1_>ER{Zj>xMd#K#2{fZp(w~KkJ`sQmrD?B^q@iN>e+*ywKJ-r+6^-kPY|8#2E zOYHnsc118&XdLry=NDrVa#zf6hpd0IfW>mmJLVS$^XOa2iS}wyGj~ILCe6YkA7Nbu z-fdOy&G8+q-FC3vZr#DMQ53+rDsiu+-k)0PZDaAFSb@!g3an$%u{fXl)mGq)y*t%s zl(p%zx@t@w1ynHsBG=nauZmJ5u$`yu87iqmu34}koF9yvNMZ30tO zVY;p{=}c#;AKjLZFwL%H`U9A;O-4_(5tsajZcp2I#K!6BjC3B7ui7R z&U1TpdzH6=_umP;y`6!Y*Au|MU(w5GH88qby&}-9B0z^R)t0?lM?;EBQ2Sh;8eIql0R3@J?Gu>oc&{JE2x!9_T!dfipY>`BgXv1 z;gcrVxYqKv^$(^Wqd(=ZkbkD%x5e;}hki0Yg7=9>ce5{$**~bd^RYt=PyWXiZduCvN=!Eba%wC8Pn zS3XN+uhpzyeKzb-jAv;c@wv|YE?j|~%_lXKPHI3OJUgyns;m!rGuu)*-_S?qG%03Z zL_X_sH+D)mJJH71(;et7(lQ+q%D{F*b^<7-Pi))^hb}SV2UaKlml};b2+ZdZv z&mI|=)ir6;@^ey)_4v2yt6NpZa-ke$dM06=di20Ct9e@7SkkYTUO_Xvh`9w-`TVo{ zmblrg0d*Xj&SM%f$!gbv&FoWAgr!j!V=47N_gg^Rxi7wZL$9$H>b!+q1t)&(!*Jd%n4V`y>opL(9xHp@V z7F-c&QOTk92BX}lCY<4>|kuf@ZTTBbB=svqk%YmvJAN;3d7W!S8e`E1i| zmTSxIp0;c>pUm}%j{^7M_`2=s4$J5n^LqvCwY9CJc9ou==%9`9co=H%C1|7z zJ6K7 zFNVs4&zXRqs{DU^zmq$FgMB1-UES z-K8qmC?!r?K3U(Ry_|Z9SJSY@+=a*2&-DyiF?5JF!--wTrcmVfem(fSXkUeE!se+7>jR0_1+bN^wVsZ|h?jOw z#C{&msi`1y-OgfEEoaA-ZD?OBV%sWx>UHpzO?;r}KO5@v*}Rkf1h}fS|M^HtU-1)J zzz?!^Sgn=NJy7@IY4nO>-}-ErapyDbuC%|a+f2K(C$n3>COhhwV?dUf-!p;@I@KTg zL}4%4g=A9_R|Edu>T&a&c*H02m*}SHsh!qo_nqDey5yOLi1%Fyh~obzLKc|fl~44& zZI)sSp7+Vwdpm2a|3dF|HPiBGxJP3jbp5;C;U{le_fuu6??OxzXBkk#q7QiTTw;*- zZy}Fu!AwZtQ@$Kp5qct5^vGYszNZRd>=!!IGxSHk)mLD}kZ~BUVMV_K(>dAF#l#+v zY5k`w`i*$*-SDT+gdwoQj4Z>@xt`M zSE-oZPnYj~?X}DjgLLd7cdJk4_%XZ}^UNOlnat4zS<`a}!$r&_Ec0x30OaE=+ATYC zJ&sE^#$vV|p8=4Yd96APu4EgIE`An zG`j^8&3u@MEcT7pf7&hMU13tiMNt zOS^a+Vp0%dIAL>9r2t;U$&h^@(WWKmYbsyrPP!07`>o!a6IplOA+|j2>fbN*2=^L0 zmkwpe?8pZ<7LDtDt*p3Sp--~{`as#)#LlIZ(GP|D9aWF4&U&T) zsXN6g7n_{6oqG$Jt?Mtr+k9fc+d(oc@^*m=Adf4lGLBJ}q^fzI=?=S;RYg@tOhi5S zADWI^um3v>a-<9cPT(#e4cpnLp9VS6OHay4z7)>>Qj9Pf8@hUPnevgkQU(8gpwIO} zxd8q=_1~t6Arc^eu&FYs$|e0-%gUl9N?#>T^=pBDxkjX8YE)aAj}{^VYE# ztNcD#1e& zKIN}NG-vvomtxk*EI)A#&YZl;=p+q3VU&ZQ$?jGjA)CL@=2Wcshw$~E0SncU@eV|V zLzb6cNgNmX$62qa^x0K2o%MVw;hlP?f6=trtMXn|`pES6gT1SiyxcL>o}v2h=~eL3DtO;Wj+;{Q z8L{+}PCr>kviHT$)))U@vM`5(|EGWJxU#(h4}*H6-#N(6tPzhc1_| z0#Oj#AmDZ_(j0e$#iOZyI!2nY4=aDW0F{Aiw&+t`2a1FX#g=rmz}%2YO^-7p^R+8$ z%)NCQGL{qFKh*f>D z`GBWwdB$8kbJ)DFd;i>!;Y5v6PdaSgL3&J^Q};{~j?9gl0v?6%~;{wcOPKgMw%c2|Aa zXfHXHvJ2h&peTObh9PPqHn%n(MPCZNu&0sl-w&}d88P}UX8-W@l_KX9+du25L*aEY zXKFKTbE?y&NB*Fz!royQ`M;Sv*ellejgC7i&W_2?2M+X!P^GKht-A88-W%Waf;+e|b%v3-Q-5nrjKAtI} z%{@~WOCNJOKAS7$b7_3AsFrBHcrs?UuL<5B>2T*SvS&L}&5mn)5n|IngMS-+tj)_k z9CnlB+Z}k6I7`eXKh`H;GmVelIJ1;j`p)!}FuJROWtl#aFIFQj6D^rD4a|(2ZFi7G zzEr6X!)FAK4hxLJmd^*Sr;ZY1l3?UbI~g-6qGD9Z`ISgAvU4eBtvb|XsLX1oiuwoY zdqdH|e6eQV+se&r!QR;nWa4|Wu&BzfzWPLZ%Y4?$=TFVI>%-~;*b$pn(yWTdT0?bA z9hYf0uJ!1~niJeGlk@T!vFXT+c&a1q>%dmm`C@PlhYcQ4#iDw-bmT3}e%G!{>$2+1rjix=$y$a{1x@0WGX-p_S z2tF6T9_wA{*LB>Og`=8IKY}B%9(R5b6aikW2(QY%>vCYfXDQWc) z=5tdop@ZpK7B2NXsb$0BHRC;gYx<9jy(gwhf2PVq)`r;1kM}%-jab|eCETTaM}>hlB>;)xrFb?n1rY0w0ZNb7SQ3$ zthB9ySuBpWyISjvb%Q7JW<+4r%10lo$6~OBbPdI*>|sDti7IVeY`7|R+S!u6r+iMb zkBeC^JrfGZfh@C_mP^nR$HpCSoBmuKwXxIKwmaslJaTlttBtwIWI@Ju!I>?NAW@PolZRov5V+W>yw0{?sYN{fWw^+g5OXe^n?`p$DyhBXfach{58ScuvQcd5BrHz0bs{JZWKCo{51u z7buRiy*Y$6|-m=|?mCh6NNZ%$aGBIsWmi;!>RP*Av z)@1QYcY)MZNl)cBQEm9vyv6Bju{ox6apupEAurnxm}cJ0ufjLo%XL2*rv%#c%5@

^3sYO|h}I@ho56 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 cj=~W{rRO06Bqk(c{dD**=UUa@t?;`4KiLd Date: Sun, 24 Dec 2023 01:04:42 -0500 Subject: [PATCH 24/73] This is the closest we have so far And it still doesn't work right --- Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index 4177dc48af7..aee4092dbb2 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -81,13 +81,15 @@ private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, Se if (TryComp(args.Lamia, out var humanoid)) { - foreach (var marking in humanoid.MarkingSet.GetForwardEnumerator()) + foreach (var Marking in humanoid.MarkingSet.GetForwardEnumerator()) { if (!(humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings))) continue; - string segmentmarking = $"{marking}-{segmentId}"; - _humanoid.SetMarkingId(uid, MarkingCategories.Tail, 0, segmentmarking); + var markingId = Marking.MarkingId; + string segmentmarking = $"{markingId}-{segmentId}"; + var color = Marking.MarkingColors[0]; + _humanoid.AddMarking(uid, segmentmarking, color); } } } From 27015d4596f6ed9bd8c5781f8287e95ce34f75e0 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Thu, 28 Dec 2023 11:48:34 -0500 Subject: [PATCH 25/73] Marking parity! --- .../Nyanotrasen/Lamiae/LamiaSystem.cs | 10 ++-- .../Customization/Markings/lamiasegment.yml | 17 +++++++ .../Objects/Specific/Species/lamia.yml | 40 +++------------- .../Prototypes/Nyanotrasen/Species/lamia.yml | 48 +++++++++++++++++++ 4 files changed, 77 insertions(+), 38 deletions(-) create mode 100644 Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamiasegment.yml diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index aee4092dbb2..150aa7233d2 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -77,18 +77,20 @@ public override void Initialize() private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, SegmentSpawnedEvent args) { component.Lamia = args.Lamia; - var segmentId = component.segmentId; + if (!TryComp(uid, out var species)) + return; if (TryComp(args.Lamia, out var humanoid)) { - foreach (var Marking in humanoid.MarkingSet.GetForwardEnumerator()) + foreach (var markings in humanoid.MarkingSet.GetForwardEnumerator(MarkingCategories.Tail)) { if (!(humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings))) continue; - var markingId = Marking.MarkingId; + var segmentId = species.Species; + var markingId = markings.MarkingId; string segmentmarking = $"{markingId}-{segmentId}"; - var color = Marking.MarkingColors[0]; + var color = markings.MarkingColors[0]; _humanoid.AddMarking(uid, segmentmarking, color); } } diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamiasegment.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamiasegment.yml new file mode 100644 index 00000000000..358e2e27f44 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamiasegment.yml @@ -0,0 +1,17 @@ +- type: marking + id: LamiaBottom-LamiaSegment + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [LamiaSegment] + sprites: + - sprite: Nyanotrasen/Mobs/Species/lamia.rsi + state: placeholder + +- type: marking + id: LamiaBottom-LamiaSegmentEnd + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [LamiaSegment] + sprites: + - sprite: Nyanotrasen/Mobs/Species/lamia.rsi + state: placeholder diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml index 15b8cdd583b..53fc8a46308 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml @@ -19,8 +19,6 @@ - type: Tag tags: - HideContextMenu - - type: LamiaSegment - segmentId: initial - type: entity id: LamiaSegment @@ -32,29 +30,15 @@ - type: Sprite sprite: Nyanotrasen/Mobs/Species/lamia.rsi layers: - - map: [ "enum.LamiaSegmentVisualLayers.Null" ] - - map: [ "enum.LamiaSegmentVisualLayers.Tail" ] - state: placeholder + - map: [ "enum.HumanoidVisualLayers.Tail" ] - type: Clickable - type: Tag tags: - DoorBumpOpener - type: ExplosionResistance #This looks stupid but remember that bombs are likely to damage every segment, we want them to be decent but not instagib the poor lamia.s damageCoefficient: 0.2 - - type: Physics - bodyType: KinematicController - - type: Fixtures - fixtures: # TODO: This needs a second fixture just for mob collisions. - fix1: - shape: - !type:PhysShapeCircle - radius: 0.25 - density: 80 - restitution: 0.0 - mask: - - MobMask - - type: LamiaSegment - segmentId: segment + - type: HumanoidAppearance + species: LamiaSegment - type: entity id: LamiaSegmentEnd @@ -66,20 +50,8 @@ - type: Sprite sprite: Nyanotrasen/Mobs/Species/lamia.rsi layers: - - map: [ "enum.LamiaSegmentVisualLayers.Null" ] - - map: [ "enum.LamiaSegmentVisualLayers.Tail" ] - state: tip + - map: [ "enum.HumanoidVisualLayers.Tail" ] - type: LamiaSegment segmentId: tip - - type: Physics - bodyType: KinematicController - - type: Fixtures - fixtures: # TODO: This needs a second fixture just for mob collisions. - fix1: - shape: - !type:PhysShapeCircle - radius: 0.25 - density: 80 - restitution: 0.0 - mask: - - MobMask + - type: HumanoidAppearance + species: LamiaSegmentEnd diff --git a/Resources/Prototypes/Nyanotrasen/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Species/lamia.yml index 14c5a80c12d..4ebbf140348 100644 --- a/Resources/Prototypes/Nyanotrasen/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Species/lamia.yml @@ -13,6 +13,30 @@ sexes: - Female +- type: species + id: LamiaSegment + name: LamiaSegment + roundStart: false + prototype: LamiaSegment + dollPrototype: MobLamiaDummy + sprites: MobLamiaSegmentSprites + markingLimits: MobLamiaSegmentMarkingLimits + skinColoration: HumanToned + sexes: + - Female + +- type: species + id: LamiaSegmentEnd + name: LamiaSegmentEnd + roundStart: false + prototype: LamiaSegmentEnd + dollPrototype: MobLamiaDummy + sprites: MobLamiaSegmentEndSprites + markingLimits: MobLamiaSegmentEndMarkingLimits + skinColoration: HumanToned + sexes: + - Female + - type: markingPoints id: MobLamiaMarkingLimits points: @@ -24,6 +48,20 @@ required: true defaultMarkings: [ LamiaBottom ] +- type: markingPoints + id: MobLamiaSegmentMarkingLimits + points: + Tail: + points: 1 + required: false + +- type: markingPoints + id: MobLamiaSegmentEndMarkingLimits + points: + Tail: + points: 1 + required: false + - type: speciesBaseSprites id: MobLamiaSprites sprites: @@ -36,3 +74,13 @@ LHand: MobHumanLHand RHand: MobHumanRHand Tail: MobHumanoidAnyMarking + +- type: speciesBaseSprites + id: MobLamiaSegmentSprites + sprites: + Tail: MobHumanoidAnyMarking + +- type: speciesBaseSprites + id: MobLamiaSegmentEndSprites + sprites: + Tail: MobHumanoidAnyMarking From ab78fcd804f85404cf2cf2c9bb1d87bf526f91ad Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Thu, 28 Dec 2023 13:17:45 -0500 Subject: [PATCH 26/73] Update LamiaSystem.cs --- .../Nyanotrasen/Lamiae/LamiaSystem.cs | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index 150aa7233d2..98ba5d47b91 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -77,21 +77,19 @@ public override void Initialize() private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, SegmentSpawnedEvent args) { component.Lamia = args.Lamia; - if (!TryComp(uid, out var species)) - return; - if (TryComp(args.Lamia, out var humanoid)) + if (!TryComp(uid, out var species)) return; + if (!TryComp(args.Lamia, out var humanoid)) return; + + if (humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings)) { - foreach (var markings in humanoid.MarkingSet.GetForwardEnumerator(MarkingCategories.Tail)) + foreach (var markings in tailMarkings) { - if (!(humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings))) - continue; - - var segmentId = species.Species; - var markingId = markings.MarkingId; - string segmentmarking = $"{markingId}-{segmentId}"; - var color = markings.MarkingColors[0]; - _humanoid.AddMarking(uid, segmentmarking, color); + var segmentId = species.Species; + var markingId = markings.MarkingId; + string segmentmarking = $"{markingId}-{segmentId}"; + var color = markings.MarkingColors[0]; + _humanoid.AddMarking(uid, segmentmarking, color); } } } From c359dab2239343d55c38629542969be852ae2e2d Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Thu, 28 Dec 2023 16:09:50 -0500 Subject: [PATCH 27/73] Blacklisting Lamia from Storage Containers They're too chunky --- Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index 98ba5d47b91..f65eef6dead 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -5,6 +5,7 @@ using Content.Shared.Humanoid.Markings; using Content.Shared.Humanoid.Prototypes; using Content.Server.Humanoid; +using Content.Shared.Storage.Components; using Robust.Server.GameObjects; using Robust.Shared.Prototypes; using Robust.Shared.Containers; @@ -72,6 +73,8 @@ public override void Initialize() SubscribeLocalEvent(OnRemovedFromContainer); SubscribeLocalEvent(OnSegmentSpawned); SubscribeLocalEvent(HandleSegmentDamage); + SubscribeLocalEvent(OnLamiaStorageInsertAttempt); + SubscribeLocalEvent(OnSegmentStorageInsertAttempt); } private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, SegmentSpawnedEvent args) @@ -171,5 +174,15 @@ private EntityUid AddSegment(EntityUid uid, EntityUid lamia, LamiaComponent lami lamiaComponent.Segments.Add(segmentComponent.Owner); return segment; } + + private void OnLamiaStorageInsertAttempt(EntityUid uid, LamiaComponent comp, ref InsertIntoEntityStorageAttemptEvent args) + { + args.Cancelled = true; + } + + private void OnSegmentStorageInsertAttempt(EntityUid uid, LamiaSegmentComponent comp, ref InsertIntoEntityStorageAttemptEvent args) + { + args.Cancelled = true; + } } } From 4a81c2a975d2f002f88c11115b2dae33c249c090 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 28 Jan 2024 20:46:48 -0500 Subject: [PATCH 28/73] I promise you debug this isn't abandoned --- .../Nyanotrasen/Lamiae/LamiaSystem.cs | 3 +- .../Mobs/Customization/Markings/lamia.yml | 8 +++- .../Customization/Markings/lamiasegment.yml | 16 +++++-- .../lamia_tails.rsi/body3tone1.png | Bin 0 -> 625 bytes .../lamia_tails.rsi/body3tone2.png | Bin 0 -> 699 bytes .../lamia_tails.rsi/body3tone3.png | Bin 0 -> 648 bytes .../lamia_tails.rsi/bottom3tone1.png | Bin 0 -> 692 bytes .../lamia_tails.rsi/bottom3tone2.png | Bin 0 -> 779 bytes .../lamia_tails.rsi/bottom3tone3.png | Bin 0 -> 871 bytes .../Customization/lamia_tails.rsi/meta.json | 41 ++++++++++++++++++ .../lamia_tails.rsi/tip3tone1.png | Bin 0 -> 611 bytes .../lamia_tails.rsi/tip3tone2.png | Bin 0 -> 551 bytes .../lamia_tails.rsi/tip3tone3.png | Bin 0 -> 567 bytes 13 files changed, 60 insertions(+), 8 deletions(-) create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/body3tone1.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/body3tone2.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/body3tone3.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/bottom3tone1.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/bottom3tone2.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/bottom3tone3.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/meta.json create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/tip3tone1.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/tip3tone2.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/tip3tone3.png diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index f65eef6dead..7b6ec3c0071 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -91,8 +91,7 @@ private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, Se var segmentId = species.Species; var markingId = markings.MarkingId; string segmentmarking = $"{markingId}-{segmentId}"; - var color = markings.MarkingColors[0]; - _humanoid.AddMarking(uid, segmentmarking, color); + _humanoid.AddMarking(uid, segmentmarking, markings.MarkingColors); } } } diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamia.yml index 21438d7a8c6..16f88a0c5ea 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamia.yml @@ -4,5 +4,9 @@ markingCategory: Tail speciesRestriction: [Lamia] sprites: - - sprite: Nyanotrasen/Mobs/Species/lamia.rsi - state: bottom + - sprite: Nyanotrasen/Mobs/Customization/lamia_tails.rsi + state: bottom3tone1 + - sprite: Nyanotrasen/Mobs/Customization/lamia_tails.rsi + state: bottom3tone2 + - sprite: Nyanotrasen/Mobs/Customization/lamia_tails.rsi + state: bottom3tone3 diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamiasegment.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamiasegment.yml index 358e2e27f44..c6271da70c5 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamiasegment.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamiasegment.yml @@ -4,8 +4,12 @@ markingCategory: Tail speciesRestriction: [LamiaSegment] sprites: - - sprite: Nyanotrasen/Mobs/Species/lamia.rsi - state: placeholder + - sprite: Nyanotrasen/Mobs/Customization/lamia_tails.rsi + state: body3tone1 + - sprite: Nyanotrasen/Mobs/Customization/lamia_tails.rsi + state: body3tone2 + - sprite: Nyanotrasen/Mobs/Customization/lamia_tails.rsi + state: body3tone3 - type: marking id: LamiaBottom-LamiaSegmentEnd @@ -13,5 +17,9 @@ markingCategory: Tail speciesRestriction: [LamiaSegment] sprites: - - sprite: Nyanotrasen/Mobs/Species/lamia.rsi - state: placeholder + - sprite: Nyanotrasen/Mobs/Customization/lamia_tails.rsi + state: body3tone1 + - sprite: Nyanotrasen/Mobs/Customization/lamia_tails.rsi + state: body3tone2 + - sprite: Nyanotrasen/Mobs/Customization/lamia_tails.rsi + state: body3tone3 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/body3tone1.png b/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/body3tone1.png new file mode 100644 index 0000000000000000000000000000000000000000..0a9c6f02cc6656475f0c242c84e3bd3a1b4fac76 GIT binary patch literal 625 zcmV-%0*?KOP)4Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmOVGd005OqL_t(o zNA1ut4gw(%1yJlDnU-*rwc5%Hc$xJKdKnL(2Uw3nXi14Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmOaH+x6y4h*!`M{1brwAP*c-;-h9 z5F+jEO6dY3mdsl(ViPdRM_tO*a*DAU=iH5MJPh$cBZpetR!#LY%z-hUAE1W9qLJna h5HyKzPyQze@dBI!rV*$>*oy!F002ovPDHLkV1o9TJ~RLT literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/body3tone3.png b/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/body3tone3.png new file mode 100644 index 0000000000000000000000000000000000000000..826c099ab85a872ccdfab67c7ebb2fea5134dddc GIT binary patch literal 648 zcmV;30(bq1P)4Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmOL_t(o zN9~Zo4Z<)CMWdb>q(d+SQWoIA5FLjFa$^Wa;G6?+yX!n4?g i|0`5H@{#KSQu+YA(0uP8fCR1p00004Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmOVGd007uYL_t(| zUhU954uU`shGDj%q=AyCJy+l;mfk>5p||i3Ce~ho17HmopdjmPoC1ve1<}O3PcqpZ znCyO84*&oF00000000000000000000008(8M%PYRmRa47k|fFCnR89e6a+yY$MHtn zmcg*r+GAOkdu<0rQMC926h$%V0m3jm8DkFGwv2gzl`Q9~s?z6|ZocoY<)XW`i*cDG zPp)k*$#j!tJ1du5m`Yviy0%^AW_0{3+4Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmOVGd00A#aL_t(| zUhUbzaf2`rKv75|Zh#g-3Df|0ZqPxlP=RMCf)Ypz^rLt+Xl6%a;mEOZl>B$u^fKCy>1Bx-!r6Pg{(28UCbyU0b~HYZ8yX1N3@+6uKsJ*kUX>*}vs=eyxe4?DY{k zb{Bmy*>`(;&wYM2e?7mCYsVf!E*84rLl^pny*`fa1ppG2WnVLKPdYMWB7gt@002ov JPDHLkV1mjcW(@!U literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/bottom3tone3.png b/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/bottom3tone3.png new file mode 100644 index 0000000000000000000000000000000000000000..b3f6dee64750bdd4305577e16ebec43be9b6e94f GIT binary patch literal 871 zcmV-t1DO1YP)4Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmOVGd00E0hL_t(| zUhUe^ZG$in24J91jL@epQRSuT0I)@s9Wq3B;T3pbk1WtJQmD@yk>lpTS1_%r|C6F~ zuSd?t<|Ro200000000000Pt7Ubv;Z`8dKEBI0hL4aA|a9S*C8>1+Q@ymqxc{*ImIU zz^v_!hqFTKw7RbQkQVLcsm>+?X&!+S$0eb4D(1#M^3akV0l#iD=8Z4r72?8|Y-(=T zZQ_SCC*XnOlF&MpEX%}2yZN?lRX0R)13oz}39VDf^StMwB|QRu-Db?uK947S(U~ua zN;(Z%niKHOaY<;MO5gV{(xTlw)!AeWW_OR{CX0?-`hS^49>%qPbKsJwOrK}kX?NG@ zMR{8Q0000000000000}Qs_OcAy!)xFP5hF3^Kj?6+As{SJQVGHGc^4|<}WfAKT&iW z`prWo5!1c-__=8vt4wc3+%fSR#wPW1|K4OSQX?|=zdfy;@&!#*{c+6ip;G_=002ovPDHLkV1h}dl_LNE literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/meta.json b/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/meta.json new file mode 100644 index 00000000000..5374b72d74e --- /dev/null +++ b/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/meta.json @@ -0,0 +1,41 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by Archer2150#2528 using assets from Rane. Fangs by discord user @Hyenh6078", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "bottom3tone1", + "directions": 4 + }, + { + "name": "bottom3tone2", + "directions": 4 + }, + { + "name": "bottom3tone3", + "directions": 4 + }, + { + "name": "body3tone1" + }, + { + "name": "body3tone2" + }, + { + "name": "body3tone3" + }, + { + "name": "tip3tone1" + }, + { + "name": "tip3tone2" + }, + { + "name": "tip3tone3" + } + ] +} diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/tip3tone1.png b/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/tip3tone1.png new file mode 100644 index 0000000000000000000000000000000000000000..b9c86c5b99195d2c00a454d13c1750b6276d0eff GIT binary patch literal 611 zcmV-p0-XJcP)4Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmOVGd004(cL_t(o zNA1qB4Z|Q11yD%snv#v!#I+mO8Nia61OfX{Qm3@!_(x!+NMQN3CS+IM x`wdx_LcP~ni$}@Jq?97YxFf4yJ^B+uyaBXSJZ4)qq96bO002ovPDHLkV1h-i6)6A! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/tip3tone2.png b/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/tip3tone2.png new file mode 100644 index 0000000000000000000000000000000000000000..7a37e083a7f34a3c3a721d2e342191811c0381cc GIT binary patch literal 551 zcmV+?0@(eDP)4Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmOVGd002u#L_t(o zNA1tO4FDksfKhZtMqvzg)?lbES15&d#rG1zPXR#y0002sYc2CJcOO|UW>(&H?0G!A p&35$6C8|0ivb`_9u6~Z65SbXM5{4Y!WwZbQ002ovPDHLkV1jV&^$!35 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/tip3tone3.png b/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/tip3tone3.png new file mode 100644 index 0000000000000000000000000000000000000000..9a9abed6ab4cb8cdbc4fe4432d89eb2647878dcd GIT binary patch literal 567 zcmV-70?7S|P)4Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmOVGd003J_L_t(o zNA1qB4uBvGgkjtusjrLAps#C_vLVDS#svoB@_)&tcUuDh00000e_Q+xQ`Kx{yU&M| z(k3E@&mq$flv1Rf^Ik7&j8VORr`9Shxy3xa_s1rMZ~>5(A>$F Date: Tue, 13 Feb 2024 21:04:59 -0500 Subject: [PATCH 29/73] I finally return to this after a hiatus to finish Harpies --- .../Nyanotrasen/Lamiae/LamiaSystem.cs | 22 ++++++++++++++----- .../Nyanotrasen/Lamiae/LamiaComponent.cs | 5 ++++- .../Lamiae/LamiaSegmentComponent.cs | 2 +- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index 7b6ec3c0071..35f8d202283 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -53,7 +53,7 @@ public override void Update(float frameTime) var revoluteJoint = _jointSystem.CreateWeldJoint(attachedUid, segmentUid, id: ("Segment" + segment.segment.SegmentNumber + segment.segment.Lamia)); revoluteJoint.CollideConnected = false; } - if (segment.segment.SegmentNumber < 32) + if (segment.segment.SegmentNumber < 18) Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0f, 0.15f)); else Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0, 0.1f)); @@ -72,11 +72,20 @@ public override void Initialize() SubscribeLocalEvent(OnJointRemoved); SubscribeLocalEvent(OnRemovedFromContainer); SubscribeLocalEvent(OnSegmentSpawned); + SubscribeLocalEvent(HandleDamageTransfer); SubscribeLocalEvent(HandleSegmentDamage); SubscribeLocalEvent(OnLamiaStorageInsertAttempt); SubscribeLocalEvent(OnSegmentStorageInsertAttempt); } + ///

+ /// Handles transfering marking selections to the tail segments. Every tail marking must be repeated 3 times in order for this script to work. + /// + /// + /// + /// + // TODO: Please for the love of god don't make me write a test to validate that every marking also has its matching segment states. + // Future contributors will just find out when their game crashes because they didn't make a marking-segment & marking-tip. private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, SegmentSpawnedEvent args) { component.Lamia = args.Lamia; @@ -136,10 +145,12 @@ private void OnRemovedFromContainer(EntityUid uid, LamiaComponent component, Ent private void HandleSegmentDamage(EntityUid uid, LamiaSegmentComponent component, DamageModifyEvent args) { - args.Damage.DamageDict["Radiation"] = Shared.FixedPoint.FixedPoint2.Zero; - _damageableSystem.TryChangeDamage(component.Lamia, args.Damage); - - args.Damage *= 0; + args.Damage = args.Damage / component.DamageModifyFactor / 5; + } + private void HandleDamageTransfer(EntityUid uid, LamiaSegmentComponent component, DamageChangedEvent args) + { + if (args.DamageDelta == null) return; + _damageableSystem.TryChangeDamage(component.Lamia, args.DamageDelta); } private void SpawnSegments(EntityUid uid, LamiaComponent component) @@ -158,6 +169,7 @@ private EntityUid AddSegment(EntityUid uid, EntityUid lamia, LamiaComponent lami { LamiaSegmentComponent segmentComponent = new(); segmentComponent.AttachedToUid = uid; + segmentComponent.DamageModifyFactor = lamiaComponent.NumberOfSegments; EntityUid segment; if (segmentNumber == 1) segment = EntityManager.SpawnEntity("LamiaInitialSegment", Transform(uid).Coordinates); diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs index 0d022e4cda5..5bbaefac91b 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs @@ -6,9 +6,12 @@ namespace Content.Shared.Nyanotrasen.Lamiae [RegisterComponent] public sealed partial class LamiaComponent : Component { + /// + /// A list of each UID attached to the Lamia, in order of spawn + /// public List Segments = new(); [DataField("numberOfSegments")] - public int NumberOfSegments = 32; + public int NumberOfSegments = 18; } } diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs index 5b81f0abb77..a40962a6d56 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs @@ -10,7 +10,7 @@ namespace Content.Shared.Nyanotrasen.Lamiae public sealed partial class LamiaSegmentComponent : Component { public EntityUid AttachedToUid = default!; - + public int DamageModifyFactor = default!; public bool SexChanged = false; public EntityUid Lamia = default!; public int SegmentNumber = default!; From f368ad9f69dc356de77b12190d1c6afa0b84d89a Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 14 Feb 2024 00:14:29 -0500 Subject: [PATCH 30/73] Hardsuit Sprite Transfer --- .../Nyanotrasen/Lamiae/ClientLamiaVisuals.cs | 30 ++++++++++++ .../Lamiae/LamiaSegmentVisualsComponent.cs | 5 ++ .../Nyanotrasen/Lamiae/LamiaSystem.cs | 45 +++++++++++++++--- .../Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs | 3 +- Resources/Prototypes/DeltaV/tags.yml | 2 + .../OuterClothing/base_clothingouter.yml | 1 + .../Objects/Specific/Species/lamia.yml | 12 ++++- .../lamia_inventory_template.yml | 3 ++ .../Hardsuits/basic.rsi/meta.json | 10 +++- .../Hardsuits/basic.rsi/segment.png | Bin 0 -> 591 bytes .../OuterClothing/Hardsuits/basic.rsi/tip.png | Bin 0 -> 572 bytes .../equipped-OUTERCLOTHING-LamiaSegment.png | Bin 921 -> 0 bytes .../Hardsuits/syndicate.rsi/meta.json | 10 +++- .../Hardsuits/syndicate.rsi/segment.png | Bin 0 -> 591 bytes .../Hardsuits/syndicate.rsi/tip.png | Bin 0 -> 572 bytes 15 files changed, 107 insertions(+), 14 deletions(-) create mode 100644 Content.Client/Nyanotrasen/Lamiae/ClientLamiaVisuals.cs create mode 100644 Content.Client/Nyanotrasen/Lamiae/LamiaSegmentVisualsComponent.cs create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/tip.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/equipped-OUTERCLOTHING-LamiaSegment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/tip.png diff --git a/Content.Client/Nyanotrasen/Lamiae/ClientLamiaVisuals.cs b/Content.Client/Nyanotrasen/Lamiae/ClientLamiaVisuals.cs new file mode 100644 index 00000000000..32d700ff813 --- /dev/null +++ b/Content.Client/Nyanotrasen/Lamiae/ClientLamiaVisuals.cs @@ -0,0 +1,30 @@ +using Robust.Client.GameObjects; +using Content.Shared.Nyanotrasen.Lamiae; + +namespace Content.Client.Nyanotrasen.Lamiae; + +public sealed class ClientLamiaVisualSystem : VisualizerSystem +{ + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAppearanceChange); + } + private void OnAppearanceChange(EntityUid uid, LamiaSegmentComponent component, ref AppearanceChangeEvent args) + { + if (args.Sprite == null) return; + + if (AppearanceSystem.TryGetData(uid, LamiaSegmentVisualLayers.Armor, out var worn) + && AppearanceSystem.TryGetData(uid, LamiaSegmentVisualLayers.ArmorRsi, out var path)) + { + var valid = !string.IsNullOrWhiteSpace(path); + if (valid) + { + args.Sprite.LayerSetRSI(LamiaSegmentVisualLayers.Armor, path); + } + args.Sprite.LayerSetVisible(LamiaSegmentVisualLayers.Armor, worn); + } + } +} diff --git a/Content.Client/Nyanotrasen/Lamiae/LamiaSegmentVisualsComponent.cs b/Content.Client/Nyanotrasen/Lamiae/LamiaSegmentVisualsComponent.cs new file mode 100644 index 00000000000..d9ae96881dc --- /dev/null +++ b/Content.Client/Nyanotrasen/Lamiae/LamiaSegmentVisualsComponent.cs @@ -0,0 +1,5 @@ +namespace Content.Client.Nyanotrasen.Lamiae; + +[RegisterComponent] +public sealed partial class LamiaSegmentVisualsComponent : Component +{} diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index 35f8d202283..257b97e23cb 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -1,30 +1,32 @@ using Robust.Shared.Physics; -using Robust.Shared.Utility; using Content.Shared.Damage; +using Content.Shared.Clothing.Components; using Content.Shared.Humanoid; using Content.Shared.Humanoid.Markings; -using Content.Shared.Humanoid.Prototypes; using Content.Server.Humanoid; +using Content.Shared.Inventory.Events; +using Content.Shared.Tag; using Content.Shared.Storage.Components; -using Robust.Server.GameObjects; using Robust.Shared.Prototypes; using Robust.Shared.Containers; using Robust.Shared.Map; using Robust.Shared.Physics.Systems; using Robust.Shared.Physics.Components; -using Robust.Shared.Maths; using System.Numerics; using Content.Shared.Nyanotrasen.Lamiae; namespace Content.Server.Nyanotrasen.Lamiae { - public partial class SharedLamiaSystem : EntitySystem + public sealed partial class LamiaSystem : EntitySystem { [Dependency] private readonly SharedJointSystem _jointSystem = default!; - [Dependency] private readonly IPrototypeManager _prototypes = default!; - [Dependency] private readonly MarkingManager _markingManager = default!; [Dependency] private readonly HumanoidAppearanceSystem _humanoid = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; + [Dependency] private readonly TagSystem _tagSystem = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + + [ValidatePrototypeId] + private const string LamiaHardsuitTag = "AllowLamiaHardsuit"; Queue<(LamiaSegmentComponent segment, EntityUid lamia)> _segments = new(); public override void Update(float frameTime) @@ -76,6 +78,8 @@ public override void Initialize() SubscribeLocalEvent(HandleSegmentDamage); SubscribeLocalEvent(OnLamiaStorageInsertAttempt); SubscribeLocalEvent(OnSegmentStorageInsertAttempt); + SubscribeLocalEvent(OnDidEquipEvent); + SubscribeLocalEvent(OnDidUnequipEvent); } /// @@ -195,5 +199,32 @@ private void OnSegmentStorageInsertAttempt(EntityUid uid, LamiaSegmentComponent { args.Cancelled = true; } + + private void OnDidEquipEvent(EntityUid equipee, LamiaComponent component, DidEquipEvent args) + { + if (!TryComp(args.Equipment, out var clothing)) return; + if (args.Slot == "outerClothing" && _tagSystem.HasTag(args.Equipment, LamiaHardsuitTag)) + { + foreach (var uid in component.Segments) + { + if (!TryComp(uid, out var appearance)) return; + _appearance.SetData(uid, LamiaSegmentVisualLayers.Armor, true, appearance); + if (clothing.RsiPath == null) return; + _appearance.SetData(uid, LamiaSegmentVisualLayers.ArmorRsi, clothing.RsiPath, appearance); + } + } + } + + private void OnDidUnequipEvent(EntityUid equipee, LamiaComponent component, DidUnequipEvent args) + { + if (args.Slot == "outerClothing" && _tagSystem.HasTag(args.Equipment, LamiaHardsuitTag)) + { + foreach (var uid in component.Segments) + { + if (!TryComp(uid, out var appearance)) return; + _appearance.SetData(uid, LamiaSegmentVisualLayers.Armor, false, appearance); + } + } + } } } diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs index b66c203d62c..4636cd031a0 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs @@ -5,7 +5,8 @@ namespace Content.Shared.Nyanotrasen.Lamiae [Serializable, NetSerializable] public enum LamiaSegmentVisualLayers { - Null, Tail, + Armor, + ArmorRsi, } } diff --git a/Resources/Prototypes/DeltaV/tags.yml b/Resources/Prototypes/DeltaV/tags.yml index 6a1efcfa695..cf4e1b646b0 100644 --- a/Resources/Prototypes/DeltaV/tags.yml +++ b/Resources/Prototypes/DeltaV/tags.yml @@ -1,4 +1,6 @@ ## This is for Nyano and Delta V tags +- type: Tag + id: AllowLamiaHardsuit - type: Tag id: BeltSlotNotBelt #not a 'belt' diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index 13524efa9e6..fb7a34e9ee6 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -93,6 +93,7 @@ - Hardsuit - WhitelistChameleon - HidesHarpyWings #DeltaV: Used by harpies to help render their hardsuit sprites + - AllowLamiaHardsuit - type: entity abstract: true diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml index 53fc8a46308..7edefa72eb2 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml @@ -2,6 +2,7 @@ id: LamiaInitialSegment noSpawn: true components: + - type: Appearance - type: Physics bodyType: KinematicController - type: Fixtures @@ -16,6 +17,7 @@ - MobMask - type: Transform anchored: false + - type: LamiaSegmentVisuals - type: Tag tags: - HideContextMenu @@ -31,12 +33,14 @@ sprite: Nyanotrasen/Mobs/Species/lamia.rsi layers: - map: [ "enum.HumanoidVisualLayers.Tail" ] + - map: [ "enum.LamiaSegmentVisualLayers.Armor" ] + sprite: Clothing/OuterClothing/Hardsuits/basic.rsi + state: segment + visible: false - type: Clickable - type: Tag tags: - DoorBumpOpener - - type: ExplosionResistance #This looks stupid but remember that bombs are likely to damage every segment, we want them to be decent but not instagib the poor lamia.s - damageCoefficient: 0.2 - type: HumanoidAppearance species: LamiaSegment @@ -51,6 +55,10 @@ sprite: Nyanotrasen/Mobs/Species/lamia.rsi layers: - map: [ "enum.HumanoidVisualLayers.Tail" ] + - map: [ "enum.LamiaSegmentVisualLayers.Armor" ] + sprite: Clothing/OuterClothing/Hardsuits/basic.rsi + state: segment + visible: false - type: LamiaSegment segmentId: tip - type: HumanoidAppearance diff --git a/Resources/Prototypes/Nyanotrasen/InventoryTemplates/lamia_inventory_template.yml b/Resources/Prototypes/Nyanotrasen/InventoryTemplates/lamia_inventory_template.yml index 223c592dac7..e227443c680 100644 --- a/Resources/Prototypes/Nyanotrasen/InventoryTemplates/lamia_inventory_template.yml +++ b/Resources/Prototypes/Nyanotrasen/InventoryTemplates/lamia_inventory_template.yml @@ -16,6 +16,9 @@ uiWindowPos: 1,2 strippingWindowPos: 1,2 displayName: Suit + whitelist: + tags: + - AllowLamiaHardsuit - name: gloves slotTexture: gloves slotFlags: GLOVES diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/meta.json index 88e5b353cb0..3ab0593f555 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/meta.json @@ -23,8 +23,14 @@ "directions": 4 }, { - "name": "inhand-right", - "directions": 4 + "name": "inhand-right", + "directions": 4 + }, + { + "name": "segment" + }, + { + "name": "tip" } ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/segment.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..b57f188445a4b4cb0fa98add87e09c407702d813 GIT binary patch literal 591 zcmV-V04Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmOVGd0047IL_t(o zNA1)x3cw%?1<;knoMC?NqDy#qi002ovPDHLkV1me&4WR%4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/tip.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/tip.png new file mode 100644 index 0000000000000000000000000000000000000000..aea8d36818c618598e2dcf0a910038e3c9861ce1 GIT binary patch literal 572 zcmV-C0>k}@P)4Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmOVGd003Y~L_t(o zNA1%w3V<*Sh2iL|_rG6G(N3|2CkQQKi{kQs5E>FlveW^3m-pA@9rCnv<(9BiuZ#ZE1fSl5Yu|EqI3j0000< KMNUMnLSTZ}k_1x# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/equipped-OUTERCLOTHING-LamiaSegment.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/equipped-OUTERCLOTHING-LamiaSegment.png deleted file mode 100644 index 475a45bf9d9ea540225379c0e5d4d62507063db3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 921 zcmV;K17`e*P)4Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmOVGd00F&8L_t(o zN9~hcD+Ey($NvnIm(jAC3CkqOOExaV4RNm&Nx3HZ25wx)g|DEb_D+f9!Y5d9LkbaU zlZN#&leLpwv>9Wc(@eQg&Rn>1e)V+z^ZcLYJm)zx5C{YUfj}S-{Cf(#m77UPay|JY zF~1C}QC9=%)doG6=^PK6;WHwL}+=Yf=D2L+{FPc`1uyu;TCKcwQ z$vkaNL;T7@N{zxa@6o-nR-x;9hMB*>-N1ZnhkKK_z<8t#v4SvcwFZ^m1k(8lgscZl zx+!cVU(wLqhK0*Bu6GxD>#xw}Q$r(IZjK`PF5{@B80)K#EJ#z1JgT8uUbq_|XuLCt zQ`DD!py|ZM=tMOO(v%~QYJw1`fupp|PI>!QgsaXFw$`3lkft1YR1*a5Z-D*)y4&8j z8x-La+l685DV5CY%cL>4Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmOVGd0047IL_t(o zNA1)x3cw%?1<;knoMC?NqDy#qi002ovPDHLkV1me&4WR%4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/tip.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/tip.png new file mode 100644 index 0000000000000000000000000000000000000000..aea8d36818c618598e2dcf0a910038e3c9861ce1 GIT binary patch literal 572 zcmV-C0>k}@P)4Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmOVGd003Y~L_t(o zNA1%w3V<*Sh2iL|_rG6G(N3|2CkQQKi{kQs5E>FlveW^3m-pA@9rCnv<(9BiuZ#ZE1fSl5Yu|EqI3j0000< KMNUMnLSTZ}k_1x# literal 0 HcmV?d00001 From 45505f6c174d0757cef7bf2808b276d7bbbfa1b8 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 14 Feb 2024 00:22:53 -0500 Subject: [PATCH 31/73] prevent snakes from wearing pants --- Content.Shared/Roles/StartingGearPrototype.cs | 3 ++- .../InventoryTemplates/lamia_inventory_template.yml | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Roles/StartingGearPrototype.cs b/Content.Shared/Roles/StartingGearPrototype.cs index 1e7881113fe..322d42fe5b4 100644 --- a/Content.Shared/Roles/StartingGearPrototype.cs +++ b/Content.Shared/Roles/StartingGearPrototype.cs @@ -34,7 +34,8 @@ public string GetGear(string slot, HumanoidCharacterProfile? profile) if (profile != null) { if (slot == "jumpsuit" && profile.Clothing == ClothingPreference.Jumpskirt && !string.IsNullOrEmpty(InnerClothingSkirt) - || slot == "jumpsuit" && profile.Species == "Harpy" && !string.IsNullOrEmpty(InnerClothingSkirt)) //DeltaV adds this line to prevent Harpies from starting with jumpsuits + || slot == "jumpsuit" && profile.Species == "Harpy" && !string.IsNullOrEmpty(InnerClothingSkirt) + || slot == "jumpsuit" && profile.Species == "Lamia" && !string.IsNullOrEmpty(InnerClothingSkirt)) //DeltaV adds checks for Harpy & Lamia to prevent wearing jumpsuits return InnerClothingSkirt; if (slot == "back" && profile.Backpack == BackpackPreference.Satchel && !string.IsNullOrEmpty(Satchel)) return Satchel; diff --git a/Resources/Prototypes/Nyanotrasen/InventoryTemplates/lamia_inventory_template.yml b/Resources/Prototypes/Nyanotrasen/InventoryTemplates/lamia_inventory_template.yml index e227443c680..ce477b46f43 100644 --- a/Resources/Prototypes/Nyanotrasen/InventoryTemplates/lamia_inventory_template.yml +++ b/Resources/Prototypes/Nyanotrasen/InventoryTemplates/lamia_inventory_template.yml @@ -8,6 +8,9 @@ uiWindowPos: 0,2 strippingWindowPos: 0,2 displayName: Jumpsuit + whitelist: + tags: + - Skirt - name: outerClothing slotTexture: suit slotFlags: OUTERCLOTHING From b0b5ef715b68634e33f7f0eeb6ef01f024c650bf Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 14 Feb 2024 00:25:13 -0500 Subject: [PATCH 32/73] Masking helpers are no longer needed, 1984 anytaur mask --- .../Nyanotrasen/Entities/Mobs/Species/lamia.yml | 5 ----- .../lamia_masking_helpers.rsi/female_full.png | Bin 673 -> 0 bytes .../lamia_masking_helpers.rsi/female_none.png | Bin 632 -> 0 bytes .../lamia_masking_helpers.rsi/female_top.png | Bin 673 -> 0 bytes .../lamia_masking_helpers.rsi/meta.json | 1 - .../lamia_masking_helpers.rsi/none.png | Bin 4982 -> 0 bytes 6 files changed, 6 deletions(-) delete mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/female_full.png delete mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/female_none.png delete mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/female_top.png delete mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/meta.json delete mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/none.png diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml index 94e7c4a4d1c..13c43ba2507 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml @@ -78,11 +78,6 @@ color: "#e8b59b" sprite: Mobs/Species/Human/parts.rsi state: l_arm - - shader: StencilMask - map: [ "enum.HumanoidVisualLayers.StencilMask" ] - sprite: Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi - state: female_full - visible: false - map: [ "jumpsuit" ] shader: StencilDraw - map: [ "enum.HumanoidVisualLayers.LHand" ] diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/female_full.png b/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/female_full.png deleted file mode 100644 index fe08c5697b8dbc178c24240d06768805be6f02cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU~I{Bb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZrAngg)*TutEA*lSL<_HIi7a$lAsSU`u=5M|EE5$?y}qXGg9rPM zu4?YyypC^Olfnw$I>~;MCVh~N|IYE@tKPBAf6o84thzGiXhVaC&1s&?YWEc8-P^)@ z?)MSFuqmOBiXRzH*7NvtqV(uv^K-1zS?5U_US3)Gh+|_!M)K0$$ctAxmUk>(wJdnw zgpUzV_Z*GX4v+ji?@#N)Ir}!9DV^2qks#wA+~ue{-(y0ckoIM*eSPn8e;_UzN-{&JV;ZgyP$+1fdF z44JRADw$TT$X?><>&pI&T~>%!rEBV&_dp@Z64!_l=ltB<)VvY~=c3fa zlGGH1^30M91$R&1fbd2>aiF3~PZ!6Kid%1QIr23q@Gv-j`CqSRe?fp%d+yGvh8z*0 z4W>Xv4cvl){`3CV*4(%-u{L(5+=5?+3d8=hun0IXFoFr7l4?o*Ap7~3PjN1>JsD?c z_`N=$y1b&AN8M@n+5=^r$9~u^_$95-z`(=-CIZ6PyDm7tnxVDjDA0TcPgg&ebxsLQ E0NM-^IRF3v diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/female_none.png b/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/female_none.png deleted file mode 100644 index 895e0b5a132f96c00be90cae95641ba50a0a2a8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 632 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU~I{Bb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZrAngg)*TutEA*lSL<_HIi7a$lAsSU`u=5M|EE5$?y}qXGg9rPM zu4?YyypC^Olfnw$I>~;MCVh~N|IYE@tKPBAf6o84thzGiXhVaC&1s&?YWEc8-P^)@ z?)MSFuqmOBiXRzH*7NvtqV(uv^K-1zS?5U_US3)Gh+|_!M)K0$$ctAxmUk>(wJdnw zgpUzV_Z*GX4v+ji?@#N)Ir}!9DV^2qks#wA+~ue{-(y0ckoIM*eSPn8e;_UzN-{&JV;ZgyP$+1fdF z44JRADw$TT$X?><>&pI&T~mdK II;Vst0E=Mz#{d8T diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/female_top.png b/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi/female_top.png deleted file mode 100644 index 71bc96fe209d8cc815f51ac3fc889217ee0c67bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 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 S2+nN~Bng`xS~_#_s{aAL;cf>2 From 360c745e0d50aafc343c1b739279550585c50d22 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 14 Feb 2024 00:33:43 -0500 Subject: [PATCH 33/73] Lamia can no longer hurt themselves --- Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs | 9 +++++++++ .../Entities/Objects/Specific/Species/lamia.yml | 1 + 2 files changed, 10 insertions(+) diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index 257b97e23cb..55f28d3e03d 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -80,6 +80,7 @@ public override void Initialize() SubscribeLocalEvent(OnSegmentStorageInsertAttempt); SubscribeLocalEvent(OnDidEquipEvent); SubscribeLocalEvent(OnDidUnequipEvent); + SubscribeLocalEvent(OnHitSelf); } /// @@ -157,6 +158,14 @@ private void HandleDamageTransfer(EntityUid uid, LamiaSegmentComponent component _damageableSystem.TryChangeDamage(component.Lamia, args.DamageDelta); } + private void OnHitSelf(EntityUid uid, LamiaSegmentComponent component, ref BeforeDamageChangedEvent args) + { + if (args.Origin == component.Lamia) + { + args.Cancelled = true; + } + } + private void SpawnSegments(EntityUid uid, LamiaComponent component) { int i = 1; diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml index 7edefa72eb2..59502dd471d 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml @@ -2,6 +2,7 @@ id: LamiaInitialSegment noSpawn: true components: + - type: Damageable - type: Appearance - type: Physics bodyType: KinematicController From 2198c3174cb80ac9474069208824e2e2d3143a0f Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 14 Feb 2024 00:52:36 -0500 Subject: [PATCH 34/73] Lamia can now shoot over tail --- Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index 55f28d3e03d..0fd1fd35c5c 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -6,6 +6,7 @@ using Content.Server.Humanoid; using Content.Shared.Inventory.Events; using Content.Shared.Tag; +using Content.Shared.Standing; using Content.Shared.Storage.Components; using Robust.Shared.Prototypes; using Robust.Shared.Containers; @@ -24,6 +25,7 @@ public sealed partial class LamiaSystem : EntitySystem [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly TagSystem _tagSystem = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly StandingStateSystem _standing = default!; [ValidatePrototypeId] private const string LamiaHardsuitTag = "AllowLamiaHardsuit"; @@ -81,6 +83,7 @@ public override void Initialize() SubscribeLocalEvent(OnDidEquipEvent); SubscribeLocalEvent(OnDidUnequipEvent); SubscribeLocalEvent(OnHitSelf); + SubscribeLocalEvent(TailCantStand); } /// @@ -94,6 +97,7 @@ public override void Initialize() private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, SegmentSpawnedEvent args) { component.Lamia = args.Lamia; + _standing.Down(uid); if (!TryComp(uid, out var species)) return; if (!TryComp(args.Lamia, out var humanoid)) return; @@ -166,6 +170,11 @@ private void OnHitSelf(EntityUid uid, LamiaSegmentComponent component, ref Befor } } + private void TailCantStand(EntityUid uid, LamiaSegmentComponent component, StandAttemptEvent args) + { + args.Cancelled = true; + } + private void SpawnSegments(EntityUid uid, LamiaComponent component) { int i = 1; From ce8efc6f09558e19abcf213aa9aaf618d25977f8 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 14 Feb 2024 01:13:13 -0500 Subject: [PATCH 35/73] Update LamiaSystem.cs --- Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index 0fd1fd35c5c..219f3b21c60 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -172,7 +172,7 @@ private void OnHitSelf(EntityUid uid, LamiaSegmentComponent component, ref Befor private void TailCantStand(EntityUid uid, LamiaSegmentComponent component, StandAttemptEvent args) { - args.Cancelled = true; + args.Cancel(); } private void SpawnSegments(EntityUid uid, LamiaComponent component) From 32499ecbc2dd72aae84cfab8978cd36804cc85e7 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 14 Feb 2024 01:36:10 -0500 Subject: [PATCH 36/73] Update lamia.yml --- .../Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml index 59502dd471d..37c3e1eb708 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml @@ -3,7 +3,11 @@ noSpawn: true components: - type: Damageable + - type: StandingState - type: Appearance + - type: Clickable + - type: InteractionOutline + - type: PsionicInsulation #Not a brain, target the lamia instead - type: Physics bodyType: KinematicController - type: Fixtures @@ -16,6 +20,8 @@ restitution: 0.0 mask: - MobMask + layer: + - MobLayer - type: Transform anchored: false - type: LamiaSegmentVisuals From c8b33fbd06b6f80894a2fc691989e6d1fe00850c Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 14 Feb 2024 03:05:31 -0500 Subject: [PATCH 37/73] Yee --- .../Nyanotrasen/Entities/Mobs/Player/lamia.yml | 2 +- .../Nyanotrasen/Entities/Mobs/Species/lamia.yml | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/lamia.yml index 031ae52ddc1..41a8f746b1e 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/lamia.yml @@ -1,6 +1,6 @@ - type: entity save: false - name: Lamia + name: Urist McNoodle parent: MobLamiaBase id: MobLamia description: A miserable pile of scales. diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml index 13c43ba2507..53bb4352050 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml @@ -97,9 +97,6 @@ - map: [ "gloves" ] - map: [ "ears" ] - map: [ "enum.HumanoidVisualLayers.Tail" ] - sprite: Mobs/Customization/masking_helpers.rsi - state: none - visible: false - map: [ "outerClothing" ] - map: [ "eyes" ] - map: [ "belt" ] @@ -114,11 +111,6 @@ - map: [ "pocket1" ] - map: [ "pocket2" ] - map: [ "enum.HumanoidVisualLayers.HeadTop" ] - sprite: Mobs/Customization/masking_helpers.rsi - state: none - visible: false - - sprite: Nyanotrasen/Mobs/Species/lamia.rsi - state: underscales - type: Body template: LamiaTemplate preset: LamiaPreset @@ -128,6 +120,7 @@ - type: NoSlip - type: Internals - type: MobState + - type: MobThresholds thresholds: 0: Alive 200: Critical #these values aren't final' @@ -223,6 +216,14 @@ - type: FootstepModifier footstepSoundCollection: collection: FootstepLamia + - type: Bloodstream + bloodMaxVolume: 60000 + bloodlossDamage: + types: + Bloodloss: 1 + bloodlossHealDamage: + types: + Bloodloss: -1 - type: entity save: false From c97e0001ee452be92e8380006c8917e00d16f222 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 16 Feb 2024 18:13:05 -0500 Subject: [PATCH 38/73] New working version --- .../Nyanotrasen/Lamiae/LamiaSystem.cs | 9 ++- .../Nyanotrasen/Lamiae/LamiaComponent.cs | 2 +- .../Lamiae/LamiaSegmentComponent.cs | 1 + .../Entities/Mobs/Species/lamia.yml | 16 +---- .../Objects/Specific/Species/lamia.yml | 1 + .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 924 bytes .../Hardsuits/atmospherics.rsi/meta.json | 21 ++++-- .../Hardsuits/atmospherics.rsi/segment.png | Bin 0 -> 482 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 2095 bytes .../Hardsuits/basic.rsi/meta.json | 67 +++++++++--------- .../Hardsuits/basic.rsi/segment.png | Bin 591 -> 396 bytes .../OuterClothing/Hardsuits/basic.rsi/tip.png | Bin 572 -> 0 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 968 bytes .../Hardsuits/capspace.rsi/meta.json | 21 ++++-- .../Hardsuits/capspace.rsi/segment.png | Bin 0 -> 467 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1116 bytes .../Hardsuits/cybersun.rsi/meta.json | 21 ++++-- .../Hardsuits/cybersun.rsi/segment.png | Bin 0 -> 479 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1991 bytes .../Hardsuits/engineering-white.rsi/meta.json | 21 ++++-- .../engineering-white.rsi/segment.png | Bin 0 -> 476 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1908 bytes .../Hardsuits/engineering.rsi/meta.json | 21 ++++-- .../Hardsuits/engineering.rsi/segment.png | Bin 0 -> 457 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 3521 bytes .../Hardsuits/luxury.rsi/meta.json | 21 ++++-- .../Hardsuits/luxury.rsi/segment.png | Bin 0 -> 537 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1668 bytes .../Hardsuits/medical.rsi/meta.json | 21 ++++-- .../Hardsuits/medical.rsi/segment.png | Bin 0 -> 452 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 2249 bytes .../Hardsuits/paramed.rsi/meta.json | 21 ++++-- .../Hardsuits/paramed.rsi/segment.png | Bin 0 -> 442 bytes .../rd.rsi/equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1025 bytes .../OuterClothing/Hardsuits/rd.rsi/meta.json | 53 ++++++++------ .../Hardsuits/rd.rsi/segment.png | Bin 0 -> 446 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 2000 bytes .../Hardsuits/salvage.rsi/meta.json | 21 ++++-- .../Hardsuits/salvage.rsi/segment.png | Bin 0 -> 460 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1039 bytes .../Hardsuits/syndicate.rsi/meta.json | 19 ++--- .../Hardsuits/syndicate.rsi/segment.png | Bin 591 -> 947 bytes .../Hardsuits/syndicate.rsi/tip.png | Bin 572 -> 0 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1037 bytes .../Hardsuits/syndiecommander.rsi/meta.json | 21 ++++-- .../Hardsuits/syndiecommander.rsi/segment.png | Bin 0 -> 947 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 934 bytes .../Hardsuits/syndieelite.rsi/meta.json | 55 +++++++------- .../Hardsuits/syndieelite.rsi/segment.png | Bin 0 -> 420 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1157 bytes .../Hardsuits/syndiemedic.rsi/meta.json | 9 ++- .../Hardsuits/syndiemedic.rsi/segment.png | Bin 0 -> 576 bytes 52 files changed, 261 insertions(+), 181 deletions(-) create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/atmospherics.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/atmospherics.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/equipped-OUTERCLOTHING-lamia.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/tip.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/cybersun.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/cybersun.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/luxury.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/luxury.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/medical.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/medical.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/paramed.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/paramed.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/salvage.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/salvage.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/equipped-OUTERCLOTHING-lamia.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/tip.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/syndieelite.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/syndieelite.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiemedic.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiemedic.rsi/segment.png diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index 219f3b21c60..467d2f2eaca 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -57,7 +57,7 @@ public override void Update(float frameTime) var revoluteJoint = _jointSystem.CreateWeldJoint(attachedUid, segmentUid, id: ("Segment" + segment.segment.SegmentNumber + segment.segment.Lamia)); revoluteJoint.CollideConnected = false; } - if (segment.segment.SegmentNumber < 18) + if (segment.segment.SegmentNumber < segment.segment.MaxSegments) Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0f, 0.15f)); else Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0, 0.1f)); @@ -87,13 +87,13 @@ public override void Initialize() } /// - /// Handles transfering marking selections to the tail segments. Every tail marking must be repeated 3 times in order for this script to work. + /// Handles transfering marking selections to the tail segments. Every tail marking must be repeated 2 times in order for this script to work. /// /// /// /// // TODO: Please for the love of god don't make me write a test to validate that every marking also has its matching segment states. - // Future contributors will just find out when their game crashes because they didn't make a marking-segment & marking-tip. + // Future contributors will just find out when their game crashes because they didn't make a marking-segment. private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, SegmentSpawnedEvent args) { component.Lamia = args.Lamia; @@ -191,12 +191,11 @@ private EntityUid AddSegment(EntityUid uid, EntityUid lamia, LamiaComponent lami { LamiaSegmentComponent segmentComponent = new(); segmentComponent.AttachedToUid = uid; + segmentComponent.MaxSegments = lamiaComponent.NumberOfSegments; segmentComponent.DamageModifyFactor = lamiaComponent.NumberOfSegments; EntityUid segment; if (segmentNumber == 1) segment = EntityManager.SpawnEntity("LamiaInitialSegment", Transform(uid).Coordinates); - else if (segmentNumber == lamiaComponent.NumberOfSegments) - segment = EntityManager.SpawnEntity("LamiaSegmentEnd", Transform(uid).Coordinates); else segment = EntityManager.SpawnEntity("LamiaSegment", Transform(uid).Coordinates); diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs index 5bbaefac91b..2ef372c10de 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs @@ -12,6 +12,6 @@ public sealed partial class LamiaComponent : Component public List Segments = new(); [DataField("numberOfSegments")] - public int NumberOfSegments = 18; + public int NumberOfSegments = 30; } } diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs index a40962a6d56..7605f9039ca 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs @@ -14,6 +14,7 @@ public sealed partial class LamiaSegmentComponent : Component public bool SexChanged = false; public EntityUid Lamia = default!; public int SegmentNumber = default!; + public int MaxSegments = default!; [DataField("segmentId")] public string? segmentId; } diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml index 53bb4352050..5fcd28e2d07 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml @@ -78,8 +78,8 @@ color: "#e8b59b" sprite: Mobs/Species/Human/parts.rsi state: l_arm + - map: [ "enum.HumanoidVisualLayers.Tail" ] - map: [ "jumpsuit" ] - shader: StencilDraw - map: [ "enum.HumanoidVisualLayers.LHand" ] color: "#e8b59b" sprite: Mobs/Species/Human/parts.rsi @@ -96,7 +96,6 @@ - map: [ "id" ] - map: [ "gloves" ] - map: [ "ears" ] - - map: [ "enum.HumanoidVisualLayers.Tail" ] - map: [ "outerClothing" ] - map: [ "eyes" ] - map: [ "belt" ] @@ -258,11 +257,6 @@ color: "#e8b59b" sprite: Mobs/Species/Human/parts.rsi state: l_arm - - shader: StencilMask - map: [ "enum.HumanoidVisualLayers.StencilMask" ] - sprite: Nyanotrasen/Mobs/Customization/lamia_masking_helpers.rsi - state: female_full - visible: false - map: [ "jumpsuit" ] shader: StencilDraw - map: [ "enum.HumanoidVisualLayers.LHand" ] @@ -294,14 +288,6 @@ - map: [ "pocket1" ] - map: [ "pocket2" ] - map: [ "enum.HumanoidVisualLayers.HeadTop" ] - sprite: Mobs/Customization/masking_helpers.rsi - state: none - visible: false - map: [ "enum.HumanoidVisualLayers.Tail" ] - sprite: Mobs/Customization/masking_helpers.rsi - state: none - visible: false - - sprite: Nyanotrasen/Mobs/Species/lamia.rsi - state: underscales - type: Inventory templateId: lamia diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml index 37c3e1eb708..7af53abc7bf 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml @@ -38,6 +38,7 @@ components: - type: Sprite sprite: Nyanotrasen/Mobs/Species/lamia.rsi + drawdepth: SmallMobs layers: - map: [ "enum.HumanoidVisualLayers.Tail" ] - map: [ "enum.LamiaSegmentVisualLayers.Armor" ] diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/atmospherics.rsi/equipped-OUTERCLOTHING-lamia.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/atmospherics.rsi/equipped-OUTERCLOTHING-lamia.png new file mode 100644 index 0000000000000000000000000000000000000000..f9c943fe7b1ba6ff255865abc99b16cffa8739b6 GIT binary patch literal 924 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 Ze*tm1Ghqf)!mj`T002ovPDHLkV1kXR3R?gG literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/meta.json index 3ab0593f555..f7d387421d1 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/meta.json @@ -1,36 +1,37 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a. Further modifications and derivate works (inhand-left and inhand-right) under same license, derivative monkey made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a. Further modifications and derivate works (inhand-left and inhand-right) under same license, derivative monkey made by brainfood1183 (github) for ss14, lamia & segment by @noctyrnal", + "size": { + "x": 32, + "y": 32 }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-OUTERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - }, - { - "name": "segment" - }, - { - "name": "tip" - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-monkey", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-lamia", + "directions": 4 + }, + { + "name": "segment" + } + ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/segment.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/segment.png index b57f188445a4b4cb0fa98add87e09c407702d813..91747f2ee639ffafa7f0bf9dbf7048db0935647b 100644 GIT binary patch delta 370 zcmV-&0ge981dIcaBYyx1a7bBm000XU000XU0RWnu7ytkPK1oDDR9J=WmN9OFFcgNr zRNWm<>1N4e4&jZZ$LPYA6XY5UEImdS7Q_&70=%(gNhZSy=+HU}Emds^DU096`_2Ep zXZ(;i(=_qOczS5{1dsp{Kmter2_OL^fCKVOKG0xlhzvN z98$`e=5u}DM?nOCg7f*jlTzZGLu>s@_nMTF2#Xqx7+RFbgTwo zt;Jf)IF2Z#0Bab>5da|s0Bzf1t&IW*J_A)%z1$b`#g{<*+EoFvEW6fqeE=AS0i_f| z2!s$Qr5J_*fV!>^S(aTxeWU(_#u%EW*#YmynAdx)X_^n<%@}k2eh%{d1PAPi1LL8m QkN^Mx07*qoM6N<$f~3o*l>h($ delta 567 zcmV-70?7T01J4AIBYy#cX+uL$Nkc;*P;zf(X>4Tx04UFukxeK>Q5?m828~3DSx6Rd zffXerONN>hH4SP83-7%#V`|=;>AjJSrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q` zYLr{I`|I3$PWPS*frG4RxpnWNE@v*(0{C(ZhkBpoucaaxTQv| zH+?FL|BdG4vTH((COm59or3U^@bFq8uXsl|WUlB*;ZxyWM=mIQuXLltFN)JX2UKRr znT?GLhlI6s1sfG?t~i$PkZ@PhvL!zdFL6@wx?(H4YX00)y|8K7o|{p+%uXUqGEEc> zgHD0CP!1K~z{r?bI;}z#t3-(6n=VrQZJ>p27~2Ht^lr z`ZGwE{~#DJXcW{$L_|bHvPvnNoB3139Li`5MoMgg^wYg4z3z%}D08|@E!`=5`i{K? z`UYlE12AfUZs4qSNBW=E+7Zuj6eyp=-Cw`rm_r%K>;knoMC?NqDy#qi002ovPDHLk FV1h}w3|s&J diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/tip.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/tip.png deleted file mode 100644 index aea8d36818c618598e2dcf0a910038e3c9861ce1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572 zcmV-C0>k}@P)4Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmOVGd003Y~L_t(o zNA1%w3V<*Sh2iL|_rG6G(N3|2CkQQKi{kQs5E>FlveW^3m-pA@9rCnv<(9BiuZ#ZE1fSl5Yu|EqI3j0000< KMNUMnLSTZ}k_1x# diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi/equipped-OUTERCLOTHING-lamia.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi/equipped-OUTERCLOTHING-lamia.png new file mode 100644 index 0000000000000000000000000000000000000000..9e1327db341ef0341ac89277f70096cdc401f6a7 GIT binary patch literal 968 zcmV;(12_DMP)Px#1ZP1_K>z@;j|==^1poj5KTu3mMHVzhI%k0`OkUHSHXR)u10pmW8yo-5Tc&s) zb4(!)4h|ze6$~{8ELLuCVFOV{0vHq)$32;bRa{vGi!vFvd!vV){sAK>D0`W;iK~z{r z?N)1(;vf*@v8W5itZV-NZ@unuAVWa!s_v^@r3u|L9Ucjc+x`h*}Z zzTZ0^B3mv7KXZWYzL5OoI=$UOPbnfGrZjU9-JMP+*Xz4Mg1-MLyF*xy2l!rZcOkjt ziF3qVP<97(=P&UB1FKg9F%D-K#EU#i`HDo{`FM`co1}a*xWwM3J_9R96tdaz~WA|T{#+Jh};OoDg0)7u;XIbEa& znGNMD*zufX5^*)l&dkkc|uqUc-(%weZDgTQCV3erCe1`8HBAjom1(=r&a zkDl)s@^L-pL&xYiJ}#7>y@?xCc7l)hUO5X%tOm*f)&MJTyWOx7FARbXp?g4QkO~Y6 zrfO;s9487tbWu6L7(iWNuyPE_b-)18M}BL2k~Kg;5d(BVnI5SWnIl}3Ax!KuUmTR_ zQC8Jg`<~k#{5S{Q;i^oJxo!>I@m2q1|eW1hu5m{fD2y2k;;a84$B?eGSzu|5l zVGZs91_1}G5(7{>1Q@_U3E&>MKUYEtqBBT-$r-Q8D+7)o zFF3rFAglpu15^)hdw?p&v54AX?(vdw74fgc0G1!DR}rU-HDH0Ib)GTl9?A{C5F{Jvr97ToHCSWYLm#bAGS1U+yE!ZOm82|9*n|)Sl8G22wGQ(+CMlG qjq!ET6dGfmt5*SpzvLfdw(Soqb^mz&hw%Xb0000Xq=P) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi/meta.json index 7f50fdcf083..56b23c00af0 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi/meta.json @@ -1,11 +1,11 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Made by Emisse for SS14", - "size": { - "x": 32, - "y": 32 - }, + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by Emisse for SS14, lamia & segment by @noctyrnal", + "size": { + "x": 32, + "y": 32 + }, "states": [ { "name": "icon" @@ -25,6 +25,13 @@ { "name": "equipped-OUTERCLOTHING-harpy", "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-lamia", + "directions": 4 + }, + { + "name": "segment" } ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi/segment.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..f2a4dbb38287bea806df67c8a87d228928fbd14c GIT binary patch literal 467 zcmV;^0WAKBP)R{#n?0Vn_kpa2wr0#E?Jwrt?h`Q_r{@nh%{1_6`l6adRKu^oq<-GlTiTKno^ zJpikc?-lw0ybZo%QxGwrtp#9}%KBsmK=I!mnE;aN6BT#o1-{HK$=T8NFc}r5?)qO78%G?Ntf8EgQJDz3NH&EbO-Kfiv5yhVy4B&o9rVnJj+fyTSkf002ov JPDHLkV1n01$@l;O literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/cybersun.rsi/equipped-OUTERCLOTHING-lamia.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/cybersun.rsi/equipped-OUTERCLOTHING-lamia.png new file mode 100644 index 0000000000000000000000000000000000000000..5da5227444ec420eb05257fd9e3d00fc57b1f1e2 GIT binary patch literal 1116 zcmV-i1f%Px#1ZP1_K>z@;j|==^1poj5U{Fj{MKUrnCMG5n6cjc#HXR)u0RI5B9u5G2Kme9Y zC@3h`I42$+9zQ=n0Aeu!$72r<4*;uG0DeDiAtiq|IzmE1LqkJI0s>+K1AiwgT^t{6 zAte9+0B{u-H8nLmJ39aX046j9M*si-AaqhrQ~&?}|NsC0|NsC0|NsC0|NsC0|NsC0 z|NsC0|NsC009;%f?EnA(32;bRa{vG}(*OW9(*X=2Lw5iG16fH#K~z{r?UwC&;vf)( z$rw>27L74rHO>9sJi_fFA=yv7GQTfGB85NQdL+ zg8#0B`LraYBep~i;OFm_gmmCN;j?(W6r6HjB8$gC2|&_;ilV^pBS+>sQmM)kZ;~AG ziU4^!XvD@#2GN*(v0We?c3YSpn^W}2oXw>y`F31I?g^7HFk z?Fpng8b$hSs6+)N8L8tkjR4&UD)Id{yh{?zl0bK%TM$ajZ?(8jgb6?ZsQM;uHC9Pj z$MI3t3VN7OfqB5U93KJpB&o+D)p#k>TeqJRtizPgXQ<%$37i`V5g@J63KyWXvCHf?6hw3O?>2Ewg|ZwgLcoLdF&#_yElP2zVuc*9Ktl2SDOa0Nfn77qANw8SD9@ z55U}y06bzctTHmv2Yyt>j{u;lYnrA*#(ER7egt$xUxSD`j-|@@5zu@5pso2iKLPX| zf5Z0tjGqFK;>Dl0wBgSIf1zK%9FXnGOQnhb6@a$8I)JQ%=3k`kdj=ph@NWnrB=Nv2 z$=|E+w7x4M98rkWp2tvSBG8;((&A+t=X>%1gywE*W4uHl%lt>}IK$f%V1Gw=4y6DP{ zyFQC67e0U+!6)b@^a&KiQp8K4wA#VINa47UlvXR9ir{7r90<&xf4+0h3?!b2@Sm~t zue&<{2jBo4fCF#<4!{980Km5u)_s5KKke0+gc;7Fzoku z?e`V}us#E`jPpFV*8UW>9q@(|)!#ineG}Y0K8?FD`~;Xge*n+sPE9PKX4{?7Jz z^I9HEY0krU01C~;!<*GDumS)mm&;Ndwptz#$1$Z+2>`7%?RI+%am*Tk*XeZT`dXiX zD2k}HKWCmK2>`|z0D>SONfK%|Hvq(OWNT~R0b@+0lzJ|z{wcK9G@H#WrBt`oYR&bv zzJ^MvZkA;yT5F6kGgE6#mSrbOsjjUrB4V9snj#{Rh+L&{g V_@tr*5fA_X002ovPDHLkV1i!G%?tnl literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi/equipped-OUTERCLOTHING-lamia.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi/equipped-OUTERCLOTHING-lamia.png new file mode 100644 index 0000000000000000000000000000000000000000..cc30d8c7d20cc4e581be8dfcce0b3237a79544fe GIT binary patch literal 1991 zcmV;&2RQhNP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2V6-+K~#8N?V4+d zRaF$n&%J&KADBJVY0w-Wg<+r=6WDwx>_Z}b5C+Lg(+YbyqGIxBFXj)^X4A-h1}BbI&ch_YaqS_CEXW|5|IW z{W@#ME^cmhiWzY?En1We;HE{3k^$VbXi+kNn-(of25{4&h4oJGz-_ydq}x9J%xP>q z=p0$p6q6SzjN3RmSy?&3nf2(ylCL^b?Y+wv{QQ38%5UWXkWYB1+8H$Lb|I-8J5rR^ zA9>1oPdybjUoiPm9zI~El;^^4WdIs(Z9VRc99=2--`g)a^_$iRF)4Y#d+Jd?pGe1V zD&G_SKm*MF>dEBUlfTOIiKa$L!E2kh2r;Qb-&3FeNv4O$#1HqW-QRo4gIxHnJb-cc z%h99Kusok?li#g3_w$}9=RNg!&L>QM0H0uMSEBh`__I!e=2$WtWxV0~H49gGDU*;w zCnL(u$ubOTHKL5UQ26eJj!ynhJ1HbTpS3@({2p8n z0Lp*m@PS_BRqh}J8sPGU^X^lZ7i?JnhNm=^S7T7_cfC6fxeqzQ|9|E8FxO2}Q2vh= z{@h94lsg-&hJY%Dg_&U)YbcEes1dZBx>|2)^$hu6F2jK3m9$~khth6p2y`xAHZQL2 z4!otm(`)8Qr(^pt=iDEEdiCIMOEf!6md%rPf`&j=1DG>u&BS9){k}2soNW%!dKf{G z%f`q*|M>aE0F5aFRCXD_&#%xSnF&?~pwWtoQO>ceU7Hc0y`a_y^uUknL8bAR#y${iX=jJ;7`t)|+IL@UjSDnpoZ53hgf?QnQ25Nw^vQe_> zQ3L1>Pz~T#w}RD12PdkmtPOy5 zA=}aLfsB2&p!y?EIq#_#1#H_5%WrJ}MUV#+3cBw%&j-06lmQrL**t*vg@9k_o*3b} zN$|!6W$sgVeDO)Wj6v;bJ&uCLqbDTA2)N+nX*GGD1mV{uc>ODD#q%(}rb|~Xmv>CU zw*2UBZGe039+9M{D~1ddLS}viD*}QfPM?$E@WYSIc{c$3r0hObX=G4t@_H(?oAC-_Z8`6=qb1L5HO+cXd+6* z{m2)8+Bu-u5PBc*e?!RtZd$Y`8Nf}879|6?Y0;u&05>gKgx(4IKaBFpn$Og^hQM-x zhRw`70WOkNXR1SWYN*N@tl(Up>Arwej0h+WM@sn)I5hyHvVgEMSQ~(bIg10n#+oT- zaq|O7RH$9tBFd$>VsHYVEHPwE$tvM78(15FKqY5xT%NB!e1_6*@|1HVRZoz@2teC# zz@_K^%NNg!EXcHWL%o!zWVIfS_Cvsk#9{=pNgBdjrLTC># z10Pc!952QgFsR%Mk`~GX;Dj3){+iJwL)5!Z5S0f2#yv)We9xDMr3dH@jT9Hs1K>sm zz+D3GK0yc%2(=I3w#UjL*Dfd^1U;cp57<3ze ze>(WL)npvb0M8Fj4t->@o4Xc^#|>AkuNU&ZZFPBx3a0~+;zjRteSK!$q4!k=JQA#) zGRN8bW?KZSKnh$&FhST_hXSA%j$NE8&ryK3_0v0?a3jO%M8cbt{W1o@+5^}EtD9|G z(!bk<1#@C7-#aR@Epctr{Fw7;L+qJ-U(3Y_*8X@r?%Z`lgItQ3Ro7)4SqW0G36)zJ zK==P_H@S?&k^{II^6c#S^2`Qh{);a~Y5*`}Rava=&^Mj0zxuKl4`^?1mz1-C-Xddf z0D_DVXaG}rwwoHCClJbtK$%{cSiNauIfOrxY@gsG)kGasj_=$c0P* zxk7uuzNfzxWoU%Plz@8xveUU Ze*nFAI!&egNY(%V002ovPDHLkV1fw%v>pHe literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi/meta.json index ef5e62cca40..0c75fe63b5f 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi/meta.json @@ -1,11 +1,11 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e", - "size": { - "x": 32, - "y": 32 - }, + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e, lamia & segment by @noctyrnal", + "size": { + "x": 32, + "y": 32 + }, "states": [ { "name": "icon" @@ -25,6 +25,13 @@ { "name": "equipped-OUTERCLOTHING-harpy", "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-lamia", + "directions": 4 + }, + { + "name": "segment" } ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi/segment.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..2217a8685712c7747e80e089d4d7e365a3434cab GIT binary patch literal 476 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/luxury.rsi/equipped-OUTERCLOTHING-lamia.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/luxury.rsi/equipped-OUTERCLOTHING-lamia.png new file mode 100644 index 0000000000000000000000000000000000000000..0272ceb588b6761a540e1d991f484bf9dff6f3f6 GIT binary patch literal 3521 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 b&PtjWXUU}2fwph900000NkvXXu0mjftp4pK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/medical.rsi/equipped-OUTERCLOTHING-lamia.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/medical.rsi/equipped-OUTERCLOTHING-lamia.png new file mode 100644 index 0000000000000000000000000000000000000000..87737253834a173ac99112af8c1dd8d8b3204e9b GIT binary patch literal 1668 zcmV-~27CF5P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1{q02K~#8N?V3?& z97Pz%=W2avBsM`2lD5XANlL1iQuLudC~DL`C>PO}3TnlahKp2DYAp@5q-ZIMiaAoO zSbeUTppd9(K_4QBiUl<^NfS$LBBCTU(7vcS?>D(`nQrfHXYOwAK=%jB%+BuZ|NFlA zc6O6*RYXKYL_|bHM8yA;Sf&l6zrR0~>1uj_y;CG|9dVKt4m`76ojU!M zZoz-tR^KWEP8@qxjgF3L$4qegz{zvEPs?%6_2k;74autNOm8{pa@<8f?}A~b zl3euO?JwyR$9Vzgw=7Luc8*Z!qSUwXx>!y3%S)NvE3W&v?zKSth{gs(E zC+2-m)S=;qD%DW8O84RH+$DAPw~Lv*Ww;+pfq5NM9}*WAReQSq;9!rZf9m{&rQ6eO zw)H9-R<{7Dg~RLb-{nQ$yai<8Av4Z=_LdHaWJ@v6<$U@qeqF!(sE)3^S?z!Om>w%c zKkq?SQkm(VSDsgoY~7>#`7+?ckwdC~@9VnHxZDzj5TyUb_rI&VHeFwozEuDaZ@P9- zB|lyjm;s50E~)81tF;lu1mN*o8&)i?{OcdTeh{wufySNr;YbSc*t*>@n->gHE_Lp3 z3M1Cvva=xPP5kLUvBdgh-m`h+ z3G&PZS#W??(bm@1k_W)A57=O8Lsd^J{0jHG^;p052tSzwPKd>TN=)UVefY85z;7Xv=;fIA;J04R2(7 zcWm=E_Wk!~7!Z7%HEp0}pK+NS7n}lslL+$ipyQd-A})dmwpvalgkFtuDWrf8XFsP(snx8G~o2l7xWlx zxM_9h&I^7Uiq$U2STVvRY{yM1tsfB)5fKp)5fSlU!1?uYaB%R7*HGx}>@4f6XhrPc z-{c6(zrSeN2ijall@ierO}{O+Rbj#U{{iNOrA|)^^yBfk?w13!yJokwCRYf`AbsN~K5w z5+*nge3XH<1fM>(f!Jz;^@5R1oln&beUsT+uE?*sL=^v?S%3eOVZ}C0sJV$xv2TGu5aDXR8*6QkqJ`qb}3+7D3Yn zU{YKv(#`>pSq941FFe^-(F}O){a){T0AMV%0APUW=o`tdv{-XlW?%4UL45O+dM>eC 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 kzwZGr6~`I;%p>Le0%BEVnx&QzG literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/equipped-OUTERCLOTHING-lamia.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/equipped-OUTERCLOTHING-lamia.png new file mode 100644 index 0000000000000000000000000000000000000000..b707f6bf1130fc54869d6d2d1a029c02771b9f50 GIT binary patch literal 1025 zcmV+c1pfPpP)Px#1ZP1_K>z@;j|==^1poj5JWxzjMV69T*wdUTDJecaK3^hdtfy$gy?li?nO09p zZYOst%>Mv{|2d5RIr#s5{Qq9U|F^PoD11?EKK~z{r?Uw73 zn=lN8jSR#g+culL|GV}(wg5pOJDvV&XHRC=MwesBSEc7);+x>#BS?bx9r1JSpOL22 zb=GxTitv$Au5I2A;^@;bTDEaWy-S4EwohZq0&TRI(O+P&V)$Qzej(^D3{Z1qh-l&H zFV{XB1eW`2(9ZJanLu-Q6EmCPW+_iw0#ZmwZOTjl zy)^6z@F#^D0V!a+O@UoXegu)dU1oV{@t-^bQdwu&fg17|7`S{PAV>mpFpx`EnBw-0 zmTd7~3Fr>@QMfPpZBYq6D}hUdNB|f?jZ3zWB7N5XE)gOD`4hm)CYqrD*gy)wCBly2 ze!rg+XokhV>;WMXKs^lnZ46f6iZTsv2$)?!>yj;Cmw_6W2$6v0dpsUmPM2)KIBJdHk{8tCfl^^e#}SA?)yLUxswz@oDvu(-RYig( zskmqdX)wSnAFYCp0@cgc5y;LZAP}$x%x+q%ppVcxr<+mihG_~ty?dI6&p^5buR9BY zQ794Cjubz+}Z(c_;p7$9|w2a0MEA4rIydh`?g;#twTEk`VQZ?uP)u>vn vMj>CKQYHJ&zcDBa|J)E%iZA^4HqYm8_R;BYQ(Knl00000NkvXXu0mjf44})c literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/meta.json index e482264df5f..facdffc28d2 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/meta.json @@ -1,26 +1,33 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e, lamia & segment by @noctyrnal", + "size": { + "x": 32, + "y": 32 }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-lamia", + "directions": 4 + }, + { + "name": "segment" + } + ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/segment.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..972865cd17c916bd017e9d28d0797c479f358d6e GIT binary patch literal 446 zcmV;v0YUzWP)3e0{8ajj^Gg80^UKpld=z&boxDb8fO&Pa zT4#{5fOs20%3|qj9S2~{hY+ueHfWjAEnw`RGGFxlub6FSQ~@bJE90v8y6;~AmSU4B zlC)o0i=$KHuQvvelj&02^E@b}002aUB<&-PjP>2QT=EP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2W3e_K~#8N?V5XN zmQ@_bfAf-TOOtfY3l4O`W)^OOWe#1Y8EK*IowiD=X<*nA#0bqUm{%eZWJ&#DtF&6R z4TVxrL=@Iu+L5<{D9Zk6|Sk-hD6_WZ`P$L)R3^X`3D^uAwsIL|rH<@^2p&hMP( z@;gZvHq}WyqlZ(*EfNlJ%D6?s0ZtjWNI1YL;}!`AIAz?z*PGzWWjlgj_1z|S4sDbd zCmu+0nq~E&{NQJ22g>+M^JP`>?6&r3!_8kbYl_ne}=^@F`+ zaKGO2%=F&A`K=tFf@%l!Q2;r(g)&ch3|<$`DYv&)Zd4*<}ZK z`IXm=viB=x#c+i<869^k~;0~^SF-dyMm7RO^CN}zFJc% zcYIK4O2$5&LGSzJ_x&EgjGLC$>TP-gP^Y~+pgi6Pa1TR22ZANDa=(Yz(dP1ogaN#d2)Y3>xfA~X9k0TuRG9QH934sQO9NAiO?+5IIoImH~i z(sZ@m{?YHw%d%X5{MN6+7@t2jUHYc>ksW0Lx$W_@&JmHX-x(^ii!0^Ql|SXcvHEu3 z3DJZ)AbmiZT)ujx%>g&2q)Pp-4Q&o^PPc;fQ$XLuR#sdUK1i4Vb)!x@(DR~=eND64 zj0YI)E@|gD=a~jeSUZ5%%MqEQWNl%J`Rd~ls2g?KInH^p0KIDi+w&Bi4uPAN4tDlh z@$8(e;1dOTvZ(Zgsjqmd$dq9H8|9{avm{I2uBw*TK0XokA@I^;S?wagI|P6ZgIC_Q zEt z)?sPqHND)tZt{PSCl2`%?Gzr5js6K*u11x=AS!O8)Uu35gs zWM03&a9DPyWSfNwx>%wqc}&z&VWH7#8(eV0tvb+zHZ-Euwll0FKn-NfLjpM)`(4cd z*<#G870zC3*2t>^ZNN`wSUG^@CoF~0ygM6&Y=AnsxLD)(hz+KM3r?Uq+}hBJW*b;J zfEkr#C_wY>5HSgn6C`I(TXz92IN?SET4>X?1ddiK+pLE`&FbrW7|(xHGsI+Oz5fYg zfpxiC%(#XNPPjD+-9T$gr$u)Tn6f!wvcaWWw>vGZOJe4Z{>Ai!MnEi|1bT0{;Dj3u z3bdgSt+uds!2Ttb&R%N|FbOde(-W-R(g=v>TeD|^ENoh3+8|yw^P1e9 zn;{3wi%ps;)|j7nS942YoB-d&qf1RrQu6|6TfQqx=H?GFbsHyy{TR}l=*kSu#ACUvF z8-$94utT6Dh49qOwl z&_|KmV0{Mj80wB3A-O>`0rz`{SDU`C0CaU^YuHK9?F4=1cJ$%nCNeuQgeFJT32wMG zdNoDl0H99L#R&@abfmfYu0WlDCg9c8k*0_p0MrRUNx{Eiyu#}Qpn8B;Qjk2f in~xU!=(*ljk$(V=dhi#%CuZ9K0000a*3lDdzlZIexK^W^>2t}dN&6-*dcVX%>#C*J)#=sF{!A6US$b6s zxwko;{TChGo-uX%$@AGhcQl2|z3So?hu(AR&QE;dc`i>*cp`JkZX@}=GzOF1+-y

k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`1=2l#}zCNVQ-y1IKhTKGF!nkcEfQkB{&$5*ee-CmZt-rVZCh5Aw7;805& z4+BGn1_y@!459M!ZYJhoR<_&ac&)@$#iDE&?yChjS%xVnTIlEonp^IaO7%C%DE(&BKAE&dGn?BfB%njq%?9#p+n=Rxl`i=8s}I z)csQUf|{`$*KBU4O@W1MKdu~?w0rze;s5a`ncA{d4=1nru+Js?-XvcGraFD5kX?Hk zv^`nAsU7C3cy!=}lqKuS>RF2f6$Ck6RKD@HZfw0j-NM=+>dB@9y;B5w^RGJE$Xw`k zV|d-LO?3NonJqD@p*}JXzIH8&ExvGwp?wasNp9B6*L#|0?Q{*ATUhW`mXC4mdQ$^u zUiN)u7OEKx9x@ek@+CsA9N<}@=!kDmGbo2e%5|}9R;<)pIn4kU44;((XiRH0W z9XQz4VDZ9Gc!BV*RVLwE;(O0Fe$#m?o|)V)H+f;fo7=l17i(@gs9YH4qNvFGcIrn% z&9u3beay^$?)mG#&@wG)&q3e2vnZLl@z#L6}NK=1~JgT8uUbq_|XuLCtQ`DD!py|ZM=tMOO(v%~QYJw1`fupp|PI>!Q zgsaXFw$`3lkft1YR1*a5Z-D*)y4&8j8x-La+l685DV5CY%cL>TF0000J zAQ&)c6x2jSL_|cgN-3M0`BTIk%4iElN^FAk)4eFY?uv0JbGl3|-6?zej=cr?24+zM zYJhIwtaV5FpVrzD&v6tepTpf>zv7rf8OiJdwKzoVLlr8l000UA07*qoM6N<$f>O&u AHvj+t diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/tip.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/tip.png deleted file mode 100644 index aea8d36818c618598e2dcf0a910038e3c9861ce1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572 zcmV-C0>k}@P)4Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmOVGd003Y~L_t(o zNA1%w3V<*Sh2iL|_rG6G(N3|2CkQQKi{kQs5E>FlveW^3m-pA@9rCnv<(9BiuZ#ZE1fSl5Yu|EqI3j0000< KMNUMnLSTZ}k_1x# diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi/equipped-OUTERCLOTHING-lamia.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi/equipped-OUTERCLOTHING-lamia.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf53e302b0bfe745c68d01bf19bd7448cdf3ac5 GIT binary patch literal 1037 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`1A1^9%xCNVSDt7~Vvx|=AeT(?m7ceD((wAm`hm*?rr(BQ!EpJBbZ)luJI z4+Fzcd3iSz^Dryh?Q*6fJag1I;aW%JJkV$QkPB`Py69 z>FF5BE6rAt0b2F)-+X=`rBo8+7yO?PVBo!QxDcqCv%n*=n1O-s2naJy)#j6CU|?qQ zba4!caDN+ibJAl4o+%9uMwV*xexFMD^WT1_ZuBuG`J1b1@4Q?UvLVVOH!(WkcmEI3 zAN;Hy3zCmkoNPF}f3l;z)&ZX6fuJKH{p{qKV zG2a7iYl9lOiVF8unL3|~*(EI>G#F%Z3YRO}b1XPw`0K?Y>t7Oq8NK{3wkeeH6$rP5 zGcIE;pRK}Y^KoI2L!#qq<_edCQ%^GezLLhCd&{4NsiKrYZfjWD9#$R3T#Fl3J*R)p zw9o4o&Cfcpqujzl_leVE=BhZ^h&q7@?d+!tF8p1tXvc6l(2BK8<#VKh%H)RXD?b=+ zD%;(ifByMz;nQ}RHr!i+e!G>OGT$UGCEF-qZ)0a`YiqY5hQ~nLaQ>go#s5rx8#U!$ zaZIjMcIdUr$og;l!c}%p#6E!lc5kM$uW$eU{rh(I!Dz-x$p;MYH@kV=DVvbJL1BWO z-Tr<1?CiU2w=qpW{rzjz-+eJ+EFM1}#cpRRVXWUfjg!qqHvUqp#Izsl#55dO_AOei z-Prfs;PCpT|3&Lq>sVP@5A;6Y;5;{3zre+ze%{M&NxMar)0eYbr}@2z{ITivSC$1F znn%qqb9h(_H11gPK(>lGXu@K_0~{xAa?CgWxh8Xo)Ai}Ub$S_EnJpt1WUsMw2%mg- zk{g3^LHn;qY}aKK7&FVI7_-=a7_GNpNf(0H5ACE?(~z;_R~F)w=D)I2w8!yeX- zdk69^GM;$1X4yn8g#?Cf9g718nKq{`7H4gl?0$3)Uz*DvMSasb@82~XH)K73$&G8_ z!a#=4^|PL}Uz8JPjdFYa=JF<|fA60)M-^Y_YPQqWPHC*OW0@CQX3BW5@fok~9gZ&z z&7zEj7m}46!oP%OuFKdjHJj;e!x2x y?e$cX=Ks0n@AV5Zo7ep-XDCdrn|pa%Jp;?}c`5I5GqwY>2!p4qpUXO@geCw00>2&r literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi/meta.json index 4aa4d60ccb8..fc4030c8815 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi/meta.json @@ -1,11 +1,11 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from vg at commit https://github.com/vgstation-coders/vgstation13/commit/a16e41020a93479e9a7e2af343b1b74f7f2a61bd", - "size": { - "x": 32, - "y": 32 - }, + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from vg at commit https://github.com/vgstation-coders/vgstation13/commit/a16e41020a93479e9a7e2af343b1b74f7f2a61bd, lamia & segment by @noctyrnal", + "size": { + "x": 32, + "y": 32 + }, "states": [ { "name": "icon" @@ -25,6 +25,13 @@ { "name": "equipped-OUTERCLOTHING-harpy", "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-lamia", + "directions": 4 + }, + { + "name": "segment" } ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi/segment.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..1a9469334f398230e1d7720c7d507461f1133891 GIT binary patch literal 947 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiemedic.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiemedic.rsi/meta.json index 90e3c14bb5e..c573d38e186 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiemedic.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiemedic.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Based on tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e, modified by EmoGarbage404 (github)", + "copyright": "Based on tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e, modified by EmoGarbage404 (github), lamia & segment by @noctyrnal", "size": { "x": 32, "y": 32 @@ -25,6 +25,13 @@ { "name": "equipped-OUTERCLOTHING-harpy", "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-lamia", + "directions": 4 + }, + { + "name": "segment" } ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiemedic.rsi/segment.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiemedic.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..0687aa9d0d799b9133c80c2340ec781d23c73122 GIT binary patch literal 576 zcmV-G0>AxHj0uGb-rPaxaWD{M zu=9%DZU2B5Fa8U{7^|m&%;UhD2VsgZg-$lyp$yYdyQXC(w3QmN#e<9VB)>pqm%P&t z-k0}2yx*6{lYHOjDr4kIyGH;KKm-s0L;w*$1P}p40Dvqilq3m&)zQ&^9+Bnqa|uB7 z))WQ^nmyU?cG_2cYz;Qs4ZsZ1u*94f%G`J8W7k6BK~DN9p0T8hcb3D~ZS+B)T4sYEiF z1fWzZ2~9!Rgl6@a;^HGVW^>g0F)DLo>})sL*=|yq8>8Njk Date: Fri, 16 Feb 2024 22:37:24 -0500 Subject: [PATCH 39/73] damage system refactor --- .../Nyanotrasen/Lamiae/ClientLamiaVisuals.cs | 6 +++ .../Nyanotrasen/Lamiae/LamiaSystem.cs | 35 +++++++++++++++--- .../Nyanotrasen/Lamiae/LamiaComponent.cs | 7 ++++ .../Lamiae/LamiaSegmentComponent.cs | 7 +++- .../Entities/Mobs/Species/lamia.yml | 27 +++++++------- .../brute_damage.rsi/Chest_Brute_120.png | Bin 0 -> 358 bytes .../brute_damage.rsi/Chest_Brute_200.png | Bin 0 -> 755 bytes .../Lamia/brute_damage.rsi/Chest_Brute_60.png | Bin 0 -> 172 bytes .../Lamia/brute_damage.rsi/Head_Brute_120.png | Bin 0 -> 207 bytes .../Lamia/brute_damage.rsi/Head_Brute_200.png | Bin 0 -> 604 bytes .../Lamia/brute_damage.rsi/Head_Brute_60.png | Bin 0 -> 148 bytes .../Lamia/brute_damage.rsi/LArm_Brute_120.png | Bin 0 -> 178 bytes .../Lamia/brute_damage.rsi/LArm_Brute_200.png | Bin 0 -> 363 bytes .../Lamia/brute_damage.rsi/LArm_Brute_60.png | Bin 0 -> 148 bytes .../Lamia/brute_damage.rsi/LLeg_Brute_120.png | Bin 0 -> 5504 bytes .../Lamia/brute_damage.rsi/LLeg_Brute_200.png | Bin 0 -> 518 bytes .../Lamia/brute_damage.rsi/LLeg_Brute_60.png | Bin 0 -> 161 bytes .../Lamia/brute_damage.rsi/RArm_Brute_120.png | Bin 0 -> 5587 bytes .../Lamia/brute_damage.rsi/RArm_Brute_200.png | Bin 0 -> 6173 bytes .../Lamia/brute_damage.rsi/RArm_Brute_60.png | Bin 0 -> 145 bytes .../Lamia/brute_damage.rsi/RLeg_Brute_120.png | Bin 0 -> 5575 bytes .../Lamia/brute_damage.rsi/RLeg_Brute_200.png | Bin 0 -> 465 bytes .../Lamia/brute_damage.rsi/RLeg_Brute_60.png | Bin 0 -> 163 bytes .../Effects/Lamia/brute_damage.rsi/meta.json | 26 +++++++++++++ .../Lamia/burn_damage.rsi/Chest_Burn_120.png | Bin 0 -> 275 bytes .../Lamia/burn_damage.rsi/Chest_Burn_200.png | Bin 0 -> 732 bytes .../Lamia/burn_damage.rsi/Chest_Burn_60.png | Bin 0 -> 135 bytes .../Lamia/burn_damage.rsi/Head_Burn_120.png | Bin 0 -> 163 bytes .../Lamia/burn_damage.rsi/Head_Burn_200.png | Bin 0 -> 299 bytes .../Lamia/burn_damage.rsi/Head_Burn_60.png | Bin 0 -> 135 bytes .../Lamia/burn_damage.rsi/LArm_Burn_120.png | Bin 0 -> 229 bytes .../Lamia/burn_damage.rsi/LArm_Burn_200.png | Bin 0 -> 317 bytes .../Lamia/burn_damage.rsi/LArm_Burn_60.png | Bin 0 -> 146 bytes .../Lamia/burn_damage.rsi/LLeg_Burn_120.png | Bin 0 -> 177 bytes .../Lamia/burn_damage.rsi/LLeg_Burn_200.png | Bin 0 -> 337 bytes .../Lamia/burn_damage.rsi/LLeg_Burn_60.png | Bin 0 -> 127 bytes .../Lamia/burn_damage.rsi/RArm_Burn_120.png | Bin 0 -> 237 bytes .../Lamia/burn_damage.rsi/RArm_Burn_200.png | Bin 0 -> 325 bytes .../Lamia/burn_damage.rsi/RArm_Burn_60.png | Bin 0 -> 167 bytes .../Lamia/burn_damage.rsi/RLeg_Burn_120.png | Bin 0 -> 180 bytes .../Lamia/burn_damage.rsi/RLeg_Burn_200.png | Bin 0 -> 241 bytes .../Lamia/burn_damage.rsi/RLeg_Burn_60.png | Bin 0 -> 137 bytes .../Effects/Lamia/burn_damage.rsi/meta.json | 26 +++++++++++++ 43 files changed, 114 insertions(+), 20 deletions(-) create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/Chest_Brute_120.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/Chest_Brute_200.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/Chest_Brute_60.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/Head_Brute_120.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/Head_Brute_200.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/Head_Brute_60.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/LArm_Brute_120.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/LArm_Brute_200.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/LArm_Brute_60.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/LLeg_Brute_120.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/LLeg_Brute_200.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/LLeg_Brute_60.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/RArm_Brute_120.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/RArm_Brute_200.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/RArm_Brute_60.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/RLeg_Brute_120.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/RLeg_Brute_200.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/RLeg_Brute_60.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/meta.json create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/Chest_Burn_120.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/Chest_Burn_200.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/Chest_Burn_60.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/Head_Burn_120.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/Head_Burn_200.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/Head_Burn_60.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/LArm_Burn_120.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/LArm_Burn_200.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/LArm_Burn_60.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/LLeg_Burn_120.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/LLeg_Burn_200.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/LLeg_Burn_60.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/RArm_Burn_120.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/RArm_Burn_200.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/RArm_Burn_60.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/RLeg_Burn_120.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/RLeg_Burn_200.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/RLeg_Burn_60.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/meta.json diff --git a/Content.Client/Nyanotrasen/Lamiae/ClientLamiaVisuals.cs b/Content.Client/Nyanotrasen/Lamiae/ClientLamiaVisuals.cs index 32d700ff813..a9510fe6daf 100644 --- a/Content.Client/Nyanotrasen/Lamiae/ClientLamiaVisuals.cs +++ b/Content.Client/Nyanotrasen/Lamiae/ClientLamiaVisuals.cs @@ -1,4 +1,5 @@ using Robust.Client.GameObjects; +using System.Numerics; using Content.Shared.Nyanotrasen.Lamiae; namespace Content.Client.Nyanotrasen.Lamiae; @@ -16,6 +17,11 @@ private void OnAppearanceChange(EntityUid uid, LamiaSegmentComponent component, { if (args.Sprite == null) return; + if (AppearanceSystem.TryGetData(uid, ScaleVisuals.Scale, out var scale) && TryComp(uid, out var sprite)) + { + sprite.Scale = (new Vector2(scale, scale)); + } + if (AppearanceSystem.TryGetData(uid, LamiaSegmentVisualLayers.Armor, out var worn) && AppearanceSystem.TryGetData(uid, LamiaSegmentVisualLayers.ArmorRsi, out var path)) { diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index 467d2f2eaca..ecfc834d2bc 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -1,5 +1,6 @@ using Robust.Shared.Physics; using Content.Shared.Damage; +using Content.Shared.Explosion; using Content.Shared.Clothing.Components; using Content.Shared.Humanoid; using Content.Shared.Humanoid.Markings; @@ -8,7 +9,6 @@ using Content.Shared.Tag; using Content.Shared.Standing; using Content.Shared.Storage.Components; -using Robust.Shared.Prototypes; using Robust.Shared.Containers; using Robust.Shared.Map; using Robust.Shared.Physics.Systems; @@ -58,9 +58,9 @@ public override void Update(float frameTime) revoluteJoint.CollideConnected = false; } if (segment.segment.SegmentNumber < segment.segment.MaxSegments) - Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0f, 0.15f)); + Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0, segment.segment.OffsetSwitching)); else - Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0, 0.1f)); + Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0, segment.segment.OffsetSwitching)); var joint = _jointSystem.CreateDistanceJoint(attachedUid, segmentUid, id: ("Segment" + segment.segment.SegmentNumber + segment.segment.Lamia)); joint.CollideConnected = false; @@ -84,6 +84,7 @@ public override void Initialize() SubscribeLocalEvent(OnDidUnequipEvent); SubscribeLocalEvent(OnHitSelf); SubscribeLocalEvent(TailCantStand); + SubscribeLocalEvent(OnSnekBoom); } ///

@@ -101,6 +102,9 @@ private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, Se if (!TryComp(uid, out var species)) return; if (!TryComp(args.Lamia, out var humanoid)) return; + if (!TryComp(uid, out var appearance)) return; + + _appearance.SetData(uid, ScaleVisuals.Scale, component.ScaleFactor, appearance); if (humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings)) { @@ -116,6 +120,7 @@ private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, Se private void OnInit(EntityUid uid, LamiaComponent component, ComponentInit args) { + component.DamageModifierConstant = Math.Clamp(component.DamageModifierConstant, 1, component.NumberOfSegments); SpawnSegments(uid, component); } @@ -154,7 +159,7 @@ private void OnRemovedFromContainer(EntityUid uid, LamiaComponent component, Ent private void HandleSegmentDamage(EntityUid uid, LamiaSegmentComponent component, DamageModifyEvent args) { - args.Damage = args.Damage / component.DamageModifyFactor / 5; + args.Damage = args.Damage / component.DamageModifyFactor; } private void HandleDamageTransfer(EntityUid uid, LamiaSegmentComponent component, DamageChangedEvent args) { @@ -190,18 +195,33 @@ private void SpawnSegments(EntityUid uid, LamiaComponent component) private EntityUid AddSegment(EntityUid uid, EntityUid lamia, LamiaComponent lamiaComponent, int segmentNumber) { LamiaSegmentComponent segmentComponent = new(); + segmentComponent.Lamia = lamia; segmentComponent.AttachedToUid = uid; segmentComponent.MaxSegments = lamiaComponent.NumberOfSegments; - segmentComponent.DamageModifyFactor = lamiaComponent.NumberOfSegments; + float taperConstant = segmentComponent.MaxSegments / 2; + float damageModifyCoefficient = lamiaComponent.DamageModifierConstant / lamiaComponent.NumberOfSegments; + segmentComponent.DamageModifyFactor = lamiaComponent.DamageModifierConstant * damageModifyCoefficient; + segmentComponent.ExplosiveModifyFactor = 1 / segmentComponent.DamageModifyFactor / (segmentComponent.MaxSegments / 10); + EntityUid segment; if (segmentNumber == 1) segment = EntityManager.SpawnEntity("LamiaInitialSegment", Transform(uid).Coordinates); else segment = EntityManager.SpawnEntity("LamiaSegment", Transform(uid).Coordinates); + if (segmentNumber >= taperConstant) + { + segmentComponent.OffsetSwitching = 0.15f * MathF.Pow(1.02f, segmentNumber); + segmentComponent.ScaleFactor = MathF.Pow(0.99f, segmentNumber); + } + if (segmentNumber % 2 != 0) + { + segmentComponent.OffsetSwitching *= -1; + } segmentComponent.Owner = segment; segmentComponent.SegmentNumber = segmentNumber; EntityManager.AddComponent(segment, segmentComponent, true); + _segments.Enqueue((segmentComponent, lamia)); lamiaComponent.Segments.Add(segmentComponent.Owner); return segment; @@ -232,6 +252,11 @@ private void OnDidEquipEvent(EntityUid equipee, LamiaComponent component, DidEqu } } + private void OnSnekBoom(EntityUid uid, LamiaSegmentComponent component, ref GetExplosionResistanceEvent args) + { + args.DamageCoefficient = component.ExplosiveModifyFactor; + } + private void OnDidUnequipEvent(EntityUid equipee, LamiaComponent component, DidUnequipEvent args) { if (args.Slot == "outerClothing" && _tagSystem.HasTag(args.Equipment, LamiaHardsuitTag)) diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs index 2ef372c10de..13904a42020 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs @@ -13,5 +13,12 @@ public sealed partial class LamiaComponent : Component [DataField("numberOfSegments")] public int NumberOfSegments = 30; + + /// + /// Used to derive how much damage should transfer from segments to body. Higher = less damage transfered. + /// Clamped to NumberOfSegments as a maximum value + /// + [DataField("damageModifierConstant")] + public float DamageModifierConstant = 8f; } } diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs index 7605f9039ca..5025f5a965f 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs @@ -10,8 +10,11 @@ namespace Content.Shared.Nyanotrasen.Lamiae public sealed partial class LamiaSegmentComponent : Component { public EntityUid AttachedToUid = default!; - public int DamageModifyFactor = default!; - public bool SexChanged = false; + public float DamageModifyFactor = default!; + public float OffsetSwitching = 0.15f; + public float ScaleFactor = 1f; + public float DamageModifierCoefficient = default!; + public float ExplosiveModifyFactor = default!; public EntityUid Lamia = default!; public int SegmentNumber = default!; public int MaxSegments = default!; diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml index 5fcd28e2d07..da5bca4a84f 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml @@ -119,6 +119,19 @@ - type: NoSlip - type: Internals - type: MobState + - type: DamageVisuals + thresholds: [ 60, 120, 200 ] #these values aren't final, adjust accordingly with thresholds above' + targetLayers: + - "enum.HumanoidVisualLayers.Chest" + - "enum.HumanoidVisualLayers.Head" + - "enum.HumanoidVisualLayers.LArm" + - "enum.HumanoidVisualLayers.RArm" + damageOverlayGroups: + Brute: + sprite: Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi + color: "#FF0000" + Burn: + sprite: Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi - type: MobThresholds thresholds: 0: Alive @@ -137,19 +150,6 @@ - type: BuckleVisualizer - type: CreamPiedVisualizer state: creampie_human - - type: DamageVisuals - thresholds: [ 60, 120, 200 ] #these values aren't final, adjust accordingly with thresholds above' - targetLayers: - - "enum.HumanoidVisualLayers.Chest" - - "enum.HumanoidVisualLayers.Head" - - "enum.HumanoidVisualLayers.LArm" - - "enum.HumanoidVisualLayers.RArm" - damageOverlayGroups: - Brute: - sprite: Mobs/Effects/brute_damage.rsi - color: "#FF0000" - Burn: - sprite: Mobs/Effects/burn_damage.rsi - type: FireVisuals sprite: Mobs/Effects/onfire.rsi normalState: Generic_mob_burning @@ -202,6 +202,7 @@ layer: - MobLayer - type: Lamia + damageModifierConstant: 12 - type: Speech speechSounds: Alto - type: Vocal diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/Chest_Brute_120.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/Chest_Brute_120.png new file mode 100644 index 0000000000000000000000000000000000000000..404f932b64e8a140622a7bb3263dfdb19b12941d GIT binary patch literal 358 zcmV-s0h#`ZP)wQ0Hp`pO~p-n+XgdSSiI~j6>I%l~QWG1~VI~<6|T^#<(4Wl}afVLKvQe zp#eAsn`sxp*@+k)fEeS}gF^_*7r{RGvRAO*uyQe!)sS=k5vbk=nEkG4c@e68fb{1$ z=iJnFa#Xe7PS@EBXZXegCdu#?%v_>JfNVZ@|lnS$Rx-%zB$XC3j!C7_QE{r0fxp z_Xa%Lh^*cRyv2q{)gvJ74LHAlibBqr@-+bf0N}s*0?!i=k{(iRx-Es!xj?z6_M8k8u(!KyMe!JTF zq$pM*^A9t_jAZ~AhG7_nVVM7uOU+HU+bz-c+uPg4IhTwvRb$madPh5I#`;lu!#vMP z2mv9)!|!`zUdd61Y?Fb!{@_S=M!Z&>V&#+fzeP1~}&uiNzQZLdgI1eP5l1&oa+*qR9h52mvw1>;&gr zv3`*QVvLYdf>K^eiDg;xI@~+t6@(D7*0L;+QUbUy2`MFFjKyOXS5D{L!==&Z*2xzT;>k6+zDV24BdmU)Wydsa? zZnq?aK#VaPK-cvB%I5*+TsrC><2S?OU z9IbI26M)=yy!TK_!FzvN4In+G6o3!MT(8&Do<_4V&bdTRIg4=|lXEV;y6ry2cNy_l zO#bZ1|84pV!!QiPFbu;m48t%C^AFPW8hISY)O8&IVB5CSUQ2(aZuR*9;A3xK+qP_2 z%XrT~8l+jfElxB!z*-Aq47#q%pI5WjGR8FTMm0GAxNlP#V{$~!VB0nrW2&~pj}-3? z@6lRgSrz~|CHh3ybvg1{>!z`qGGJMjY{0f{r)0riXCHuCnwJ0>&>D#nNUL@7K%oPU zRi4_AK!JzF;M;sv z=M9pv4emb+0<-lec&j)lB?Fc12?*7mo47oC-TPNYA2a$a(@QvB{<z@qLn`LHy=BdJSb>Kj;L30P zJI&cYWnNBE^eD*);W=BaEc7Y;L(+7nn$=s&-po7v`rPvlk6fqhw;dgG9&Ekl{m@wY z;_+9-Gu0Mzo))vO`aOMzxHixJxG2Ay&Ia0MKpPks4t##IPjXkOe1O-zUWZq?2VP!$ z{V|Yff6k##NBi%U^?twTwfg0km`!aD-pl~2fAfyl(4|h3<@jtK5Z}|)&t;ucLK6Uw C8dqun literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/Head_Brute_200.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/Head_Brute_200.png new file mode 100644 index 0000000000000000000000000000000000000000..f1de5695c5adc09012210e68ce278db3418f53e0 GIT binary patch literal 604 zcmV-i0;BzjP)0sdQqWRTaRScZHbr~@A0Um}oWUoca+%iB^96{MDiRVG@D`C- zv|4Ew=fUbp^EE_K!iqKVttVrSzYlpLjeT@8%HY ze!s(73n9c?MTjZ@=iCE8mSs2`4&a=7t@SRQV2trX2w#>Zs;WX+mTwhdbpgWSrIc(O zM*zU_ctqEAZ0jNzV|>#ztgdSSfVCE<(}@9yE&^Nge|3j4}RvKKpPC-z|?@$6p?oxx~beYFQzKpQZ_Enxd|2OM{}`@;SWOFU-jB;gZB-JInu3x)WxuR_{B<4%7$)bxV>J|7jIh%J#j8 q%vgKKWYwx`>nF^VwPplK<~(N<2@$UM6E>d>;(EIJxvXARDpvb;L>0H zHwOjQJ#hJVS$;w1Ewg>*42+_DLW~Ry2W)0q-jm4g7Uh($<(RMiuVSXmWTU%&h{fl94CvRRN|6XxsK7@|^s-t|l?3 zY5GY*(=-p0ps!%nusj;yZ|1MS)wm?Ux*2+IuPzCws>(E8Q52@}T&Zfx@9oh_$SXgN zWAgsUGN-EP=++fuyxzn`o-1cH@Jp^f000000002MQ9g_4x^DO1<6E5#mSrh>lW>a! zgb-w&XQ`@6>bl@5v!8+uhKDPU3|NROC006)z`v!x_nOBEXZsPy|002ov JPDHLkV1j2tqGJF6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/LArm_Brute_60.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/LArm_Brute_60.png new file mode 100644 index 0000000000000000000000000000000000000000..1bcf2e505a1897df1f36f5b3f381079d437dfd64 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=(Vi}jAr*7p-q^_7V8FxT(EZo_ zr{bo_6)P8bu!xm2N37T1S0D;hcYkV%+RXgt6-#_Ctg_vDkNJ^q+kUyP~!- q&Sm?$D7OHpjDg|BL2Wq@y`z|ErJ~%-doj#cL0nH)KbLh*2~7b1+AwJV literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/LLeg_Brute_120.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/LLeg_Brute_120.png new file mode 100644 index 0000000000000000000000000000000000000000..680ec3009a5017c345f61bb7d2ec136d38c22057 GIT binary patch literal 5504 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 qdkx7Mfj2k;+*3=&m}^= zv{)=eiyd5mvMl+0K2zWK68XH;G!5l>{yE2CyWKJok+qin_f&Sf9XCzG{#zpEcW8j+ za(QpbGSGsdtnW|pLiqTr$^KI;x3B1+R#tSz5$&T$;aKi2&S z#u%P@^PY1~v;%_A?Bm6!wWh=2AbuAZWB7W#{`e=cPVf=XT9ekA(ljL^qG1@skHX)Z zkK>q>Qlyj;i5*;kVHij$MO9TrT5E}%o>EFtUDpva(_=RP0000000000006*ClfLFo zt!Wzea|vD7QB_s{y&sVY5&vdCw>;0IuIs36TUxDFqhg2@V6N$qN7hh(7U_V?>Y#*OX-$Wmy)qu4n;Hr;}v3r;;S0&1MrNNfNx~A7om{6uKUw761SM07*qo IM6N<$f-vysivR!s literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/LLeg_Brute_60.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/LLeg_Brute_60.png new file mode 100644 index 0000000000000000000000000000000000000000..2670821090fb2abb277f7fdc72ac5351a697be70 GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=8J;eVAr*7p-rUH0K!JzFVai|k zL=OHVd`rCK1Cl1}h(561d{Ln$P$3X7XRWo(4s%&@R%()H&TXbmDf_lvS6Y;wmv&mH zFJ1fTeWAYpe;_L5Hn&fH{aRu5mTO_|5yxYN8Z6D%EYY5%?+`x+q`=eF&t;ucLK6UH Czc#Y~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/RArm_Brute_120.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/RArm_Brute_120.png new file mode 100644 index 0000000000000000000000000000000000000000..f68f0c4f15f84d288af693e957fa8e6a5a67e8de GIT binary patch literal 5587 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/RArm_Brute_200.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/RArm_Brute_200.png new file mode 100644 index 0000000000000000000000000000000000000000..6b99414d0be62c8814460c118b82a3c7effd6ded GIT binary patch literal 6173 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/RArm_Brute_60.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/RArm_Brute_60.png new file mode 100644 index 0000000000000000000000000000000000000000..2e4a031f15166f01e7cfbdce1b3f580854ff090c GIT binary patch literal 145 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 Hu0mjf9l6Tm literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/RLeg_Brute_60.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/RLeg_Brute_60.png new file mode 100644 index 0000000000000000000000000000000000000000..44aae3c0bfb91ebf9003c1a337b4e3bd96c7f5ec GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=S)MMAAr*7p-aN?JU?9M9AmRVg zB^}xtwnz3WbY$$AJhMI_(rkS;FHj`|!vhzWGwY3IzTUf@dMd&po4Z&y*Lro1s>_ix zyL`ebYp05;O?#Wo1XgMv@X({^YT5IP5|3ZXe6?_947ktdbwGR4;WHNJKngrv{an^L HB{Ts5vF$nj literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/meta.json b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/meta.json new file mode 100644 index 00000000000..583346556e1 --- /dev/null +++ b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/Citadel-Station-13/Citadel-Station-13/blob/971ddef989f7f4f365a714ef3d4df5dea2d53d9a/icons/mob/dam_mob.dmi", + "size": {"x": 32, "y": 32}, + "states": [ + {"name": "Head_Brute_60", "directions": 4}, + {"name": "LArm_Brute_60", "directions": 4}, + {"name": "LLeg_Brute_60", "directions": 4}, + {"name": "RArm_Brute_60", "directions": 4}, + {"name": "RLeg_Brute_60", "directions": 4}, + {"name": "Chest_Brute_60", "directions": 4}, + {"name": "Head_Brute_120", "directions": 4}, + {"name": "LArm_Brute_120", "directions": 4}, + {"name": "LLeg_Brute_120", "directions": 4}, + {"name": "RArm_Brute_120", "directions": 4}, + {"name": "RLeg_Brute_120", "directions": 4}, + {"name": "Chest_Brute_120", "directions": 4}, + {"name": "Head_Brute_200", "directions": 4}, + {"name": "LArm_Brute_200", "directions": 4}, + {"name": "LLeg_Brute_200", "directions": 4}, + {"name": "RArm_Brute_200", "directions": 4}, + {"name": "RLeg_Brute_200", "directions": 4}, + {"name": "Chest_Brute_200", "directions": 4} + ] +} diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/Chest_Burn_120.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/Chest_Burn_120.png new file mode 100644 index 0000000000000000000000000000000000000000..5a68c6fd86142ec705e4a3fdfc31362539c99527 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=w>(`OLn`LHy`{+4Y#?&%W7_ls zNtT>_!U`TADnx{BPK#EpK6~z+$lO<#Civv2zMuN$|K}&aZ#kVkYzfrN@Z+G-*N10r zPQSxcdQ~Ru+3c9-b5^fD_KsnX#|Ndf3Vd}V3AH|2H64xAM(E) z=IDLc;`+>e8uO(RgH>~TSG3$c|8~OH?lX@o&sY8tcqXgk{zSFs`N0Yqp!x%ndl`KG VH|^bN+w=^i-_zC4Wt~$(69C9tdyoJC literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/Chest_Burn_200.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/Chest_Burn_200.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca0dc67f153aeab95b43905762a2ef11afc6ea5 GIT binary patch literal 732 zcmV<20wev2P)OnB%y`~1$%+~T0GsP;T2?`|QX;pO6*VYtnS+&}qyAtC)}$oMGy*NZpsJM; zS*AfXDaqTL3gs=Z6b_?kr)k5sMJP0fZo7TuTu>cPmA6*6-9{)hhYi~nMLSJP;jr>} z!cPO=zJA8s%ws%TdXE12PrNDDmB+aWdCR2P`KS2N`i}0O-+1xz6=KQEWP5SH0q>sQ z-z{k02Hu)(FMd|webqOd967K|gUa=W*xxPCr(fr&A3CbT1Xe$EP_)zZ`pG;ZTLod6 z2Av$K_n~wK6zw!^%N?<>I12!XY!$?%bAYbXRxa#^_mJy4ZCpABh-?)E04yxdVq5O$ z*@|u>xm05CZ_v*P9JIa_HOSkGuKL#+(OtY+DNXl--v-mXe=x=vV~jDz7-Nhv#{OeL zf1kf=b+2(BOUrDWbUdQYr4l5w@!Ro8d{jBqU#5~z0H8l7Fe(=i z#Es0Hn-l2tE(R&CNy()W^ytAuxVeC!<0+j1>#F}ZicY5fA{LT1`yBF)z4*}Q$iB}5+Ev@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/Head_Burn_120.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/Head_Burn_120.png new file mode 100644 index 0000000000000000000000000000000000000000..90d69223b6d72eaa60f7cc6f0db1e382c471f0b7 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=S)MMAAr*7p-rC69V8Fw2Am_ML zPUC{}GA3_0YgM$CJaK&|_G5eWZjlE5Z>2la&&<0WnSJNk?(!_=^~tZp7Mzu`t7$so z2Q&u=K8SOE|JlMZ+!5aw3`tm>CnJl7G|{e*ykymKwM8(KbLh* G2~7afpFL6l literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/Head_Burn_200.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/Head_Burn_200.png new file mode 100644 index 0000000000000000000000000000000000000000..36b911481623f94d094667de464ded479f148ba2 GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=pFCY0Ln`LHy=BPP z;kJ&BIsUy}9Wwk&D+SCiry2x{&U}{n$z+R`(PoA9X-_j31smzu{Y{WOeyObXiP^&n zjjdWndwH+>PoMS1EM}>eQR#LCf8pHSc2UPR`ZjpS+L!&R$uha3Z?Ny*W1nY^O+0)y z(m=ODz~}Q^M2>!(}fN+hJEVT!P^~odTaTfovc7@Kp=42zwnU%c7b!JBOEmt a!9vk$ii)D0!fO`mgSeiqelF{r5}E*XE+$<7 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/LArm_Burn_120.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/LArm_Burn_120.png new file mode 100644 index 0000000000000000000000000000000000000000..7c8da637caf5e57123777180ed856099f3d9a25f GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Ydl>XLn`LHy=BP97%0H@!2OQn z>ZeM2ijP>7qyld~+gf#1E$=Z?$)Z4uqpQ9#omqF{_de!7Gf%2qKC^^{fkEKGhB%Y| zGklj^&J(sYjFSdhu4C*-xzv1Lpn0hfg@wr5ep!X7#*i zz5DO0d+t1oE#eMJ&97%* b_;E*Ca+c+*#_&@wK?Zud`njxgN@xNAQ7&Fy literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/LArm_Burn_200.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/LArm_Burn_200.png new file mode 100644 index 0000000000000000000000000000000000000000..2dc53776594eda8616ae777b1fe7f36586905cd8 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU}W)haSW-L^Y)f4*C7XiwucwP zX2%>Zu3*+>J$TBCN32PStBHfr)nnm=OU5^k9&_T>c6=M7?RY88%>K=9nFq;|X=UA! zf2z#g3JH_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/LArm_Burn_60.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/LArm_Burn_60.png new file mode 100644 index 0000000000000000000000000000000000000000..bc8f7bf9cae96ef3cea682d8565b29613da562f1 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k)AG&Ar*7p-t^>UP~>57n6ikK zRhudBM&o%cg;s|df)~Dc+52(=6*^s+^qbdkdR9EAw}p||ZkKg$N?-H$DF9`FU_+bu oFU>OlL(hMFFHxSSC&$3>jAw$4vH_dU0!xs*r>mdKI;Vst065GmP5=M^ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/LLeg_Burn_120.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/LLeg_Burn_120.png new file mode 100644 index 0000000000000000000000000000000000000000..a84ef88da87977eec2d0cbbe110b03200b365640 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=6`n4RAr*7p-g4w^FyLXmz*ca`c=j~M54gKgaE${Gx%7ZK5D%9MEVCuTKAlzN*P<$-+lD5cenb#`^;y~ z@L6w9^wR_y2?7UxKhiK+m;J-VQOQH5_1P2^p@l&+d8(7nie)-%x4-oLbf{8@)});- zQUX8btu%cFlm(JnANJPt&Nebs$0 zW{8^@7$(F&_A`#ZoizK}=gMV=yVo3xvATC|op(cUe%aMowW~+D=HP8 de%W5WQAe(?DWX@r#n>HWgr}>Y%Q~loCIC+AjaUEx literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/LLeg_Burn_60.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/LLeg_Burn_60.png new file mode 100644 index 0000000000000000000000000000000000000000..70b91d8824484b7eb0d26e2f4a9204086bd1fc89 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Zk{fVAr*7p-U{SoP!MoA=$$1d zEO98{+C{Fe2aRV$D&&9f76d8-f&-lwU;Wv5v@h=TXIGl4mi-{tr2VRY@S^jLA5`0WO!f?qP<$27bx5>-)avwJ(2yP#gb>Bx}@MZYU-^p>aa zADnWV5oiEIgP>*DQihZ$W#2c?-Bb7eU*-Oj h#ez{c=d&^}OjyUi&A=p-f2ASV08dvxmvv4FO#t4~U0nbG literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/RArm_Burn_200.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/RArm_Burn_200.png new file mode 100644 index 0000000000000000000000000000000000000000..77e463d02f25c942442c9631580c675c1c40de16 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVC3<1aSW-L^Y)fK*C7Lu;~$r| ze~@@L?*Q`-Eh{Tg7lHpgvMvHH1qEMJ?k!!{wIjmi&MO7RLIYplXrcY{Emim1$z?tW zWdR!3@Ve}FXwomAt0^B#E|}k2kfE1y#&;T@N2=WmtMJh5ndT2Q1PfPh4GEk2SABBa z<(cCDr>O1zCh+EpblIgT3ch8zjNh*Bo@$WlF*!E6p;+d5`L1UPmeOiU>-7&=_HBK= zm34(}UQve<_r)&5xHZ~JO6?kxZaoewlL1-{0uAypvqWo>ztlH8y0pN=y#6NRd*kxy z%Ur`&e*3mdKI;Vst0K3J75C8xG literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/RArm_Burn_60.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/RArm_Burn_60.png new file mode 100644 index 0000000000000000000000000000000000000000..96b96b566bfdcc8fe9294152e98b75b18f72bed0 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=d7dtgAr*7p-a5$HV8G*W@eu>x zL!NVwb><#WlsQ#e!sy6-RPDpPo$dY_dzUN)sz0!Jao+V8ZDEqLlTX>4)PH;Vc4KMW zuPZzgcFr|8w|7}Bv(a{DpfaE>EHnS}T)2Gy_H_gE^S5?NFflNwlrwk5$eFx$b^HTT N;pyt{O)K5hU2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/RLeg_Burn_120.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/RLeg_Burn_120.png new file mode 100644 index 0000000000000000000000000000000000000000..efe3ad8b53949254861fd643dc9be21a0e3ba863 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=)t)YnAr*7p-rUIR;2_bKxN(l| z5h<(QYg|Ikk?me91uf<0r8k`Z9sh3C{#8Kb3=9p%wbyg}&F5%dGwV;jqpD)|F|zag z+KAvsAKH_0Uz;3>b=tTrHRExcy~=h*u!e%GvDF8D^*Pt+R!0BH?38|0|7v&IXWokS YvU{Ah-&>p9ItxFVdQ&MBb@0AKk;DF6Tf literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/RLeg_Burn_200.png b/Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi/RLeg_Burn_200.png new file mode 100644 index 0000000000000000000000000000000000000000..978e01358f9916f1bafbbe11dc05604611641e98 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=J3L(+Ln`LHy=BOC$UuZG;bYOg zMHW-n$?A&6?BbetAbO|8uBvvcR6&+bv)XI#Z!_0B#c}M}9>oaM%5cCt_I3{t6+f>C z)486vn{)fmB@x>`8?;!r-0^um$MyPe-SnGFl+vP>t;;>OZ{4A(4)NisatAxU&KEgd zW+`___Ry1=m%duPef*bk(iGiC_N*X78Ga;Ae9qFd*4Senrv;tljbpuYZdO{ Date: Fri, 16 Feb 2024 22:53:58 -0500 Subject: [PATCH 40/73] more equation fine tuning --- Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs | 7 ++++--- Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs | 7 ------- Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs | 1 + 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index ecfc834d2bc..beedfd72530 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -198,10 +198,11 @@ private EntityUid AddSegment(EntityUid uid, EntityUid lamia, LamiaComponent lami segmentComponent.Lamia = lamia; segmentComponent.AttachedToUid = uid; segmentComponent.MaxSegments = lamiaComponent.NumberOfSegments; + segmentComponent.DamageModifierConstant = segmentComponent.MaxSegments * 0.4f; float taperConstant = segmentComponent.MaxSegments / 2; - float damageModifyCoefficient = lamiaComponent.DamageModifierConstant / lamiaComponent.NumberOfSegments; - segmentComponent.DamageModifyFactor = lamiaComponent.DamageModifierConstant * damageModifyCoefficient; - segmentComponent.ExplosiveModifyFactor = 1 / segmentComponent.DamageModifyFactor / (segmentComponent.MaxSegments / 10); + float damageModifyCoefficient = segmentComponent.DamageModifierConstant / lamiaComponent.NumberOfSegments; + segmentComponent.DamageModifyFactor = segmentComponent.DamageModifierConstant * damageModifyCoefficient; + segmentComponent.ExplosiveModifyFactor = 1 / segmentComponent.DamageModifyFactor / (segmentComponent.MaxSegments * 0.1f); EntityUid segment; if (segmentNumber == 1) diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs index 13904a42020..2ef372c10de 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs @@ -13,12 +13,5 @@ public sealed partial class LamiaComponent : Component [DataField("numberOfSegments")] public int NumberOfSegments = 30; - - /// - /// Used to derive how much damage should transfer from segments to body. Higher = less damage transfered. - /// Clamped to NumberOfSegments as a maximum value - /// - [DataField("damageModifierConstant")] - public float DamageModifierConstant = 8f; } } diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs index 5025f5a965f..4973cdb2c50 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs @@ -18,6 +18,7 @@ public sealed partial class LamiaSegmentComponent : Component public EntityUid Lamia = default!; public int SegmentNumber = default!; public int MaxSegments = default!; + public float DamageModifierConstant = default!; [DataField("segmentId")] public string? segmentId; } From f4834152d6ffc731ec0818d3f5bfe94171585513 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 16 Feb 2024 22:54:42 -0500 Subject: [PATCH 41/73] Update LamiaSystem.cs --- Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index beedfd72530..d0f2669ec75 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -120,7 +120,6 @@ private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, Se private void OnInit(EntityUid uid, LamiaComponent component, ComponentInit args) { - component.DamageModifierConstant = Math.Clamp(component.DamageModifierConstant, 1, component.NumberOfSegments); SpawnSegments(uid, component); } From 479ee18dbc45d9cc150258fe4cd14149f37039a6 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 16 Feb 2024 23:05:07 -0500 Subject: [PATCH 42/73] Update lamia.yml --- .../Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml index da5bca4a84f..eeb7a9bc256 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml @@ -202,7 +202,7 @@ layer: - MobLayer - type: Lamia - damageModifierConstant: 12 + numberOfSegments: 30 - type: Speech speechSounds: Alto - type: Vocal From c5026c25badb239f2d789e71ae68777fdefe313c Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 16 Feb 2024 23:39:06 -0500 Subject: [PATCH 43/73] Fixing the portal bug --- .../Nyanotrasen/Lamiae/LamiaSystem.cs | 5 ++- Content.Server/Teleportation/PortalSystem.cs | 18 +++++++- .../Systems/SharedPortalSystem.cs | 10 ++++- .../DeltaV/Datasets/Names/cyno_female.yml | 41 +++++++++++++++++++ .../DeltaV/Datasets/Names/cyno_last.yml | 40 ++++++++++++++++++ .../DeltaV/Datasets/Names/cyno_male.yml | 22 ++++++++++ 6 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 Resources/Prototypes/DeltaV/Datasets/Names/cyno_female.yml create mode 100644 Resources/Prototypes/DeltaV/Datasets/Names/cyno_last.yml create mode 100644 Resources/Prototypes/DeltaV/Datasets/Names/cyno_male.yml diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index d0f2669ec75..336c510309d 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -7,6 +7,7 @@ using Content.Server.Humanoid; using Content.Shared.Inventory.Events; using Content.Shared.Tag; +using Content.Shared.Teleportation.Components; using Content.Shared.Standing; using Content.Shared.Storage.Components; using Robust.Shared.Containers; @@ -138,6 +139,8 @@ private void OnJointRemoved(EntityUid uid, LamiaComponent component, JointRemove if (!component.Segments.Contains(args.OtherBody.Owner)) return; + if (HasComp(uid)) return; + foreach (var segment in component.Segments) QueueDel(segment); @@ -179,7 +182,7 @@ private void TailCantStand(EntityUid uid, LamiaSegmentComponent component, Stand args.Cancel(); } - private void SpawnSegments(EntityUid uid, LamiaComponent component) + public void SpawnSegments(EntityUid uid, LamiaComponent component) { int i = 1; var addTo = uid; diff --git a/Content.Server/Teleportation/PortalSystem.cs b/Content.Server/Teleportation/PortalSystem.cs index 76900a7e198..7707c9f2659 100644 --- a/Content.Server/Teleportation/PortalSystem.cs +++ b/Content.Server/Teleportation/PortalSystem.cs @@ -1,7 +1,9 @@ -using Content.Shared.Administration.Logs; +using Content.Server.Nyanotrasen.Lamiae; //DeltaV +using Content.Shared.Administration.Logs; using Content.Shared.Database; using Content.Shared.Ghost; using Content.Shared.Mind.Components; +using Content.Shared.Nyanotrasen.Lamiae; //DeltaV using Content.Shared.Teleportation.Systems; using Robust.Shared.Map; @@ -10,6 +12,7 @@ namespace Content.Server.Teleportation; public sealed class PortalSystem : SharedPortalSystem { [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly LamiaSystem _lamia = default!; //DeltaV // TODO Move to shared protected override void LogTeleport(EntityUid portal, EntityUid subject, EntityCoordinates source, @@ -17,5 +20,18 @@ protected override void LogTeleport(EntityUid portal, EntityUid subject, EntityC { if (HasComp(subject) && !HasComp(subject)) _adminLogger.Add(LogType.Teleport, LogImpact.Low, $"{ToPrettyString(subject):player} teleported via {ToPrettyString(portal)} from {source} to {target}"); + + //Start DeltaV Code, stops Lamia from crashing because they can't take their tail through a portal + if (TryComp(subject, out var lamia)) + { + foreach (var segment in lamia.Segments) + { + QueueDel(segment); + } + lamia.Segments.Clear(); + _lamia.SpawnSegments(subject, lamia); + } + //End DeltaV Code } + } diff --git a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs index ebd83624114..342ad4516b9 100644 --- a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs +++ b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs @@ -1,5 +1,6 @@ -using System.Linq; +using System.Linq; using Content.Shared.Ghost; +using Content.Shared.Nyanotrasen.Lamiae; //DeltaV using Content.Shared.Popups; using Content.Shared.Projectiles; using Content.Shared.Pulling; @@ -104,6 +105,13 @@ private void OnCollide(EntityUid uid, PortalComponent component, ref StartCollid _pulling.TryStopPull(subjectPulling); } + //Start DeltaV Code: Prevent Lamia Segments from entering portals + if (HasComp(subject)) + { + return; + } + //End DeltaV Code + // if they came from another portal, just return and wait for them to exit the portal if (HasComp(subject)) { diff --git a/Resources/Prototypes/DeltaV/Datasets/Names/cyno_female.yml b/Resources/Prototypes/DeltaV/Datasets/Names/cyno_female.yml new file mode 100644 index 00000000000..eea73f1e685 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Datasets/Names/cyno_female.yml @@ -0,0 +1,41 @@ +- type: dataset + id: names_cyno_female + values: + - Abigaia + - Aggeliki + - Alexandra + - Anna + - Anastasia + - Baslikike + - Calliope + - Demetra + - Despoina + - Eirene + - Eleni + - Ephrath + - Esther + - Eunike + - Evangelia + - Georgia + - Ioanna + - Ioudith + - Kandake + - Konstantina + - Kyriake + - Leia + - Lois + - Lydia + - Maria + - Mariam + - Martha + - Orpha + - Paraskeve + - Phoebe + - Priska + - Priskilla + - Rhachel + - Rhode + - Rhouth + - Salome + - Sophia + - Zoe diff --git a/Resources/Prototypes/DeltaV/Datasets/Names/cyno_last.yml b/Resources/Prototypes/DeltaV/Datasets/Names/cyno_last.yml new file mode 100644 index 00000000000..3ed9f62f11f --- /dev/null +++ b/Resources/Prototypes/DeltaV/Datasets/Names/cyno_last.yml @@ -0,0 +1,40 @@ +- type: dataset + id: names_cyno_last + values: + - Alexiou + - Antoniou + - Antonopoulos + - Athanasiou + - Christodoulou + - Dimitriou + - Dimopoulos + - Georgiadis + - Georgiou + - Giannopoulos + - Ioannidis + - Ioannou + - Karagianni + - Karagiannis + - Konstantinidis + - Konstantinou + - Lamprou + - Makris + - Michailidis + - Nikolaidis + - Nikolaou + - Panagiotopoulos + - Papadakis + - Papadimitriou + - Papadopoulos + - Papadopoulou + - Papageorgiou + - Papaioannou + - Papakonstantinou + - Papanikolaou + - Papathanasiou + - Pappas + - Oikonomou + - Theodorou + - Triantafyllou + - Vasileiou + - Vlachos diff --git a/Resources/Prototypes/DeltaV/Datasets/Names/cyno_male.yml b/Resources/Prototypes/DeltaV/Datasets/Names/cyno_male.yml new file mode 100644 index 00000000000..ca72b07fd9b --- /dev/null +++ b/Resources/Prototypes/DeltaV/Datasets/Names/cyno_male.yml @@ -0,0 +1,22 @@ +- type: dataset + id: names_cyno_male + values: + - Amos + - Antonis + - Alexandros + - Athanasios + - Charalampos + - Christos + - Dimitris + - Elias + - Emmanuel + - Evangelos + - Ioannis + - Konstantinos + - Loukas + - Michalis + - Pavlos + - Petros + - Spiros + - Theodoros + - Vasilis From 7c0d2582694ddf1645c240f4199c2aa96a726cc2 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sat, 17 Feb 2024 16:01:55 -0500 Subject: [PATCH 44/73] Segment system refactor complete --- .../Nyanotrasen/Lamiae/LamiaSystem.cs | 31 ++++++---- .../Nyanotrasen/Lamiae/LamiaComponent.cs | 60 +++++++++++++++++++ .../Lamiae/LamiaSegmentComponent.cs | 8 ++- 3 files changed, 85 insertions(+), 14 deletions(-) diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs index 336c510309d..6aa420e3cc3 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs @@ -99,7 +99,8 @@ public override void Initialize() private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, SegmentSpawnedEvent args) { component.Lamia = args.Lamia; - _standing.Down(uid); + if (component.BulletPassover == true) + _standing.Down(uid, false); if (!TryComp(uid, out var species)) return; if (!TryComp(args.Lamia, out var humanoid)) return; @@ -121,6 +122,8 @@ private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, Se private void OnInit(EntityUid uid, LamiaComponent component, ComponentInit args) { + Math.Clamp(component.NumberOfSegments, 2, 30); + Math.Clamp(component.TaperOffset, 1, component.NumberOfSegments - 1); SpawnSegments(uid, component); } @@ -179,7 +182,8 @@ private void OnHitSelf(EntityUid uid, LamiaSegmentComponent component, ref Befor private void TailCantStand(EntityUid uid, LamiaSegmentComponent component, StandAttemptEvent args) { - args.Cancel(); + if (component.BulletPassover == true) + args.Cancel(); } public void SpawnSegments(EntityUid uid, LamiaComponent component) @@ -197,24 +201,29 @@ public void SpawnSegments(EntityUid uid, LamiaComponent component) private EntityUid AddSegment(EntityUid uid, EntityUid lamia, LamiaComponent lamiaComponent, int segmentNumber) { LamiaSegmentComponent segmentComponent = new(); + segmentComponent.MaxSegments = lamiaComponent.NumberOfSegments; + segmentComponent.BulletPassover = lamiaComponent.BulletPassover; segmentComponent.Lamia = lamia; segmentComponent.AttachedToUid = uid; - segmentComponent.MaxSegments = lamiaComponent.NumberOfSegments; - segmentComponent.DamageModifierConstant = segmentComponent.MaxSegments * 0.4f; - float taperConstant = segmentComponent.MaxSegments / 2; + segmentComponent.DamageModifierConstant = lamiaComponent.NumberOfSegments * lamiaComponent.DamageModifierOffset; + float taperConstant = lamiaComponent.NumberOfSegments - lamiaComponent.TaperOffset; float damageModifyCoefficient = segmentComponent.DamageModifierConstant / lamiaComponent.NumberOfSegments; segmentComponent.DamageModifyFactor = segmentComponent.DamageModifierConstant * damageModifyCoefficient; - segmentComponent.ExplosiveModifyFactor = 1 / segmentComponent.DamageModifyFactor / (segmentComponent.MaxSegments * 0.1f); + segmentComponent.ExplosiveModifyFactor = 1 / segmentComponent.DamageModifyFactor / (lamiaComponent.NumberOfSegments * lamiaComponent.ExplosiveModifierOffset); EntityUid segment; if (segmentNumber == 1) - segment = EntityManager.SpawnEntity("LamiaInitialSegment", Transform(uid).Coordinates); + segment = EntityManager.SpawnEntity(lamiaComponent.InitialSegmentId, Transform(uid).Coordinates); else - segment = EntityManager.SpawnEntity("LamiaSegment", Transform(uid).Coordinates); - if (segmentNumber >= taperConstant) + segment = EntityManager.SpawnEntity(lamiaComponent.SegmentId, Transform(uid).Coordinates); + if (segmentNumber >= taperConstant && lamiaComponent.UseTaperSystem == true) + { + segmentComponent.OffsetSwitching = lamiaComponent.StaticOffset * MathF.Pow(lamiaComponent.OffsetConstant, segmentNumber - taperConstant); + segmentComponent.ScaleFactor = lamiaComponent.StaticScale * MathF.Pow(1f / lamiaComponent.OffsetConstant, segmentNumber - taperConstant); + } else { - segmentComponent.OffsetSwitching = 0.15f * MathF.Pow(1.02f, segmentNumber); - segmentComponent.ScaleFactor = MathF.Pow(0.99f, segmentNumber); + segmentComponent.OffsetSwitching = lamiaComponent.StaticOffset; + segmentComponent.ScaleFactor = lamiaComponent.StaticScale; } if (segmentNumber % 2 != 0) { diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs index 2ef372c10de..c68b5fe8274 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs @@ -11,7 +11,67 @@ public sealed partial class LamiaComponent : Component /// public List Segments = new(); + /// + /// A clamped variable that represents the number of segments to be spawned + /// [DataField("numberOfSegments")] public int NumberOfSegments = 30; + + /// + /// If UseTaperSystem is true, this constant represents the rate at which a segmented entity will taper towards the tip. Tapering is on a logarithmic scale, and will asymptotically approach 0. + /// + [DataField("offsetConstant")] + public float OffsetConstant = 1.03f; + + /// + /// Represents the prototype used to parent all segments + /// + [DataField("initialSegmentId")] + public string InitialSegmentId = "LamiaInitialSegment"; + + /// + /// Represents the segment prototype to be spawned + /// + [DataField("SegmentId")] + public string SegmentId = "LamiaSegment"; + + /// + /// Toggles the tapering system on and off. When false, segmented entities will have a constant width. + /// + [DataField("useTaperSystem")] + public bool UseTaperSystem = true; + + /// + /// The standard distance between the centerpoint of each segment. + /// + [DataField("staticOffset")] + public float StaticOffset = 0.15f; + + /// + /// The standard sprite scale of each segment. + /// + [DataField("staticScale")] + public float StaticScale = 1f; + + /// + /// Used to more finely tune how much damage should be transfered from tail to body. + /// + [DataField("damageModifierOffset")] + public float DamageModifierOffset = 0.4f; + + /// + /// A clamped variable that represents how far from the tip should tapering begin. + /// + [DataField("taperOffset")] + public int TaperOffset = 18; + + /// + /// Coefficient used to finely tune how much explosion damage should be transfered to the body. This is calculated multiplicatively with the derived damage modifier set. + /// + [DataField("explosiveModifierOffset")] + public float ExplosiveModifierOffset = 0.1f; + + [DataField("bulletPassover")] + public bool BulletPassover = true; } } diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs index 4973cdb2c50..29f339b4f11 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs +++ b/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs @@ -11,13 +11,15 @@ public sealed partial class LamiaSegmentComponent : Component { public EntityUid AttachedToUid = default!; public float DamageModifyFactor = default!; - public float OffsetSwitching = 0.15f; - public float ScaleFactor = 1f; + public float OffsetSwitching = default!; + public float ScaleFactor = default!; public float DamageModifierCoefficient = default!; public float ExplosiveModifyFactor = default!; + public float OffsetConstant = default!; public EntityUid Lamia = default!; - public int SegmentNumber = default!; + public bool BulletPassover = default!; public int MaxSegments = default!; + public int SegmentNumber = default!; public float DamageModifierConstant = default!; [DataField("segmentId")] public string? segmentId; From 467f52005711c7eb2ea67d08d26a23ef7c9e6200 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 19 Feb 2024 21:00:15 -0500 Subject: [PATCH 45/73] Beeg final push for Beta --- .../Lamiae/ClientLamiaVisuals.cs | 4 +- .../Lamiae/LamiaSegmentVisualsComponent.cs | 2 +- .../Lamiae/LamiaSystem.cs | 7 +- Content.Server/Teleportation/PortalSystem.cs | 4 +- .../Lamiae/LamiaComponent.cs | 4 +- .../Lamiae/LamiaSegmentComponent.cs | 2 +- .../Lamiae/LamiaSegmentVisuals.cs | 2 +- .../Lamiae/SharedLamiaeSystem.cs | 2 +- .../Systems/SharedPortalSystem.cs | 2 +- .../Mobs/Customization/Markings/lamia.yml | 0 .../Customization/Markings/lamiasegment.yml | 0 .../Entities/Mobs/Player/lamia.yml | 0 .../Entities/Mobs/Species/lamia.yml | 2 +- .../Objects/Specific/Species/lamia.yml | 1 + .../lamia_inventory_template.yml | 0 .../{Nyanotrasen => DeltaV}/Species/lamia.yml | 0 .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 2058 bytes .../Hardsuits/spatio.rsi/meta.json | 22 ++++--- .../Hardsuits/spatio.rsi/segment.png | Bin 0 -> 513 bytes .../Suits/atmos_firesuit.rsi/bottom.png | Bin 0 -> 1036 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1925 bytes .../Suits/atmos_firesuit.rsi/meta.json | 53 ++++++++------- .../Suits/atmos_firesuit.rsi/segment.png | Bin 0 -> 457 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 815 bytes .../Suits/bombsuit.rsi/meta.json | 53 ++++++++------- .../Suits/bombsuit.rsi/segment.png | Bin 0 -> 445 bytes .../OuterClothing/Suits/eva.rsi/bottom.png | Bin 0 -> 914 bytes .../eva.rsi/equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 902 bytes .../OuterClothing/Suits/eva.rsi/meta.json | 61 ++++++++++-------- .../OuterClothing/Suits/eva.rsi/segment.png | Bin 0 -> 419 bytes .../Suits/eva_emergency.rsi/bottom.png | Bin 0 -> 893 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 941 bytes .../Suits/eva_emergency.rsi/meta.json | 53 ++++++++------- .../Suits/eva_emergency.rsi/segment.png | Bin 0 -> 409 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 903 bytes .../Suits/eva_prisoner.rsi/meta.json | 61 ++++++++++-------- .../Suits/eva_prisoner.rsi/segment.png | Bin 0 -> 369 bytes .../Suits/eva_syndicate.rsi/bottom.png | Bin 0 -> 922 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 919 bytes .../Suits/eva_syndicate.rsi/meta.json | 61 ++++++++++-------- .../Suits/eva_syndicate.rsi/segment.png | Bin 0 -> 434 bytes .../OuterClothing/Suits/fire.rsi/bottom.png | Bin 0 -> 975 bytes .../fire.rsi/equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1579 bytes .../OuterClothing/Suits/fire.rsi/meta.json | 53 ++++++++------- .../OuterClothing/Suits/fire.rsi/segment.png | Bin 0 -> 425 bytes .../OuterClothing/Suits/rad.rsi/bottom.png | Bin 0 -> 1098 bytes .../rad.rsi/equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1846 bytes .../OuterClothing/Suits/rad.rsi/meta.json | 53 ++++++++------- .../OuterClothing/Suits/rad.rsi/segment.png | Bin 0 -> 425 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 807 bytes .../Suits/spaceninja.rsi/meta.json | 53 ++++++++------- .../Suits/spaceninja.rsi/segment.png | Bin 0 -> 420 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1238 bytes .../Hardsuits/Combat/advanced.rsi/meta.json | 21 ++++-- .../Hardsuits/Combat/advanced.rsi/segment.png | Bin 0 -> 372 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1309 bytes .../Hardsuits/Combat/corpsman.rsi/meta.json | 21 ++++-- .../Hardsuits/Combat/corpsman.rsi/segment.png | Bin 0 -> 399 bytes .../hos.rsi/equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1328 bytes .../Hardsuits/Combat/hos.rsi/meta.json | 21 ++++-- .../Hardsuits/Combat/hos.rsi/segment.png | Bin 0 -> 399 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1242 bytes .../Hardsuits/Combat/medical.rsi/meta.json | 21 ++++-- .../Hardsuits/Combat/medical.rsi/segment.png | Bin 0 -> 372 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1316 bytes .../Hardsuits/Combat/officer.rsi/meta.json | 21 ++++-- .../Hardsuits/Combat/officer.rsi/segment.png | Bin 0 -> 399 bytes .../riot.rsi/equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1259 bytes .../Hardsuits/Combat/riot.rsi/meta.json | 21 ++++-- .../Hardsuits/Combat/riot.rsi/segment.png | Bin 0 -> 372 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1244 bytes .../Hardsuits/Combat/standard.rsi/meta.json | 21 ++++-- .../Hardsuits/Combat/standard.rsi/segment.png | Bin 0 -> 372 bytes .../Hardsuits/Combat/warden.rsi/bottom.png | Bin 0 -> 1093 bytes .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1333 bytes .../Hardsuits/Combat/warden.rsi/meta.json | 21 ++++-- .../Hardsuits/Combat/warden.rsi/segment.png | Bin 0 -> 399 bytes error.txt | Bin 1698876 -> 0 bytes 78 files changed, 424 insertions(+), 299 deletions(-) rename Content.Client/{Nyanotrasen => DeltaV}/Lamiae/ClientLamiaVisuals.cs (93%) rename Content.Client/{Nyanotrasen => DeltaV}/Lamiae/LamiaSegmentVisualsComponent.cs (67%) rename Content.Server/{Nyanotrasen => DeltaV}/Lamiae/LamiaSystem.cs (98%) rename Content.Shared/{Nyanotrasen => DeltaV}/Lamiae/LamiaComponent.cs (95%) rename Content.Shared/{Nyanotrasen => DeltaV}/Lamiae/LamiaSegmentComponent.cs (95%) rename Content.Shared/{Nyanotrasen => DeltaV}/Lamiae/LamiaSegmentVisuals.cs (80%) rename Content.Shared/{Nyanotrasen => DeltaV}/Lamiae/SharedLamiaeSystem.cs (80%) rename Resources/Prototypes/{Nyanotrasen => DeltaV}/Entities/Mobs/Customization/Markings/lamia.yml (100%) rename Resources/Prototypes/{Nyanotrasen => DeltaV}/Entities/Mobs/Customization/Markings/lamiasegment.yml (100%) rename Resources/Prototypes/{Nyanotrasen => DeltaV}/Entities/Mobs/Player/lamia.yml (100%) rename Resources/Prototypes/{Nyanotrasen => DeltaV}/Entities/Mobs/Species/lamia.yml (98%) rename Resources/Prototypes/{Nyanotrasen => DeltaV}/Entities/Objects/Specific/Species/lamia.yml (98%) rename Resources/Prototypes/{Nyanotrasen => DeltaV}/InventoryTemplates/lamia_inventory_template.yml (100%) rename Resources/Prototypes/{Nyanotrasen => DeltaV}/Species/lamia.yml (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/atmos_firesuit.rsi/bottom.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/atmos_firesuit.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/atmos_firesuit.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/bombsuit.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/bombsuit.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/eva.rsi/bottom.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/eva.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/eva.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/eva_emergency.rsi/bottom.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/eva_emergency.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/eva_emergency.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/eva_prisoner.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/eva_prisoner.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/eva_syndicate.rsi/bottom.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/eva_syndicate.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/eva_syndicate.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/fire.rsi/bottom.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/fire.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/fire.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/rad.rsi/bottom.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/rad.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/rad.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/spaceninja.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/spaceninja.rsi/segment.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/advanced.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/advanced.rsi/segment.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/corpsman.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/corpsman.rsi/segment.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/hos.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/hos.rsi/segment.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/medical.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/medical.rsi/segment.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/officer.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/officer.rsi/segment.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/riot.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/riot.rsi/segment.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/standard.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/standard.rsi/segment.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/warden.rsi/bottom.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/warden.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/warden.rsi/segment.png delete mode 100644 error.txt diff --git a/Content.Client/Nyanotrasen/Lamiae/ClientLamiaVisuals.cs b/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs similarity index 93% rename from Content.Client/Nyanotrasen/Lamiae/ClientLamiaVisuals.cs rename to Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs index a9510fe6daf..00a9f798f71 100644 --- a/Content.Client/Nyanotrasen/Lamiae/ClientLamiaVisuals.cs +++ b/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs @@ -1,8 +1,8 @@ using Robust.Client.GameObjects; using System.Numerics; -using Content.Shared.Nyanotrasen.Lamiae; +using Content.Shared.DeltaV.Lamiae; -namespace Content.Client.Nyanotrasen.Lamiae; +namespace Content.Client.DeltaV.Lamiae; public sealed class ClientLamiaVisualSystem : VisualizerSystem { diff --git a/Content.Client/Nyanotrasen/Lamiae/LamiaSegmentVisualsComponent.cs b/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs similarity index 67% rename from Content.Client/Nyanotrasen/Lamiae/LamiaSegmentVisualsComponent.cs rename to Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs index d9ae96881dc..b74529e2873 100644 --- a/Content.Client/Nyanotrasen/Lamiae/LamiaSegmentVisualsComponent.cs +++ b/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Client.Nyanotrasen.Lamiae; +namespace Content.Client.DeltaV.Lamiae; [RegisterComponent] public sealed partial class LamiaSegmentVisualsComponent : Component diff --git a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs b/Content.Server/DeltaV/Lamiae/LamiaSystem.cs similarity index 98% rename from Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs rename to Content.Server/DeltaV/Lamiae/LamiaSystem.cs index 6aa420e3cc3..ee4a763773f 100644 --- a/Content.Server/Nyanotrasen/Lamiae/LamiaSystem.cs +++ b/Content.Server/DeltaV/Lamiae/LamiaSystem.cs @@ -15,9 +15,9 @@ using Robust.Shared.Physics.Systems; using Robust.Shared.Physics.Components; using System.Numerics; -using Content.Shared.Nyanotrasen.Lamiae; +using Content.Shared.DeltaV.Lamiae; -namespace Content.Server.Nyanotrasen.Lamiae +namespace Content.Server.DeltaV.Lamiae { public sealed partial class LamiaSystem : EntitySystem { @@ -200,7 +200,7 @@ public void SpawnSegments(EntityUid uid, LamiaComponent component) private EntityUid AddSegment(EntityUid uid, EntityUid lamia, LamiaComponent lamiaComponent, int segmentNumber) { - LamiaSegmentComponent segmentComponent = new(); + EnsureComp(uid, out var segmentComponent); segmentComponent.MaxSegments = lamiaComponent.NumberOfSegments; segmentComponent.BulletPassover = lamiaComponent.BulletPassover; segmentComponent.Lamia = lamia; @@ -232,7 +232,6 @@ private EntityUid AddSegment(EntityUid uid, EntityUid lamia, LamiaComponent lami segmentComponent.Owner = segment; segmentComponent.SegmentNumber = segmentNumber; - EntityManager.AddComponent(segment, segmentComponent, true); _segments.Enqueue((segmentComponent, lamia)); lamiaComponent.Segments.Add(segmentComponent.Owner); diff --git a/Content.Server/Teleportation/PortalSystem.cs b/Content.Server/Teleportation/PortalSystem.cs index 7707c9f2659..a328573fc9c 100644 --- a/Content.Server/Teleportation/PortalSystem.cs +++ b/Content.Server/Teleportation/PortalSystem.cs @@ -1,9 +1,9 @@ -using Content.Server.Nyanotrasen.Lamiae; //DeltaV +using Content.Server.DeltaV.Lamiae; //DeltaV using Content.Shared.Administration.Logs; using Content.Shared.Database; using Content.Shared.Ghost; using Content.Shared.Mind.Components; -using Content.Shared.Nyanotrasen.Lamiae; //DeltaV +using Content.Shared.DeltaV.Lamiae; //DeltaV using Content.Shared.Teleportation.Systems; using Robust.Shared.Map; diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs b/Content.Shared/DeltaV/Lamiae/LamiaComponent.cs similarity index 95% rename from Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs rename to Content.Shared/DeltaV/Lamiae/LamiaComponent.cs index c68b5fe8274..4aadc196046 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaComponent.cs +++ b/Content.Shared/DeltaV/Lamiae/LamiaComponent.cs @@ -1,7 +1,7 @@ -namespace Content.Shared.Nyanotrasen.Lamiae +namespace Content.Shared.DeltaV.Lamiae { /// - /// Controls initialization of the multisegmented lamia species. + /// Controls initialization of any Multi-segmented entity /// [RegisterComponent] public sealed partial class LamiaComponent : Component diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs b/Content.Shared/DeltaV/Lamiae/LamiaSegmentComponent.cs similarity index 95% rename from Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs rename to Content.Shared/DeltaV/Lamiae/LamiaSegmentComponent.cs index 29f339b4f11..9e54c1340bc 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentComponent.cs +++ b/Content.Shared/DeltaV/Lamiae/LamiaSegmentComponent.cs @@ -1,6 +1,6 @@ using Robust.Shared.GameStates; -namespace Content.Shared.Nyanotrasen.Lamiae +namespace Content.Shared.DeltaV.Lamiae { /// /// Lamia segment diff --git a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs b/Content.Shared/DeltaV/Lamiae/LamiaSegmentVisuals.cs similarity index 80% rename from Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs rename to Content.Shared/DeltaV/Lamiae/LamiaSegmentVisuals.cs index 4636cd031a0..7de06db4e32 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/LamiaSegmentVisuals.cs +++ b/Content.Shared/DeltaV/Lamiae/LamiaSegmentVisuals.cs @@ -1,6 +1,6 @@ using Robust.Shared.Serialization; -namespace Content.Shared.Nyanotrasen.Lamiae +namespace Content.Shared.DeltaV.Lamiae { [Serializable, NetSerializable] public enum LamiaSegmentVisualLayers diff --git a/Content.Shared/Nyanotrasen/Lamiae/SharedLamiaeSystem.cs b/Content.Shared/DeltaV/Lamiae/SharedLamiaeSystem.cs similarity index 80% rename from Content.Shared/Nyanotrasen/Lamiae/SharedLamiaeSystem.cs rename to Content.Shared/DeltaV/Lamiae/SharedLamiaeSystem.cs index 01eb1909a00..bea990d37cb 100644 --- a/Content.Shared/Nyanotrasen/Lamiae/SharedLamiaeSystem.cs +++ b/Content.Shared/DeltaV/Lamiae/SharedLamiaeSystem.cs @@ -1,4 +1,4 @@ -namespace Content.Shared.Nyanotrasen.Lamiae; +namespace Content.Shared.DeltaV.Lamiae; public sealed class SegmentSpawnedEvent : EntityEventArgs { diff --git a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs index 342ad4516b9..247ac93c219 100644 --- a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs +++ b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs @@ -1,6 +1,6 @@ using System.Linq; using Content.Shared.Ghost; -using Content.Shared.Nyanotrasen.Lamiae; //DeltaV +using Content.Shared.DeltaV.Lamiae; //DeltaV using Content.Shared.Popups; using Content.Shared.Projectiles; using Content.Shared.Pulling; diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamia.yml similarity index 100% rename from Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamia.yml rename to Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamia.yml diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamiasegment.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamiasegment.yml similarity index 100% rename from Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/lamiasegment.yml rename to Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamiasegment.yml diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/lamia.yml similarity index 100% rename from Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/lamia.yml rename to Resources/Prototypes/DeltaV/Entities/Mobs/Player/lamia.yml diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml similarity index 98% rename from Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml rename to Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml index eeb7a9bc256..992c3d7e7b1 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml @@ -195,7 +195,7 @@ shape: !type:PhysShapeCircle radius: 0.35 - density: 2000 #Density is not final, adjust accordingly if the number of tail segments is reduced or increased + density: 400 #Density is not final, adjust accordingly if the number of tail segments is reduced or increased restitution: 0.0 mask: - MobMask diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml similarity index 98% rename from Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml rename to Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml index 7af53abc7bf..f050fa78d64 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml @@ -28,6 +28,7 @@ - type: Tag tags: - HideContextMenu + - type: Pullable - type: entity id: LamiaSegment diff --git a/Resources/Prototypes/Nyanotrasen/InventoryTemplates/lamia_inventory_template.yml b/Resources/Prototypes/DeltaV/InventoryTemplates/lamia_inventory_template.yml similarity index 100% rename from Resources/Prototypes/Nyanotrasen/InventoryTemplates/lamia_inventory_template.yml rename to Resources/Prototypes/DeltaV/InventoryTemplates/lamia_inventory_template.yml diff --git a/Resources/Prototypes/Nyanotrasen/Species/lamia.yml b/Resources/Prototypes/DeltaV/Species/lamia.yml similarity index 100% rename from Resources/Prototypes/Nyanotrasen/Species/lamia.yml rename to Resources/Prototypes/DeltaV/Species/lamia.yml diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi/equipped-OUTERCLOTHING-lamia.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi/equipped-OUTERCLOTHING-lamia.png new file mode 100644 index 0000000000000000000000000000000000000000..c7344388fb17595ddda71bf4242937aec2753663 GIT binary patch literal 2058 zcmV+l2=(`gP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2cJnqK~#8N?VAs1 zRaG3v&omvIn>O3bZ8EW1n>uJEiId1@qG=k1DQFQ=k|9V+Mk%ABBGgJK5d@<`q>K!S z{%MLiA<`^s{h6t&Y%8a^vE^pUTI{vYdGGgjyuSDDx$nK}MBf(VT0b!z1JT`4oF(*T=Z8ld^V`7=wE6b)5vr#n>M zkX&`>m*XmMqtg5fp6v3(-!GiIV*lIAg4tOERY`uP8j_Q(Mh+huWZ)#q)N`G7;Vvn~ z>PIRg{4)5Cf4X!&=7!=3KkdR@tYBpT2KmAM4%O9Ep}O+E)pZP75}=;zw4=SQOc5~l zJ9}Cp{4)6bS)WCWApEqWeYmSDTn(`L*=51|W>$s%-g;bHIXeq$J5!JKd#(f8(@z(Y z084E8q{`qOw^e8k?mwXI7FBsoi#l`moGN%USLc+e59!NPw5OkQ2}gsg0e(Kxs4YCY ztXP-Np8HoVUvyHJCyp=IIc4erW!lp(72rNRMT}5X(V%j&vsBBmGdia%gQp$s zZTaJF7)+(Yg1nx=b*j^6&g$v@^wKudkiaGYuCDt_Emq=~Sn>LmL}A{o)53 z)zv*~jWP}hIc4g(PMP-fO9i;kk+#8lV|)Jb4!z+nU-XxL^1+=!ox@E%*J($4TmHBk z1g{dD3YsQq^SoD&jWZGp=5K*S z_)Yz>;JOD0MwgXnQb-{C{>ZdQGDXqO5BSAzZ2&wgEdA-;ae7ZML7954r^*9#!Y_Vn z1Aw&~hpWK&ed?}B2Q{fAspGnz@Ppse9w06*kk=j%VsV-M+5^1u+w1{x4PXKR>`QM4aFMjKWd}zSCDjGIemrYO4tiu6W@p}AsZz7Nn9pYj~n>Mgv;Vgf=vy)fQF; zU>XsN=Zh;uP9Q`+Px*_Gec^)B3ACXRt+ue90mR|3Zr$M~osKoMs-yLP=x=lq7bHO8 zC&nIIsX5>hUNoRZbfFQgwy<9UqjGdUc}!5J>6KUMvVf-|YtS#$jascaoU;urq6>&t z8+e)l60MCE`sS%zEJWi%lSG75J_C52m{xUu6C^UbVY5FGAro^SeoQ}NxZpHlYC@~6 zGvsLoa6XU^pYrkZ{>l0J`#j&}IVV7%(oaW;d&2=2oN%K7h%PkxvIh{0CpcMiG~{q_ z27m*LtVe_pp&=sdH{?u$1V+$+7Bry^jcB!nwE=#A?{*z|6*M-r>aVdJjFMwBc!_>P zIN*dE4QLUd5v{hcHh=^jn~t|=cT@fbMaB8LjdRdLxT!PM9H`Py0U@$a_zigA zgBSj2x&XRmImCkN3~;-F39KzgWBr@~EK9GtV$FcK29S`n99EQwtP|pe;fPFl!2cz{ z|0Hw9`XWLcOOtKL+*+_1k~T?`iOnaAXhsk{ oz($j2(WW5;eKB}Ja(a~d9~i|#F_vZ+_W%F@07*qoM6N<$f;?&6Y5)KL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi/meta.json index f6a942a8956..a52fc0259ec 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi/meta.json @@ -1,13 +1,12 @@ - { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Original by Emisse, modified by EmoGarbage404", + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Original by Emisse, modified by EmoGarbage404, lamia & segment by @noctyrnal", - "size": { - "x": 32, - "y": 32 - }, + "size": { + "x": 32, + "y": 32 + }, "states": [ { "name": "icon" @@ -27,6 +26,13 @@ { "name": "equipped-OUTERCLOTHING-harpy", "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-lamia", + "directions": 4 + }, + { + "name": "segment" } ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi/segment.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..68fc755c56d0ec73a44b5b40719ea2bb5a9c4866 GIT binary patch literal 513 zcmV+c0{;DpP)OW9$@8GO!1)-aD6V1|QP!L7hgoL_0mo^d+d;vv=JP6#E%RA@eToRrl zgy1jN*q^#500}?>kN_kA2|xmn0Q?7l@wf-feD1qDoYHxGk=BcqfSJ#U30>p3;*y`9 zj6BB`mkC`15N19ntr;tUg?WRWEt}R&iG$rHe((l>rlx4!lsMXNa(ZUPkwlTb6>k)m z#LkwDAG{3>i;@1?Vl(WWo>^Qp+lq{?^ayV69L_IS(9{&?mn*#X+_3lBb0fXmJ4aSl zK7rBvH8suNwiB8G6jxhlYKoKkEPgPc=lOIVU!)R<4FI62X@C&qq&^FP9}EC~4`5V} zKt8XY=ZCc{fb>_ew`l-iOr@Ed$pY~3)CY*{o#%n9BoHHkOjZ}wvK2ynwMOQ(hK<|z zel~$>*-~l^TdXfza6drTR6IWbh}2itHr28vWgZLQu-*oilv=|U0PD*iKOD~wxVp9( zzLz$K7$X44WOV=vhDq1yL=F}VQvv8Y9RS?EC#CrgXWp$CB|mF!00000NkvXXu0mjf DvY*&g literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/atmos_firesuit.rsi/bottom.png b/Resources/Textures/Clothing/OuterClothing/Suits/atmos_firesuit.rsi/bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..8ad4b108c2dde31303f938ddc6d5b3b0d6bb54eb GIT binary patch literal 1036 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|WCu zPZ!6KiaBp*?ajXJAaP87s=}S4W;2##OkB_*m!cuUBzQVNPB3l6W0yk*~-3F;#hOG=)TNv>QrnN;iaP@3d(l_8eSNYIx zDvyS9gVwZEMuwc*e&0%W$1*g$|9$GOs9A%d*izQ}H*X$%^k|We5>tYPcHn{1yWF?u z`lT=0$90}@T54kHQr6qs5@)4-Vq~~%l6c!JEIjI@;4HJVX~t3U+3^xJJ+F5~#AhGg zq_gzRjPi6n^_0u+P(Y^jY>9~F1%OFn6x~jcZHBWaRID0KG>*uN!x$;Zm-miPD zG-rXmD)X+pdaJH#u{AULTt0H~Vqj4C`s;;NRaT8GTYoSZ$nXWOziueOGwJ;$bw`F5 z-+z1leDj9KQ9yyC>B=u7AYZweze&L`(L%;gWd8=nUN>eZ4h9LyEqioZ92Q>;5DOG= z=4gytZ!To~@7>ob0jC2%Uvci(z!)7JtdSMuTghA77^nkJXfZ2>W^05AMrcC z{b$>XKl;!kdgnJbjitv8r~U4~&V54i;n}ligMuF)s9a{D_j})b73bM!)As1EJ6{_d z^I~nmEeA%Gm7iw#EiX=GJCXUxfM@cS$et`YL; z+)(l1b$0HZ+4PozQ*%JD&Xz^GcoK5v()Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2O3F4K~#8N?V4|B zl~o+a&)Qfs?CP4$M&g9zE|s)ESSfM|Lnts1`a>@yFneQvEMNF$;tSbcWMEm%H(3x8 zQ3Spa45Wx5S_7dpRCY1kq*ziNLKInQ~{^L&55 z-*e8n=RW7CgoK2IgoOVuH9`8XA(P4Eg6u8y^z?Z9<8?ziozAtiw3HOWu))DWmCa^j z3#vGejtzE!ZxEa-<2>oQb?elH3m0@5Vq({Z{2JSaOb8CYHLG>+WFa9 zRX_OqjDlddJo1f=jXGafSEo~$oSf9@$jC@hUGic2cLZr!Z~|vK?(fj&ix)4}sp&jO zIrYT(Y9r2>&V!trtd_Q_YPj^~A=L>g5i%pCcPv|J%Na;7akY0hj@R$J^?i^(z|o@B<5S z;*4!XXJ==S%m3!?+7;xc#U*Gz{(RZnc|r66Z5%fpwUO)C051BWW5C^W>I=>Y2;nqG zcXxMDOQ0V0xvv`V92e(->(ryZtA6O);VqET{9U0Nz)ar0fWE0M!8XUDOP4O`)C>?d zxafzr03I^Bs7>b)=V)(lFC0KB*MR!fa2|LLvr(qw0zYr{_4S3roGVa|`mXw+0RX1L zILF9J3qkc8vdCV^u6isJMDCau$eDs~7B$Ejud*;CO!&h%gt5b)k=Lajd zO;3TNjQr&&r*9KQ-`PlvpsD|rS*_3c4{rV^2PQhECRsH?_+7MDXD3{SVE_go9-?(u@rBbP)l=3M0UICCP zC@>8j8ynMyU|x>{o{zKh=g-#xN1K#$%A@Ez2cW5`NsW(>>%8eS$T`=k7Y8(Jo)01Gb1=zBomx)Zj<6<14JWYePPgrdIfMEmy9dRXO`ZEIUG2{<3WY zmsa2$01+?;8!2N~2zz(rL+O`Wx5pBIXAbVqi3a&^!mR16%^&H3r}uqUOg(bBSuUv6sg6;|ao(QtmV;?&=2^dS#TRVyv4?3glnX*=0N9kUdh>HZNo7tQ`a<>hoQO35 zuq3lK=VKF_CL#x*p`k&oTD2-DxfQy=@bIwCvql$J|2M%d)&`-uxw&K)5Kf;yU2)Mg zGytRop|!PDmz82*U_hr)R%fFiF9yQw!X}6m05F44i7=sRQcatjj1@tmZHkJ3w1C-g zUNCI}+b&m|oDCL1Fq_@&a9*&30Adfg*yL@r83^HaI4{i19;N;P^u3X0T)Oa$00000 LNkvXXu0mjfgnF|P literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/atmos_firesuit.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Suits/atmos_firesuit.rsi/meta.json index d0d17fbfba6..46f6488836e 100644 --- a/Resources/Textures/Clothing/OuterClothing/Suits/atmos_firesuit.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Suits/atmos_firesuit.rsi/meta.json @@ -1,26 +1,33 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation https://github.com/tgstation/tgstation/blob/master/icons/mob/clothing/suit.dmi", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation https://github.com/tgstation/tgstation/blob/master/icons/mob/clothing/suit.dmi. lamia & segment by @noctyrnal", + "size": { + "x": 32, + "y": 32 }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-lamia", + "directions": 4 + }, + { + "name": "segment" + } + ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/atmos_firesuit.rsi/segment.png b/Resources/Textures/Clothing/OuterClothing/Suits/atmos_firesuit.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..3a2b136ebd9afd13587f40c8404abd1d853c3cb8 GIT binary patch literal 457 zcmV;)0XF`LP)I<&z+$hvN=PC82phX=ELAN1 z0hadqH>}d7Ng*MS>Y8J%;-%PFU6LwAV65&?P~4M%%?=Fg$Lu=~`!Q@wMEFlT_}ADU?zGD5YwkFbo-uMm<+uXMi+Km)2VDZ^l2y+~16`){>^_(pA^_ z2&(OWV@LM%QjedUYi7@{03=tZLce@?y^}6nt zWm!GL{R3oKb_B59ZUMd|uG-aH6}wk}BuU=$Jii4n#t=mjK@iaCbcmves_^7_ew!r8 zyQ?lD;_O;$M5HGoL#?%Zb`cqhNKb2B#X0#04rJJyFKPx#1ZP1_K>z@;j|==^1poj5Ay7D0)RXyuB{zNhbBUbBz*o6ufQuH z=mmnn#sesQad5K;mr~+?G)oWoEa>@DAjFbWtu^HmM^Pv*==nAbWhrSDq_X6@LdZ)t zo{`)4_^m|(h%rhCrCt?weuYQC^T#075@KBVgeAsMYBKu)_zX_~@Y(Supga-aKm?tK z!g%`x&o==Mw+S%33C#E=P?K|z=}s7omjH;s^X&{Uw{OI?UoSk@zw-%)lRpGPE+VYA zpkuQiz{aZm7E*A06DaDyEvQ4e3uMXB9f@=_dlMkfanMZDky%fOwJ6U{j(48$L>MC; zX6Z5J-8d)7BQhyvv-BAAK7!^jiD1Zg0&)p@4QA;v=Dh%kBp@Tq(qqhb0^A^2rvfA1 zjU|!UK$6)kJy;4Sx$Jo_pn0U3WR?qBqS;*GqtPuc8+1^I3*CRNexr>?81TKoAMgsi z0)qc6@T0KF00X`gkOrdg^xE_WUgRPjhD{ZILe-2~#3u?6=u@0M?*tOnJyY1?nunB4*qWI4r2ZKJfw8S*!YAXIH0?ho$)1OPrb zn#l`fA#r%egPh0g79&w@r3{Y002ovPDHLkV1k@wTPgqm literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/bombsuit.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Suits/bombsuit.rsi/meta.json index 659ed1dddfd..226fa5109fa 100644 --- a/Resources/Textures/Clothing/OuterClothing/Suits/bombsuit.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Suits/bombsuit.rsi/meta.json @@ -1,26 +1,33 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from cev-eris at commit https://github.com/discordia-space/CEV-Eris/commit/760f0be7af33a31f5a08a3291864e91539d0ebb7", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from cev-eris at commit https://github.com/discordia-space/CEV-Eris/commit/760f0be7af33a31f5a08a3291864e91539d0ebb7. lamia & segment by @noctyrnal", + "size": { + "x": 32, + "y": 32 }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "segment" + } + ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/bombsuit.rsi/segment.png b/Resources/Textures/Clothing/OuterClothing/Suits/bombsuit.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..bc07da7e782249ad432221865d0a0694afb7024b GIT binary patch literal 445 zcmV;u0Yd(XP)lIvB7?=7+I z6q!s~Igg?(LhPti^SC*O$KlM^(<@LcUNN749Q2L}Z4;Ku*Ah?+7)4tE z* zr;B4q#hkaZHfG&+kU3^Q^%v_d8TLcR@&hjM7_tQ$lw@vB`7&v(V#yk_vvS6>CQVxE zY*STeBh}@)q0L0(6T>klg)LuLZB{r}pNibNba%+7{a3y_ZYY`b_3xLT?~1P751XWN zBi(i}+k$DF4N?tJY7AKnSu+_{Fs?{tT7XyZ{7S}>C%e|2V)j{m|Gjp6uy%tMLrG~- z5z{$Kh6lg@+Q!MrFfc6AIFw;>Y2UmehIOyi-iB$Lo?+_vd;6yiV?yR+jTLvZ8jJfh zx-OY*JZtH``|6>$HS0=!pIR;mTz`0P-3i;{d+Qt)$6aR%xcdC`X_p_x=Pt)7fZ*DQ%@d=G#_+09v>O{Gy5!Kph#j-;jDM*?G1NKR|kmx zi(*VU9)B&QZulwde;@#4j>`upD*9Ztt*a~vt$voZESj&LzY}`?KGd(w zZe4H8qVwRR+G7j9|4+(}MW|*stQI|b#D3L7PKXvKLl37L^ z{y#x`1&XFs{j2u zdX6a|F_2TSoa2P~|5qOb!rOl)+<*7(lfOn__&MpNpQkx8TrZuRt0;1gvA3#r?QHRx zZ=Fsn1SAPLEA@M43W+>^6(1Dovy-u69y`Co+A#0iPd=4ws%i`q zyuUBZ9m?W&Px>%Z43=JbHaYAXc#lzIJNXp$PNLae7?g4Z{0Z$ zxyUd#M6C_`dG@s3p>pBruheFq1KOy85}Sb4q9e015=1761SM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/eva.rsi/equipped-OUTERCLOTHING-lamia.png b/Resources/Textures/Clothing/OuterClothing/Suits/eva.rsi/equipped-OUTERCLOTHING-lamia.png new file mode 100644 index 0000000000000000000000000000000000000000..b0e720f3beef87009cc2bc17a0fa83bcc560d4b2 GIT binary patch literal 902 zcmV;119|+3P)Px#1ZP1_K>z@;j|==^1poj5LQqUpMVXkG+1S{%v$M?1%zAoy<>locJzy|ch8ka) zAbG_!G&Dj&LRnc^vL7EGAhIYZC^9fGCnqOGL_`-C7d<^a0000cWYqBh000(rQchF< z|NsC0|NsC0|NsC0|NsC0|NsC000Gj#7%(Vw&e`3cy)(AT4WEf}8m8?Z^#;5FEDe}U z{xT!zWSud_*~V8FL}ZOO7T+?`s_!3wIoJsv(PYCcV_E~h0_G4rWRau^9m2>j01Cl4 zvJQXv4B=eG(60aw-{B747?f%*fa?3!7r-36BlB_luzZj+ry_QrOW;HM0w9aJ%x$?@ zK2Wc1Q`r3i(0&Er^%%b(V8Izzx*MY1uNf-80AgHY1>iiM0PxA&JTf#lOUf?~5k8sE z<AVsQd#U8E^n!$av8`rM!xErF56^3fPd;p?IDT!ky$bI-+}> ze*hLdsQQ|4byoHr7Lsdy1(pTD#((6)>Z%xi20D~i`YEd z8o&{docGl6TfkrF4R`}s{~5qL0AuB%BX&=_hX#O_6)q7<%tuJmHZ_3fqxqh?niA&Y zC$%Lg0JZ?!y2k{b&mFYcJ!k;t<{!?>=0KGDJ9l|~2L-?$z`#ZO9RXnF5M4u)!5n7t z*dUAmusk7XkO85oCi3X-!x9$nDXnn?pp|0EfNvRU^qm1IB5VLiaFWL+fqrDD(GOwo z;L+ugrwl<20G%Ns13SvVA_F84M}WtJcM;Pxjh;bZFQvyr)o=iKs>i?gQ@h2hns=9@ z4nhTBJ{D<~%BqzLse}@Y`RKd5hJa1Q6hZ}XcA~)}fUru6%7Z!phh6|Af^`BspXhqr z*`cS5UByAX3*aD$s`WmfFralUR!0bus2X%Uu$}O7ekG`&0{|25>-jqYF-MRBWW+D? c&oSHf2Z`Shmk{&VL;wH)07*qoM6N<$g8T)OfdBvi literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/eva.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Suits/eva.rsi/meta.json index 86e27c9c1f7..80f2d7019f0 100644 --- a/Resources/Textures/Clothing/OuterClothing/Suits/eva.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Suits/eva.rsi/meta.json @@ -1,30 +1,37 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Sprites by Flareguy & cboyjet, heavily edited from space suit sprites found in https://github.com/tgstation/tgstation/commit/fb2d71495bfe81446159ef528534193d09dd8d34", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprites by Flareguy & cboyjet, heavily edited from space suit sprites found in https://github.com/tgstation/tgstation/commit/fb2d71495bfe81446159ef528534193d09dd8d34. lamia & segment by @noctyrnal", + "size": { + "x": 32, + "y": 32 }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-OUTERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-monkey", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-lamia", + "directions": 4 + }, + { + "name": "segment" + } + ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/eva.rsi/segment.png b/Resources/Textures/Clothing/OuterClothing/Suits/eva.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..5a21938ecac206e3b9cee8254ab5cd90dbfdde24 GIT binary patch literal 419 zcmV;U0bKrxP)3j``!=V8XLR11pQ8WaLqCjg6K$d0Q4k7!g zHdde>7Q~(jA)Lga{jWHv3u&zzYb*W}ChC#J${r zSG-`Vhl$(jPNk*%t-&)4ll31+rhHyvFu%p%vHg4V`RQqU>-?vrc2-~0&SS{4WZuEJ z<0;Prwg=OU8>Abe&oST?{JQHsx1Lht&#D>Ud%8Vl#6;XUvfb!_NP>s3U5kUm)o)hp zi#FW4=k-8y`~GjKx6jc=BzSe)=yiz0dPeb2ghx>MKwsYm#FcopS^efxc+s!gy`>;m#^Si>9 ze4&n9jv0@m*D^+Pvh*+hRbI{Y!nv4(SMdI+hHrne*?Bn*h;j?2*Q|ct;BRktt$3X+ zJM*e<{3{h7abLcZFiAyKP?3X);Xv8$wclUn26-*Xy!AW2QN`1XVTO-d`r~{vX@(75 z`6&*QR1PGTsxI1m+%vM*T}kNl(@RqhdUSgve0}yel1;Sw*Z195nNT+=kgq3|ilpPSN*MTErGJYgw3rSsv3MyV3AJ zwEX}51;m6oQtXuHH-uKntbN2BsxM#`f4N(6)8Sp4UT*YLoPMAt*6bdK_PVm)nv#1( z^U6#9Y&d*gKXlTjSosEN$pWRkW^MZ=YP)=1m^i$z39mh%_`{dSAkon9;UdPW=YO}~ zO>hleSSZZwQwdZO!+a~%aQc@i`y=?-0`<<$2w}6_KVhYD6w7tyXMfg*#`}o#{?Jl- zApW2-?(VYX%Wr#L*n2}cI`!{_(t^tRJ#Mq-?F!E^mSKvavUp+VQP5) zyObeT%RgR(l|kY3CP%F!=L{JwPNyEa@>5}npI+CZz$puwR@5>)sJ!=J?)Aqjb}ZlF zliyKT7O|60X6|*xn)~nfYCM{hwpp@kQAQ8TTy_KLUN^QQg^NGDxx!hxKu5Zc_r>Jr Z@+o}vC9HFneFx?z22WQ%mvv4FO#pa}f~f!i literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/eva_emergency.rsi/equipped-OUTERCLOTHING-lamia.png b/Resources/Textures/Clothing/OuterClothing/Suits/eva_emergency.rsi/equipped-OUTERCLOTHING-lamia.png new file mode 100644 index 0000000000000000000000000000000000000000..c606944fb0ccbdaae5d62d8d4614c9e2a0e008be GIT binary patch literal 941 zcmV;e15*5nP)Px#1ZP1_K>z@;j|==^1poj5NKi~vMS6OA!BYU;X8^oQ0G2!e%*@RGegMo^0OjT7 z&RhT*Uzs3z#mr&=G&D3qLPA+tS+_|5nV6U|Ffb=4Cq+a=7Z(>jJv{&b0AccE7XSbN z7<5ujQ~&?}|NsC0|NsC0|NsC0|NsC0|NsC00L>FF>Hq)$32;bRa{vGi!TxRaP64w$k6vop;WfV64L#w@Hz&;p^6~0B5|12Wju^nc!mI-vG{p zVF)4IkmE2Q4Q}5AKUCiczXD)-OyL%-^U;_S0DffON}mB3z(f}@LV#)I5JkcdthH zQw88W9RS52!+0Of*!Wu}DJx|@r_UP>t5ia;BGL0^mhPfKml~Y?VG5nEF+Ti zH^73VcBNzg)yG}b^cbaI0n_4OQb5oSS4U0DLt~BLeG2*^d;!q3R0%NXE}-vMz%n_! z4MoA7`(OGypu8_-gwu<#s_#nxrbu%%;R4Y0B_Q(%`2x`O1%TE{&h&GBh@_O*ZyvG) zV0{#IRzVR5w6*|HKq?1cpG4--mH>)?_`Ii%-vWN2H{cB*{a*k!2&kKpuR0~Bcagq#RD~}H%Aq@b7^BER0^oWTiNGxfQU9oX`%&BhRQ(P8 zTzyp6uWF=UF~knQ9VjIn<@X8z3v`MT-T0pY$^~o?t^lxtTjRLtFol$7?1iT5DNG@_ zIj8;X0a+?G!U@J8TY!KWxH#Pcpu)>UQ`z%sy0H_QJ8N{m$ zA~HY%=?d_C&NDWm8s)t!XUUuA=Tod^aSzaS&{Vom|GRql;!@O3r~vdYwHwmhbdm_E zgbjfHsJp8!0gH&)2o*rtu`X@_L_22IcB6K{t{(s#K{^0lFH}9M?9hwb&Y~dN1yB%2 z)tmTw!GLn!td0=GQ8lOnnDAr&N)SOi04Cg@`>zDV>_Gxh5P#`^j9HdHj>RdTJL54I P00000NkvXXu0mjfkwT&H literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/eva_emergency.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Suits/eva_emergency.rsi/meta.json index b2c50fc4c67..3efd510e89e 100644 --- a/Resources/Textures/Clothing/OuterClothing/Suits/eva_emergency.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Suits/eva_emergency.rsi/meta.json @@ -1,26 +1,33 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Sprites by Flareguy & cboyjet, heavily edited from space suit sprites found in https://github.com/tgstation/tgstation/commit/fb2d71495bfe81446159ef528534193d09dd8d34", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprites by Flareguy & cboyjet, heavily edited from space suit sprites found in https://github.com/tgstation/tgstation/commit/fb2d71495bfe81446159ef528534193d09dd8d34. lamia & segment by @noctyrnal", + "size": { + "x": 32, + "y": 32 }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-lamia", + "directions": 4 + }, + { + "name": "segment" + } + ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/eva_emergency.rsi/segment.png b/Resources/Textures/Clothing/OuterClothing/Suits/eva_emergency.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..b2cf94d4cfc2ec3dc3361fa083bef55530139ac4 GIT binary patch literal 409 zcmV;K0cQS*P)_jMbyY(xVGuzX$TW)j}rr^g96k7S5FfXZH1hj z1MS97<|DoYUIi{a_YEq+a%HdSCIj92gDr)7#@B)X#zUL#ZVz;QSBiSCM-B$?u%5yi zo-Y?^6JB7T$Y$AH$+341m^}G))0$ng*b^7O|gSmgQla5Zl$p33SbYxO-Y_ zFL4O}6|1h0i1d6X{u|`K0m`!6LhOr(2wLkOaUc5z>dSfC>Ln_a00000NkvXXu0mjf DfKRPm literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/eva_prisoner.rsi/equipped-OUTERCLOTHING-lamia.png b/Resources/Textures/Clothing/OuterClothing/Suits/eva_prisoner.rsi/equipped-OUTERCLOTHING-lamia.png new file mode 100644 index 0000000000000000000000000000000000000000..c5f1a4d41a8a98854693acbec63baf5630b90a47 GIT binary patch literal 903 zcmV;219<$2P)Px#1ZP1_K>z@;j|==^1poj5KTu3mMV34O!BYU;X8^oQ0L)kb{(b<*001B$AR1qp zAbG_!G&D_3O+rFKSy@?ndU`T2FefJ`MMOjw7Z*J}JpcdzZjy3!0000LbW%=J|NsC0 z|NsC0|NsC0|NsC0|NsC004v#j>Hq)$32;bRa{vGi!Th6A~tBg23d<>BU%MX{>edpuxEY!8kXFKWP7K8S7aSSBWwteyZzd z08ED|OrVd>+8dzfO9KN~XBDe`5FI`=(TDa6U^MnI zKPFr#vH^fk-vO@5KLJZvg7q^JW;>$2TmbA#g_SS&5aSv{m{H;!0@^VghUoAg9u?Y0 z<)5IqZW~u%QNgyYQR1h%egUj8C(wh$Pf>`M5lQ=bsq*mM4 zfK^6VJAkII+O$^Il|Jq-krbo&)l1d@tPfUW6|f|swskeM-uaT}o5;M{^>op{-yLfB zHQ+Dw0ek?Y{|ms*kA2h0Q$yt9m>^Fq{Xl;?lrYNkO}sI``A5R$3t2aH2;)TEA-!?x zCc_;OByth;cSn{)pwgrQs6Re?02-eOsszhz#mA*@?Wd`S3~Sfy`1JEXX+n1{qP;05-!C9dE{ zLY02Ff`tF}v`7e20F$sYL;zf`0tWyJh)MU7J7k{El;|MZIV)q5?By^KX$%K3_W*>kv#;Hum0IE)utGbC!%%XFi1yJ+`AQ_|!VBfLp z(asL-61$6%=oCOnl9fl>cNoyRo>oIhlB}Fm$~_2g`)7hmQuE!(ec%5eAg3fL03&|s df6aNl{s6w^0st}I<_Q1*002ovPDHLkV1f#viZlQK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/eva_prisoner.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Suits/eva_prisoner.rsi/meta.json index e164425199e..c5ab73194f4 100644 --- a/Resources/Textures/Clothing/OuterClothing/Suits/eva_prisoner.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Suits/eva_prisoner.rsi/meta.json @@ -1,30 +1,37 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Sprites by Flareguy & cboyjet, heavily edited from space suit sprites found in https://github.com/tgstation/tgstation/commit/fb2d71495bfe81446159ef528534193d09dd8d34, monkey derivative made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprites by Flareguy & cboyjet, heavily edited from space suit sprites found in https://github.com/tgstation/tgstation/commit/fb2d71495bfe81446159ef528534193d09dd8d34, monkey derivative made by brainfood1183 (github) for ss14. lamia & segment by @noctyrnal", + "size": { + "x": 32, + "y": 32 }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-OUTERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-monkey", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-lamia", + "directions": 4 + }, + { + "name": "segment" + } + ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/eva_prisoner.rsi/segment.png b/Resources/Textures/Clothing/OuterClothing/Suits/eva_prisoner.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab04aee9919bf27efa710928fe911422381a692 GIT binary patch literal 369 zcmV-%0gnEOP)GjT-{4ZULn*6kB%zA|VE@5i66H`JX6Spz+>wOS`+NdI2Z^1)u;FfC5ke z3P1q>?sGplcIK}k(!37obEe4|N{^lKtw7hVvB9nW;J|4fL{!%mZdu0H^TOE@DAwn&XNDkPiosiFvb*V47p0?e1X#32Ra<3!tvz z3Ix$$0mfbQ$Zh~{=L4MK{ow>$SK#IA06@nnIcM^3*!R5$5D}WD0bm?QfXG)}wr{Q7 zw+UIg+6RHH1(5JgM3TfI|0*_HAyti@gZOWd{|2zu{y< zr;B4q#hkZMhW@u5Bx>80UBxnwL})JT6?i$xl>0Ah=rq36g!ZNNZBv)Nk)5@W`&Iu5 zDaEN=tXx6IPpE8CIvUgdW1al5jqjW0uJ5Q8>iRhM-QMbb?}dKOoe=a$HMu#O!F&$m z9i|-*c^-%z;7w=P&X8xpyo0siu;c;V2I+GQd5m`o*b2BGv>7+Rlm=>69XRa8y8LtH z#lx#M`o<-2N!MvJ`>;;QJhc3nn$_>m3uz9`@vzcEW?o7qY&A|2M6CFRSv4#XXqE=6u_IiPVqLZy66)@y=cR zM(DuYTG^sc(UKn){A*x0U2*HT#?n9DkGC5=IQ+W&$H(W(|NYleTl)6>d%ZO*1)sSu z=M*fzIw|!2@v_aF3_og%7vFxdH&WtJk%?A~LUr%iE_J`(13CpiC zF>o@3-jBbPFV@!ayW{ic;$U946PGt=Z9nUu=-8Q-xZ?jLrYohK6-yfH-fg>m?T#B; zOrKkn!!4Hd#Ew<(mv0kgUFBGK>HMnq+@VZn2KSi%i62?|VFk|=!6O>VHrC7y^=c}K z)|C%tN(HFI{rSy6RGfgLuU9<3A=IYt$V2ARxCPR#TUKi*%PzAJbQ0#V;a~pwXR|`f zoa7U>I*BO^GgsIMGRf!Xf82Y~LA>Me$)iqI()XqPAFT{nn86<;?NoYHb0f>9!-wun zU-U&&zNUKW&F`=O$!=ICny|>#_324br-_*ibN}2n{~D7Rew}fH8ne&WCo?BRGu_pQ z(lMWONYDBH=SjaEH6<$Ks@STmqNNX5oU$=V+`=w#z07mD^QC|*b(15Rv?eVx42iN? zCvZGCX==+cHmz0uO1{#aXTr1?86A#2T&}htrE9|x7YotMSt8qJpIx$S>Ffn3`4#6L zTV`A874r4(r*p>zG~|SRD_&h!;8ZF-z9nUv+v98v#*kY1%?33gT%A)jK7F|{N8sX; iliy1H_GQ@CGfv4o_4L7|(s{tl#^CAd=d#Wzp$PzC#+CyB literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/eva_syndicate.rsi/equipped-OUTERCLOTHING-lamia.png b/Resources/Textures/Clothing/OuterClothing/Suits/eva_syndicate.rsi/equipped-OUTERCLOTHING-lamia.png new file mode 100644 index 0000000000000000000000000000000000000000..5331e68d1c535132ce8d0128a288f32485abc02f GIT binary patch literal 919 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0#2l#}zN=Qg(YHEgsg=J=DCNVQ_mE)Vnz);S|{Xl?8FI?o^8s7DNT_z?b zk*sVQ8X9Vgwu7Mn>Y|;!aLZ+JQoM=kq>&`V?q3)A7hu zASGK8pZP?R)*XzMh=Z3C|b3O?@V#knw~+k)vq)-^KSD%o|h~W99j3xo>@!pMLu3 z;`^5)lp!(8{{e7irx{~ur28EOI- zet4|%>$t_M+aFTb9iA?Gy#0B_l=_18wzX1(&4f8RZ~XY9V${ElC4lY7{_IshR3GSnVcWyFKcrDaM*pOtOqWlI}%M zUXai_#f(At#f7?Ph6q04n`~#!yIOwvF6O|0Zsk+U?F`>`p7UnVkW)`D-eA z=SyQ{#5l8_1uTsGD^s^KH8xPaeF2lfVwRAEXwis}2Bv3f3_+)^h_4b@o5-79=)sin zBH#J_L2ibfQ>JoqHhjFZ_u@ZkA3^Cc&I zWjY|agju2F-i3V^>nzKz-J9ne^=4wGkfTI%T*>pOASRd3SARqWu^r$M-6z$*WP*~O l5(DGMPrsHJrQiO?z!s2iE&jV~7BB%bc)I$ztaD0e0ss(>gxmlC literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/eva_syndicate.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Suits/eva_syndicate.rsi/meta.json index e164425199e..c5ab73194f4 100644 --- a/Resources/Textures/Clothing/OuterClothing/Suits/eva_syndicate.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Suits/eva_syndicate.rsi/meta.json @@ -1,30 +1,37 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Sprites by Flareguy & cboyjet, heavily edited from space suit sprites found in https://github.com/tgstation/tgstation/commit/fb2d71495bfe81446159ef528534193d09dd8d34, monkey derivative made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprites by Flareguy & cboyjet, heavily edited from space suit sprites found in https://github.com/tgstation/tgstation/commit/fb2d71495bfe81446159ef528534193d09dd8d34, monkey derivative made by brainfood1183 (github) for ss14. lamia & segment by @noctyrnal", + "size": { + "x": 32, + "y": 32 }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-OUTERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-monkey", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-lamia", + "directions": 4 + }, + { + "name": "segment" + } + ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/eva_syndicate.rsi/segment.png b/Resources/Textures/Clothing/OuterClothing/Suits/eva_syndicate.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..1a6df55d0509e8227d431f51fa338b7659a8fb36 GIT binary patch literal 434 zcmV;j0ZsmiP);3mb{xoa1NlEw;-CA1!arsoh7QysiOOP70a@ZRI{{=d9;2`9AH?9%pjs%`-+ zfCaDs7Qg~n01IFN0JrD^UDy5Z5-IMNOXGT?$fdOFy1E_5Tpau~ZZKPA@nE)M=s1NS z3U#0z$297aQ9d~f8OaI&4G9Eck&@P0DwslLS548C2yXeKfp*Pgi}l7RJ`PQM&eNXS1j^Eky2}ZDxUfq1sMB&2Ju@YQi_u2 c{mGly7pvxwi5dYNr~m)}07*qoM6N<$f;?QbrT_o{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/fire.rsi/bottom.png b/Resources/Textures/Clothing/OuterClothing/Suits/fire.rsi/bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..a197cde57bb1403765e0e5db8fb6b413499573db GIT binary patch literal 975 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|RrT zr;B4q#hkaZ?6Yq>NF0+FEw1R|mFp6_tE6;7Oe1B@!s7P2R;TGgzgTy%eiGf4^6t*U z3pd+znw(AuSv*#}lw=cms-z{MG{fKa^rn*ZHTy2y;crr%Tl2p7{NIU-zwcS3@nKG- zqi%y#I>T0mtT~KVm{t_B1#mAoCh34zu<8m^PRF7XPgs|!w-~Iue5yf@<;J7mb_@y} zO`oD>En{dnnv@tjezK-khnoh~Yt`_C^Js!)rhPtl1YHdn~)*{qG$X z^OZQ5433?$XGrK#9fQGlpp+_ zo>}?!>h9z}f6TPc-><9bJ(|R*c;ukFL+l@|-$%BaIq=q-ekr|V^7alx?XS?l%K{DN zGktnqZH;1?-L(2st(em6A3Ymy{gi7{Y*KKLIUaWT!l?!m-@=lT7M;@vBo6=mTN`O6 z!}syShlJp{rmNbozcy_+uk~!g)w1k)YRkt{{AOE%T&(0KCS#<*4A4YHS?Y? z<$V2hS5LmxA4YCwx5a`>rZ8-{nDIBptMg(;ip(7$f3MD`MLPw9YxSmkduTrVz3=L; zgMD6;af)y35Fw~v^cJ*a}K-=TDE;&@8aKzUkDDId~(U@1VFehj#^2sqLSy6@TmY2Ts5Co>T z@{Ogl7;;`3UA>agAmFrgi7i9xs*w47EWOtsi+WCKD2}@>={76M-Qg&UgYhA?0QZ~{ fpQpP7_cMH}Ua9$g17{R4hcbA&`njxgN@xNA{k*zs literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/fire.rsi/equipped-OUTERCLOTHING-lamia.png b/Resources/Textures/Clothing/OuterClothing/Suits/fire.rsi/equipped-OUTERCLOTHING-lamia.png new file mode 100644 index 0000000000000000000000000000000000000000..979a4eb20e56d53ade735e8c56dfa1e7bcf44d43 GIT binary patch literal 1579 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 A?*IS* literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/advanced.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/advanced.rsi/meta.json index 4844e816bd1..cf10d74aedc 100644 --- a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/advanced.rsi/meta.json +++ b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/advanced.rsi/meta.json @@ -1,11 +1,11 @@ { - "version": 1, - "license": "CC0-1.0", - "copyright": "Original work by TJohnson.", - "size": { - "x": 32, - "y": 32 - }, + "version": 1, + "license": "CC0-1.0", + "copyright": "Original work by TJohnson. lamia & segment by @noctyrnal", + "size": { + "x": 32, + "y": 32 + }, "states": [ { "name": "icon" @@ -18,6 +18,10 @@ "name": "equipped-OUTERCLOTHING-harpy", "directions": 4 }, + { + "name": "equipped-OUTERCLOTHING-lamia", + "directions": 4 + }, { "name": "inhand-left", "directions": 4 @@ -25,6 +29,9 @@ { "name": "inhand-right", "directions": 4 + }, + { + "name": "segment" } ] } diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/advanced.rsi/segment.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/advanced.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..c97ab674f25fbabfbafb91deae76af681f51a629 GIT binary patch literal 372 zcmV-)0gL{LP)r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000*XNP)4Tx04UFuk-ba9Kp4iKen_QOI;bEbn4yY83q?U3rGj0mLtDYBOL9$GAxXm} zMT)E7;!to9UHlsS4|Ek=6$C*MMBLo{TBOAHnnH`{;2oFu$8&jJ?w$ku8J!t+FbNo@ z!?Wp>v{YD@LN5qo1R(@5AT!&V&&}oW=lHyXPt@Cl=!O4{o}y|qz}HPY#Vqa+&k$$U z9ZT>waX%}|MdCx^IHv;=UkP3D_*rnt<9ES4pPi+6B8?OzD5zo$IvgaZnv~h^zGTz4fC_mSeJ#|$$x%X?ym3;i)K#Ub zk*?CzQ4_iU%+uB;C%o>F6wvkLx^JUEXa{K2UH9wAbsNV(;1Rem+x`mWH2pz(y{*L# zfaoT0cG=dHUEq8R7<{l~E;pqBEx)D#uctt70qDB{!Yf`@t$m!_1NjYlqHADp9~h(m zqpRP^u4nP+sZ%rn002l(OjJcIE-)D#CJ+-DUuJS4Cp1k_S5O=su)WGJbhvLlL;#=2 zDKJ4~F*H~uC;+kGIz2-GkhTEm{{Wr;JU>G+H$p^5O)f4j0001lGZRJt000OtMQ`u$48t&v zc)q{2gyeVL|08mh|1f9*nt7hdOw^7SKL#%TMgbt@-z|KfD*#xMj9SS*V+LIN9{?g_ z4Fv#}WVKTezXjj}fXcrEkQdA`gvA?|TD7D{05Sus{l%cqPr@n_k@r|>MCJZn(jz(e zkR0Uj;wXbf18Ajx2OxdH zlpG*{L+O7=y6}Nn+P{-Rz*~x>(MtSrS=Jb1DuGmH0 zxBXTxzzZO%064je^+Y(-iSN>wVHIf4 zkSwM@@_n&>+WT&U+V`Aq8^;tYu-$zC&}wz|qur&|?*8yeOazc73v}=MNKq6#T;J4l z-E*okJPCjTc-d|1%PXrOD&HUo)hPgKh}k^BH->b%B3-WVjbS$5H>AGnD~SryP6)st t2pNwjR2ar=V#k`~(mIa61Nxg(?65002ovPDHLkV1o1PrE~xQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/hos.rsi/equipped-OUTERCLOTHING-lamia.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/hos.rsi/equipped-OUTERCLOTHING-lamia.png new file mode 100644 index 0000000000000000000000000000000000000000..7b79d271d540baae884704ef3dbda631b0863462 GIT binary patch literal 1328 zcmV-01<(44P)4Tx04UFuk-ba9Kp4iKen_QOI;bEbn4yY83q?U3rGj0mLtDYBOL9$GAxXm} zMT)E7;!to9UHlsS4|Ek=6$C*MMBLo{TBOAHnnH`{;2oFu$8&jJ?w$ku8J!t+FbNo@ z!?Wp>v{YD@LN5qo1R(@5AT!&V&&}oW=lHyXPt@Cl=!O4{o}y|qz}HPY#Vqa+&k$$U z9ZT>waX%}|MdCx^IHv;=UkP3D_*rnt<9ES4pPi+6B8?OzD5zo$IvgaZnv~h^zGTz4fC_mSeJ#|$$x%X?ym3;i)K#Ub zk*?CzQ4_iU%+uB;C%o>F6wvkLx^JUEXa{K2UH9wAbsNV(;1Rem+x`mWH2pz(y{*L# zfaoT0cG=dHUEq8R7<{l~E;pqBEx)D#uctt70qDB{!Yf`@t$m!_1NjYlqHADp9~h(m zqpRP^u4nP+sZ%rn002%Q_8JLozo)WHB^Q934bQP0EZn@9J1CE-nB70HN7J6#xJL z8gx=lQ~&?}|NsC0|NsC0|NsC0|NsC0|NsC0|Nj6KA^_R|000SaNLh0L01FWS01FWT ze`H^g0008tNklyo1&5QUptlemUiW1N}1|BLQvM5R?SQ?-9{s*<#v<_jPN zP0#<-8}J5*Dgc=hm~$$8YmBkl-(qrP1Yr!Kxk*WUZ>hfHH+9fJdysZVokIV64#N(Vhb5MQj6lo~Frr?i+x97H(#5mG8HTus9ds{!vr*2!x8kJ4}UL<)eDyF@R9L%l><^@H3i*v#eWRM_dbfK{jR3(1j&Yl9jE3KR`&oar^8 z4lkcqBsl#Km8k0+60VPv(8R08HpwwIQRaziD0*l%t zG)^=qdR%Wkii7hJNEwAP1lMe7ILP7RwMo}tI{>ck<{Bacizqcf1CVO~9Gou>Rn$+C zp*odck&Hgz59oL|X9c>EmD-^R$VC9wsR=+4nsZ8nsEV-#@diYt;V3bYQx|bnM0Xgt zJKKwhRg@L7_xncJ0?HTf&j3lO2;s&2O^#GeEtLB8$a0HQdXP*0000SN>wVHIf4 zkSwM@@_n&>+WT&U+V`Aq8^;tYu-$zC&}wz|qur&|?*8yeOazc73v}=MNKq6#T;J4l z-E*okJPCjTc-d|1%PXrOD&HUo)hPgKh}k^BH->b%B3-WVjbS$5H>AGnD~SryP6)st t2pNwjR2ar=V#k`~(mIa61Nxg(?65002ovPDHLkV1o1PrE~xQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/medical.rsi/equipped-OUTERCLOTHING-lamia.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/medical.rsi/equipped-OUTERCLOTHING-lamia.png new file mode 100644 index 0000000000000000000000000000000000000000..5cef9a52822e8761365c07c6ad090c6133b6b9b9 GIT binary patch literal 1242 zcmV<01SR{4P)4Tx04UFuk-ba9Kp4iKen_QOI;bEbn4yY83q?U3rGj0mLtDYBOL9$GAxXm} zMT)E7;!to9UHlsS4|Ek=6$C*MMBLo{TBOAHnnH`{;2oFu$8&jJ?w$ku8J!t+FbNo@ z!?Wp>v{YD@LN5qo1R(@5AT!&V&&}oW=lHyXPt@Cl=!O4{o}y|qz}HPY#Vqa+&k$$U z9ZT>waX%}|MdCx^IHv;=UkP3D_*rnt<9ES4pPi+6B8?OzD5zo$IvgaZnv~h^zGTz4fC_mSeJ#|$$x%X?ym3;i)K#Ub zk*?CzQ4_iU%+uB;C%o>F6wvkLx^JUEXa{K2UH9wAbsNV(;1Rem+x`mWH2pz(y{*L# zfaoT0cG=dHUEq8R7<{l~E;pqBEx)D#uctt70qDB{!Yf`@t$m!_1NjYlqHADp9~h(m zqpRP^u4nP+sZ%rn001^nOjJcIE-)D#CJ+-DUuJS4Cp1k_R{)>LDKJ4gJwpJo-~f=e z0O0O3>3ybNL!%!|DU~G zSpmsl+L^v)Ga*7NEk-y<^86#-0&fAr2^{9ND!fBVX^6bb8YLzCrUa|H0?6lK7;@xy zQ^q2LAOOd5p-}mZPvl=#;cGDCB392t3rx zzYCyzGd7Xd00Ct-{|j{K4HBN;mF5{&G4P}X`DIyFd;{;6DrM1qu$&5DkYy|@_&|FB z@KxbjKzRs^f%gKIfAv=)ej#AD&=ml;^3W4l3M#bV*cH$s_64T05oPKKOv_gASpx3` z=CWZQYCrFM!QPxNR0u0~$Jr<$_mQ$({Tf(9-eD-nw06yb7|}hVIpV zi?_gAfCvJ3bDMPoywuH7_!D#mHZVK81a>;3?2K?WUTON$PvHt4l4@`83f|QG_6iQV zLRIJppaW0nZfH*CX@I_k#)mP&SHYQ&gnS(``T`tNrXfAd1DsdD_Gg|3O5Lo0V-UxX zUOp8xpj$*VeH}jf0(Fk*3UEdcPJtZ-i~yjU;UU;MB!EBnX2lFjXNRsp9Re_gn4!ENMqK)@w0fsn*{a5or_ctQI zy;#F`gvnelyU?Oe zMSLk7(wE>uL%tJu<~(3&ZToIuF-K6i+)v{H5o4au|1?V5CHit@OaK4?07*qoM6N<$ Ef=lKs<^TWy literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/medical.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/medical.rsi/meta.json index 4844e816bd1..cf10d74aedc 100644 --- a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/medical.rsi/meta.json +++ b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/medical.rsi/meta.json @@ -1,11 +1,11 @@ { - "version": 1, - "license": "CC0-1.0", - "copyright": "Original work by TJohnson.", - "size": { - "x": 32, - "y": 32 - }, + "version": 1, + "license": "CC0-1.0", + "copyright": "Original work by TJohnson. lamia & segment by @noctyrnal", + "size": { + "x": 32, + "y": 32 + }, "states": [ { "name": "icon" @@ -18,6 +18,10 @@ "name": "equipped-OUTERCLOTHING-harpy", "directions": 4 }, + { + "name": "equipped-OUTERCLOTHING-lamia", + "directions": 4 + }, { "name": "inhand-left", "directions": 4 @@ -25,6 +29,9 @@ { "name": "inhand-right", "directions": 4 + }, + { + "name": "segment" } ] } diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/medical.rsi/segment.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/medical.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..c97ab674f25fbabfbafb91deae76af681f51a629 GIT binary patch literal 372 zcmV-)0gL{LP)r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW00005?GP)4Tx04UFuk-ba9Kp4iKen_QOI;bEbn4yY83q?U3rGj0mLtDYBOL9$GAxXm} zMT)E7;!to9UHlsS4|Ek=6$C*MMBLo{TBOAHnnH`{;2oFu$8&jJ?w$ku8J!t+FbNo@ z!?Wp>v{YD@LN5qo1R(@5AT!&V&&}oW=lHyXPt@Cl=!O4{o}y|qz}HPY#Vqa+&k$$U z9ZT>waX%}|MdCx^IHv;=UkP3D_*rnt<9ES4pPi+6B8?OzD5zo$IvgaZnv~h^zGTz4fC_mSeJ#|$$x%X?ym3;i)K#Ub zk*?CzQ4_iU%+uB;C%o>F6wvkLx^JUEXa{K2UH9wAbsNV(;1Rem+x`mWH2pz(y{*L# zfaoT0cG=dHUEq8R7<{l~E;pqBEx)D#uctt70qDB{!Yf`@t$m!_1NjYlqHADp9~h(m zqpRP^u4nP+sZ%rn002l(OjJcIE-(-i85tcWAty9nW^zqYS5O=sSS2VrJwq`*S}-?7 zZ#_iM%UUTgL1ZyB|NNfs>Q_8JLozo)L`O|9I#2KFSS~Iu0000N(Xo*L000Y55)8)J0qA2C@{8sAzWN<)prH(G1c`XwaGqzPAWn)recedl#RR_#9{y4}f; zwRW2DeZQRv$)DT@F5mbCKs4hb%*$dCQ3oJmvfllnU=baD3G{3T=L5iGW+_H1#qhoR zO94JV>s`;l;NCa{4}dloGeGeG_z-}q`~pB-CQx37zP(bbY$XD ztK`QSw0;FZ?P3k2hF1WZjq`GT;}-zgU@$#iJQ)$Ggl092|0Yg&n?j3W4p z0Bqye06AX(-6BZ(1t8zT5P(OtA!i6!85MGFdJJ@Xq_%_%$H# z9j#PZ@?QMY5-JPgcnjTehbzz7IQwj6jnOh=7m$m@=BB4f6$;nPQk`Iy(ZM*?emTV z^auk2O_N2!{j=^K>JUPYf%oDF5MQ|1LF+11;g@>$2rmG!c~D<@1ZroX=eTW+0O%dC zHR{m}q>V!BfF>aibdugd`ixN#r4N(lV+=s=piWI(oh&_oJcbd0+ywj7JT$R1378@E zdvjE93n}RxhJe%rgfYOU-e3TbRhF8FJkZIBi5%QV9;pFD8w~87qlF03goQwQ+YZ7J zP~3Qb21rUpDBtmX*yDu=5td>~D}(|_=STiafFwxX)&rt;d|m)t$`G9agx-LqLE!Hf zfbWSN>wVHIf4 zkSwM@@_n&>+WT&U+V`Aq8^;tYu-$zC&}wz|qur&|?*8yeOazc73v}=MNKq6#T;J4l z-E*okJPCjTc-d|1%PXrOD&HUo)hPgKh}k^BH->b%B3-WVjbS$5H>AGnD~SryP6)st t2pNwjR2ar=V#k`~(mIa61Nxg(?65002ovPDHLkV1o1PrE~xQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/riot.rsi/equipped-OUTERCLOTHING-lamia.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/riot.rsi/equipped-OUTERCLOTHING-lamia.png new file mode 100644 index 0000000000000000000000000000000000000000..454939d731a8152f30ab186d5f292cf28e09df18 GIT binary patch literal 1259 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/warden.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/warden.rsi/meta.json index 4844e816bd1..cf10d74aedc 100644 --- a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/warden.rsi/meta.json +++ b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/warden.rsi/meta.json @@ -1,11 +1,11 @@ { - "version": 1, - "license": "CC0-1.0", - "copyright": "Original work by TJohnson.", - "size": { - "x": 32, - "y": 32 - }, + "version": 1, + "license": "CC0-1.0", + "copyright": "Original work by TJohnson. lamia & segment by @noctyrnal", + "size": { + "x": 32, + "y": 32 + }, "states": [ { "name": "icon" @@ -18,6 +18,10 @@ "name": "equipped-OUTERCLOTHING-harpy", "directions": 4 }, + { + "name": "equipped-OUTERCLOTHING-lamia", + "directions": 4 + }, { "name": "inhand-left", "directions": 4 @@ -25,6 +29,9 @@ { "name": "inhand-right", "directions": 4 + }, + { + "name": "segment" } ] } diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/warden.rsi/segment.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/warden.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..481ab8594d04477c05ed6030bc1eb25584cc3658 GIT binary patch literal 399 zcmV;A0dW3_P)SN>wVHIf4 zkSwM@@_n&>+WT&U+V`Aq8^;tYu-$zC&}wz|qur&|?*8yeOazc73v}=MNKq6#T;J4l z-E*okJPCjTc-d|1%PXrOD&HUo)hPgKh}k^BH->b%B3-WVjbS$5H>AGnD~SryP6)st t2pNwjR2ar=V#k`~(mIa61Nxg(?65002ovPDHLkV1o1PrE~xQ literal 0 HcmV?d00001 diff --git a/error.txt b/error.txt deleted file mode 100644 index d62f8b58d6ac72df47bc0f13a75a03537e825419..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1698876 zcmeFaYjYb%vaXBI6EXjR-z>+T;Tn;;PE3r0mStPB$CkEbk5}x)i4zn_U2Ib1A}PyU zKmMHaK9wkS6}r)=Y62iYW++60K%=i&d3p2A%>VEI{ciMf^yTQo=-udObTHZ&{Wdxr zosG`*_sQtJ{=PeUINBUN(*Nzz|I%NNNB6bG!_jN~-qU*|ZCAg43&%Lr`_HxK!_imz*1K@LUA;aT?dvR#_5S8CBubd+2oB;p8m1^I@iB=CwWq5x~GS_ z8|T`JyY=5e&UnT5;+@OyC};FvOSpG0b-jCfR)>1Voa=?o9Era>x~IExuB&@L`gf4! z4V@9vccK4hl2EQNUS{>)4q1J?;~x~{w{ZnC-Fg_{W zUF)(rzg>NPrhA{hH+jyx`W|=LRzCZDqu1yS>cihIy??tS;{!T27fPY8`YZC{gjta*B?afh1o>5`_t zJ5eG%xwPc>?1|*)o$ed!i#y1wJCwEJ9ps7iYC3ThR^703A9DYO9cfa|^1b|1cXCf_ zm;1USt@ut_Z1wJH`z&{*fg4S@IqKSCx_;|ktL=SE-n*T#UB-@~)i&iN?MYi=Jyzka zO+UXrdBgWayHEf2p-*p>7>m1$aZ9(Qo^c{aL!bM#DWiD$vn!#`aO$!^ZD z%Nn)MddQt^j?v!VEKqws}x!?p3f`xx~ym=d0i0Sx1<> zr~i~DJdkZ;eZSZGFt0vZsMWZK{pZ+s&!YWrBKDtkz5f$**nzYd-c{fAPu{KPvf%6X}NJJ;^JmP^F6?@r#GNuMD9-dExN z>}gFeJ0_|-ukJenwr~+}_%83K|4JwCQ+{_}NMy6VafgJ`~KwJXg?ja zj^#l%h5WLru0v`fK2UdlZO_<{!fDqtc{lPqm&(;DN=ABq-EuMgdM2-Y@;*oZV43=K z`Z;u8UB6anu3++7^SeSkNd9b3K4i>nte)T9KFgAOGV4nF?@TIRo5I}pr5VTvl3B5g z;p*L|S?An+*Yf)`Yaf$$ZBlO2?=Mep^qocbRrh^k@){@aP-7*QcZKOW#MK@1Ytde$ z`hF6JPCuKxzR7#hUT@30&e`YE{XF~iVf%_E??HNhK^c#<&J9Cb-nFOaFzp$qXEyna z)6e>^?4_cc0_rHFs|{dG(W0mENi4J>Pg`eP`45;?i@SyslJY z$oU|#WIW()kfT_p2a}%5H0kX+!^tPwwaw&pPu{^Fbmga7v&L3gmSvvyJkzsjKhN~j z^tu+$(U`nzsZD@abs{YBQV9FY5EYU`IF5!AgRaV_db9z+(Z2+6d{btOj>z1{zB~dUBk*M9CCj|!xY!>NApJ9}@yQ2r!C~xUiG+AOK z)I0~5v}N!?`&UN#jQS<*g(UJo|6o3L$=bG|YXZklbj zyxm(Vc}v%XYqp!E+3sJfq~VLXMBOZjx=z3BsVWR!%T^LYxLjSoT*0S!qX_C^hOhrZ zKF&uyH;c%cZ>5$edj4D2>iJW(v?CcKMn3a+QgQjBtG@cZ{6*w_HfBov5DwG zFJK%yQgJgS>(Mnz78Pw&WKsdgx_K|0*w8nmju;c%%0UPu1vdwup%+oT$zi31iZQTZ{=UjDbs z%?*&7yGzzYsdv94S&#h$ET@`QA5ri5#yzm5bQ9^1E3dAdmYokzrR<5c>6v_an2S^i z;qNz9)nt$+KXnyuF+OACw_IATXuf3 z+={wJTYrtV>|A9kUEjzDgVXb)d^9R?42gBAT7Rj!PK=*S>Z$l_&Z}5XPs&9{k=KdY zzf=U-pc6kxSM5u>=)Ok>h7=$3=yCm{$LmGtCu^?V4z9Z$+*Yl}A~QZ|)e+i=Zg0jP z+6+FGp{#ElvA=f2{`=7jokP32$lk|-9)}JcbU39eh1DNzhRhJ0{KGNd`_8p8zwB&X zFI~4@`d;3xA=}h=QFGJJ{Q6qkP{EeV7WD&nRM)X=ls?r`_*eK-^k6u2J$3DR>V;~~ zb|g(djAL=4_580c8CrBDT7FE=L;o`F(SF@}hhe^$dsVS31cy$)BO= z9;#s%=^wQt(^U6-t8;xnj^w;vHg-x{y{fXSOWAc=xb{kL|7rd8)?(wje!b;BQ=B2P z8db0P^XT`)pU88!9@GaDmH(+9++`~li>T*EbPsD)Jgnu&*0K@y)CA?t=!5mi`5@$qc+oo1FsFd%puKfuFE2auoJt+@)sBPzf1>j|aOC0Ikq7)_ zW~1$f*pXMcO^OjCx@t>tV_%o02ioFM=(699yi*jhR8M5WII|DFq%J?l+pQ#4mlt7+q@W%-Z+tEBd{Srf>}p4v1LDW z_Bzu$^l5@2v7vp@yNR>qJ$gJ5b9*nQu8E0lU%FwS>ErJsUU`a-hKq(RW$4M{TBa;$%BPnWCa+g}9f zV)_r-j89Bfm~jXL8Yx3oVB0kE^_lk4XvOO|W9A;(yiDseh7`y3!DP$J@!SEE{nz@` zu8^npMt?EMGF~g!$g|{1mo-nZU%L7}UB&)AcD`uCGs&EFp|kA5v`@NL3%d7D$}9Bi z=ya`=?fs>m^+!oB^N)@`O`ro!sg?R%Yp40PX~%FmJ(Jd1m8ht%f{00xCqdugl{Q;8 z?{>-T2lGiVgp)V9)T-SW9>|alX%;fqHtn#7;j7GD|N~wEmvhmFQM_Ir5vS z!)N-3#>BSdcEP%>@wr(O`yMzw8D@p+wT zeUnY#3@7)~Z53S4ch8CLvplR2?B_4K$6bts_}NRz2%baNdfC!C_>+91tzv(uIcE2M z{~w)EJn|5oo_aEM$8z1iTDtv0ngz|tEOfj({LW@&DDOlTTjwQX|`X{#ErA}j7@)|f5>Im)?JY# zmbq)&w)D&+lI%KCes`8}4X)Q$Nw0UwMEN?pt9X*i-ubR1G%Ir;V9mlmyXZt=CUL$L zo9Vi$>snLGy&7L#H)(a<8-c6iEA``>P5j#>`MHk&NmlbfYYUtCmFy+nTZ1WK0ZLY0 z*Kyh_3~ap~2TEgxuH#(a^_UfAjd=vWD|`UomT3q!6@$qLCjrBV7=%R&c)euy>hl2W z=9T`Sbp_Uq@4usU7N>deF1-!m?DlWbUPCc23wrxth9>a1%3>{#tA?&P%le!Jbkw3M zVq%lsow1$xEm#kxkP_?s^eF>IG!~=XD79w4wtMZDORY;SsM2sdVbj<@2I&KZF*Xc{ zcq5U#OGg826E!!?N{Zi@u62zI?|Qd=haAr$TQe_D=X;@wcn0LisJkNDLjBl|v@Drb z)`l^+c1K_9Gu{DDgd>svoqNZ|&jF8xpVQBiNcC|0d2h^WE|HOVR4X3?@oSIb$v1DCz%16<7#vTh9zZ$If(#PRVd@h(~SXuIaG zpQYWvCZgBLbw#hzxGaw=yvnEHuAoIPmAOJ&7+Vltuc07(a;MXm1!??FXTo}l-5}cf zF(UMRSt{~KWYOE%cQWi~G&JFR{Y=l-kWJ4M4M7l6i7J<`ZCOfix0<*mePS+Q!+rVN zp~3EjJh^Kyw7$*$084O8@oL`L3)vUrxzo9idz-)0jwZUIg-2snb-DIyTSJc)O1dEE$@tY6@{7pFG-xVuZcC*jle>(Q+iMEZGW*l0pAtF0ul@afytuJ+!8zJH` zb{iZqiw5Ad(ZPcm^1Ro#GK^LHUO0)NE4EkTq{ZkXy}rqHm0oXtosO&2;wlZx9T_oP zFVlE23SI7Dq#=FGQG+>-B-|OF4G7|!0x7nf5OSB-VWj)?=yXVQT7$ghp4?F1 z?s4c;S7V1=ic++66*08sOA%Qyy7$x|BpxH&9uKZYBJ=E3NjB@Q?Ag7$Yplb5n2C@&|Z3WImn=skg~2-TgHqv$7oHNWJFtxXa8RL>Wsn7U_9erhqu2 zt!+!Q81Bg}-;-NAVFg$}N2*F~8htK-mgTRPY5E>m=A6zRXJRw7uPl$xr}V_NiY)t_np4-8 z!}R5%EitvGRGgMGOWYEhg_>kxtQ!toBU$r_UGe)211Xm_k6t}`jaDWi!m(&SxphzBI}#$5YZHrsw6cE?h#Zc33WhrXPcuC5;b-+tne*=~H)U^qR|DH(o6c z=|W!eXyu21!4R{t+Q4y*WzdhsJPeV_eOYz)FrSBe=XJtoq3;iUYObb1iGx91%Gsl? zL4VV#b%rTgtj#dp33uj9pTxS!1D6P|1`;`@Mb$9Z8yYw*0m+Ga6B{-OJU zZ`wpJkstX)xEtI|@(xG(yy1>JH`4AcPx>ld<90&#uKvlew#|zWUv$sh*dABQmt#iH z#;n;%`Gk!dr;tUCZCBU$eEt}FIsL@RZS#~$`qD&hZh8joJ>3a0+kx~t9c*m++3cfl zh`~$@dZ6{@@zOBuN0+&)%PD#HtqRWDtY^C!`Y9389y2d&=eJ$yr$~29xkS5+` zD|#=%`#v8_L|{PwH3;{{$Uv-B)Ph8q9ESEuIg5k1Ck4qR2rLtOLQ{h`QRy3}h z^AI86^TSt;^JeHib4OUsi8?sJXWI}mM3it8UcVUodPEf#FOZEfTMZ}kwR$ks#J29| zE!NNL>)F-heVeu3yqD*K?*&Gx!3w*z)hE<2v>DN%ZO9 z#llIf>2Fk41K*8bYzA#M8|9ruG0qb%pw+&k6{)gEL*|HvqrLM&d*>}_)&Z%!7P(B) zyxYP$YcoS?4fVjn9cV>^<%5@>eqv5P2%NoHbNy20w8se^Cy)m$j}uBIk*q*XC46ZV z@I;c&d>8ZmUylA;D*%=r6CL=uSCk%OsgNpdN$1pX(rLK{Pt7$?UN1FE`&>n4@*_D9Y#0x$&*QNti+|q8S9~v*8~UE$L;K8? z4_Z^qY-t#4?fH{wRGe3w`OKC1&Rm)8Y0+E7<3BnoaOd4?$39Y5Z1uxU_b2S}$*y&jX8+h6d+@U(T|>-gp6FG{8F?f-|46o^O5k~TmhZDVg19!e11bX7%#nSM5vIoo zHAvfoaUJncWH!gY9BISy5qreU?rE?jzpM<4qAwn(k(-Ah#&m>s*nFh*^XcX#H;=}0 zQ$7PFNA{`tW@^|XHBCH*`#|&efsp)T{cE`OKgvJG+y1C$y071`^r*M$^}+-11$dI`2JW-`~*{z6p1+21(l2{&)t>9RmAl`n%^9T<*Qh-+QTv zkgm#}^T--mH$9h6CNsNvGb8IQX-|CH8gIZOr0G7}`pHV}E#XD>^_2vHsjFl0x`EqR zH(;Jj8h4k)CR^ja2<7;2>I3B-qQ}}EYuD70_F;}g<++~E;_{3ac09^41?Py)mm`{L z%AD)`qwYT0f2&`HgOG09U`RyWHMwE@jMGq!xEBzf$#@>Gl22^AJLBKXSp@|$W+IXL zoA7tOH?r6lisSLi&a3(*5vyN*IxCN1=O4qS(vwSC`bm^4c**ovr5C2N4xDu`opo?k zcFRLWGIbivBbnP6$)sAUM1R?I#rqYAw9D0Pl&f-V7cUE4Q2@&BtO5+gzsIQTlhTr`lYwMt41`W?oFs z4KW9X8puoa8;zDS<&lA*m$1#sd()&xOwX%f%302A$XPfJf897dTF&N-I}Yz1Lgvld zB`Z$Ht@*Hash@$-i~d^%Yqzb_+nTP9-}^#5c6hZ+fjOVa0xs9l`_AB%Y#fSTO?T$S z^k}KA(b!Rk0A@Ur(T=`=^@hG%u^v*3n|mD2dUDp&;#f~z(tBUpypBO!qCq!>22jal zRX)tEjMJi@Yc)rfNVzVIld;Z|3I>}>gLUIm=2-X~n!|v>km$zEu z&h*v2dIU|CF<#)I<_>L)J{!;KrOMp+0A2&T$O!r>E5Rx(wkl$0UkS|&;_~>(SHklp zU`grh_4eHBr=N1-tVa4ylJOyHPCknM7MGoQ^6kI_Bi~e-BQJ~4Eee03qk~<>3JkJ0 zeLX;a($;kCXdj~s$+BaBu(rD!c%Eojo+y=G-Ir^X{M4wO47iJlz-^ia*>?vdQ zK;=`Q+E1TnoKJ__9OFDLVe7_9Oy#95VMFy8vtp^)a6RUe3)1;4UEQ&;8%+mg5TU-l z2KbL;B)#s;***Oky>j%A$fUN$EJtx1{kx6mAKtpxZG0uavpkQ9?|3_9#XD+WB~Q72 zalzKvkj^jl5O zpuML%I^w%=H=OdLZ>W|EtoT6p$I;S7prtA2Xf{szFxXk@vP{fRE=?|o8WAQ@p-ssy(3AKu^x?Ao(H;5q=U)l%7HUC^tY3=Y!OtQo7Ix-3ddRYh<#P^QZq`|DE)>hcSTUK;r$f=Dn%Pj)p4e6vi5&-2;NVlmmUUJl z!&7R*8lPv9qvI7@Ua?hf-y5v0E9;#`SV(xYH6HevdKRQxwDGwI#q#VvS@|=&X<3GE zqz%uzbzOTiI4D`1J;ceL(P6=NIW`$G7OqjguUJM52Fhe|Fz@nD`gZs)k&JaD_Z z>R4m0b$g=QA$qB)lJ)3iouiiz0i8dQZ%0lvUdcB?{7>ZFf&ahMs}G9e4?2Cl`vK+M zs_3tu?vDwb)E!t}l&Rwuy)@gWFt53pQ`mKmpNBI6ZQc-mX=l0-`0iwxnKu#dA+IN|nrWr< z+cM0WstfBIz!h!i*t5^bb8*9RaWN|IirxRIXM)6;jVJ%rtud{eHhR-zcdNunv59;o zf&(@y$!GFh)jRF8`}v*Eqxbx?7`KC6nqOMZ+j3sbP3@!G=tlDl-UV;q-ROVxJJ#my zeqsmY2&c_hCIf3(yvaS_X+){JKbE=j+VkAwe5!ph*ZE95gmkV`dCvElw9=kXTDrY* z=9|hW$9=kGy{cuMeD?E|9;>t279+6K`nvSk6QO@yT!pJOjhOh9d2a87U%d~JN#irb z%B$w{)T4+x1$n6JA(r|q`5x2Gw9(oP=|WqskJ2Ni=jFX{&x6b&1BdFrXgspr(Q`@3 zb#`S;<;CRlqwLW;oz<_IzZ<3Vo-7{x`U$-s?`A zTy05a_e=S|{W|O3xT3i{XW=^QrpAVOR;-Vs37(5}J_}JJQChTucZHZyBkv61MKW&t ztff7P)$;vwS+ZVs)4CD$$(H4@wkkXb zVY8l%D@G^tIce=@v|3($>M>!HrJ;*jQyHD=C}h^;H2OKu!>p4t>6Sg|vUJ;2c57!! zPdommR*X*{^C?k%xoykgAgPUSXYWmF!ha|yXgwaRv!u-=zE{E4h`w8j`ELqy{y2_n zXWQFT`3Pja=u&#Av-zMnVnb*CLfoYdy${O=%YCF*AH(bYz=5_775ESv$?^EcTkV1U zywR%-y|SuR_DWv`xKHP9%XNQVeX_s!Mt_zb>qm%@rzY=hb~=6TCUJ3#7eOQbw~li- z<_4wPHo9?sn$di=oHqlyhYY+5lAiY+e=1Gd$VTi=vZw72bk6Y5;L`DPUy=!%4i*|K z<|ycV$tHVHMB&-M5**fwO8G~qE+l~RY;Lnhuz%juqZ3D zrRI?=R1Ko*Qgd^q=0Ahiaw2_mCf@{x{9*7~PUI6`N(05ucl0?d#MjyaJ|b2Rxqw>) zmPRilFuMk$GrO37tLc1XdofmHzMpg-(f6Y+;!pZtUf1pR5|8!ULB9LC*~=z&?aI)b zB$zjS5TvxhMe@(0wB1uKwT|`H=gBVk;q0Cc^DtgG3z05 z?w7i+uN0rr`M-JHrNbTt9rn1Q!pn8o?a^V4?3Bq7tdH`%sY{YeQsbFLJNGE?h8|Q@ z&$}Gm9yv-8+!Sd{ZJYV{WSPE}9VAL35=gg*vSyQ0={Q}AczM)$bED4r%GSf+uP>qt zNX*>+Ah~|6x;Rkw(~zS8i9e9cQyq`gpO0A|eOZLa81deyi)3onM}t%?UVh@!ZU;ZT zMw+H+$JpV(^Gp#RT5h!w-pV@R{`Hbe?h)jU{1n;8i}5ry^V1^c5pD4Hm={&vN!qvo zhVN~TeD2kHNmG-xoTj1h-)cEZWDe*^UenQc+VPi(jYaF*pnqLVK63Z%D2I2y(+VTw z2!oX0?XA9WuE-#~xy~CT3jtr}VoIE0vRNKym`@kko$aRzC)g@v$zI^|(O2G!(k}~S*ZaJ^3;6`+{id4gg*3sb{=+LQ;RUg^@!Q}ho^{xd z=%-mdAGPhJSV^jba`eTSZr;VZ97kHFd^3BlRKB~cvNMOvn7G`#^@>~i80&2-{ZtdP zPGzT=9bkNte49qA{zZ`saZ5St(lO|A-LZahRu&)cNUDs*G(GB|=8U-Genn2!$=lg{9y%(_;{J z^MRu#S4K_pSY%o>VAQH7Mndi5?+if#z`jSoIaPu+bE0Qg=iiY8W>_% z#RbvIj^bhL`LVKAC$d-MD`Fh{IIv~B&;EwIF8ZM6TzFPhGx5UfXctvSI}bUwOkX*g zGfi_lPv@`FB$gkyIxgqwOvg;&=c7}pj!WYtqN^_h4#}t1LBFqhw|*|N_pVyyUhC6j z0`4fYim=OjW4oQoO|;8YbkN~~uGXFxc`hrw*k0u8hF4G5I`C4Ad5`CEBx&oGFRS;c z;o!G%4(~c~Q@c*ovQN=#ptqMH+F;s?;e=b`_@W$Dalee!dpyc{;{PR-(fzVR>9f)m zmtr>4WGZF666tkMmOzHV25b8NyRP)wxYX{JO4>c)&vb7up9kQQ=8`r{($HzdogQC! zd;zuzQ`=(dykldZ^<wL@SrMjfKqz#iaaNYYA z^9WqhT++HFZAab^81JR#M^Edu5~re+*LhF#_q;xrzHUB4pyB0Bla$8lmPn{|FRP0R zrXAU3)Md0hdX3!uo*@y|EMS-9uwM*54+igUB7ZJS_H(wD01yBoq@-f4eF%JexpG6Wql znYfT2@uR#pcpy}aBQw@ZB631zecmNOSH;%yjy`whhNtEGb-5WTH)MrlPiy#Qu@i~q z-ffM;RKxpXnjw8kj;3za=pE(-*VLGKf9u#^%lzEi6P-Q@_UuA7jk+f~fq~A$`@r&H z@vwK(KJU_5)Z35|D7Sj_UxBF&Dgx7KFX&K?zZvu>pK%UdwTxs5`lR;@oymq)jMcuK zhfD*!`8EPmyJbngD31L?J_EgZ$)uc5J?<-AJKbo?Ycuy-cZ+;U(*@XOoY9LC=A!H9 zalCLzH^X{9UAiQe&!4?K;l#|~}X zJIzzzSZzt2wsoU@?@C6tD>@{(_I2*|d}JG4K{R6cSi82)a5VHI{xTX1k0Sj}mmYo` zx|Wp3n$zVu?Hk-R%NpHU67!X7*Yt?#dD*-!)8+8+(mo`mXW{YQka#a;y5${8ev&+b zgn-he&nlHk)Bj)@FC@1h7JVMX1Njd4508qo1JB0uDJE;!K{qbd=bK(kvCnar-(Uy_ z^UyDXEHmpOZr_E6luL4Y2JJoF(GfwHklpg5ZwQStRLai7>t$dn46T=0yfjm-Uzh9Z zm%muG4<5->^`i;=4>|K*+=h~ZES_q$oG3T=@6jJee~|6G?%J|CU)CZb^9|4z=kgS0 zd$Zuo?#((%wrrFv^%MHMfo8kYfRcd$ryj$m)+rtySOfXuri;&AWl@+?y9kZCqhsys ze9)eUI%;zTFage`XaA+&;CpPbrPWyO3Ha=*Mb5s8SZkUyHgvYh6;I-`JK-tsY1#qx z+}+zneBeQlIp!mmGFD15Ynx-g6|We)D46XkUit+F$=R?npi0HADHgf=()?FciY}$8lmLhb`7|?er2C#BPOrWfJ`l*FF<(> zZCg9FBVgBn#3?pK1vK$c9>_(=c<}z}c70m31~h4_nOHDe1KJj3d!nB7xuz~_cf@zM zDz)-{id2HbVLcgrs}*}B?~2t*jPi5v;@&Dw026(upV6ngBW?hwJ@1s;%->r3+0c>M z$DZ~V`N^BkV$u_NB|Tb;1NKc^NquRvmT_yMz%v~$-GVGN>=1N#SF~E*70T^qId=h% zVx8<}f3LAro`y?YoL5jj39?M$x^d-ANjv$K(wH^kAm<4q^E2%OJ_Y+>{haA9@|}^R zImx1MefRCk>N}evUc<33lfIv|($8c;55jax>|eC3SCPDaIdgPmHLWUKNf46z6?j}% z?CF#AZsR1qd05#ffsZTj5SPH)Q$4hJKMx5cZhatJt~4j%66g|0ywv6xHu72?+rlp} zZi{#DTuudw$GSPXvMr9FOCYt+%c_BL3Ctys9>!SVtqMP|EZ&{uq721ZUW(5G77d@J zedN>^rjtg)e@Sz~|DhQ<+)$CDtW&9`!4Y=NP$H z4Kg<$Kl8qHEZl?plG)NoC)TMPhy1`xX}@#*vwA<{7QUChGA;T+4GS;Z!&bQAMM^+CCKn7Z1K`YOk?b;^886^D|3sQRx(AI98$GZ zo-t03n4Xu{PLW@_jwyeOm)VD7n_iQ3NoB)j)@QC^BO~L?`uRg zSpLI|O*-v6kym{$^a|Kk3{`5`f0Xq-lVzP`-Wb=pk!oY?Ka(wv=WyrKD|nHw*Mi14SXT$!C*YZsm%12pvxGn zGHPG=xv%p_Dv9IIb*)E%8@ds${6Ozh2e=<9Y5Kc<5w~-;kz4z(8M#sV_#CJT)o($eA+Hyb-&pgPvR!nHq;JAx&8W>`HJ@^pl-^bLa!a+~8v)zKu9^jnohh)X z^lCfQ7W~AsWkrA%ZH(O74Y78_2UhFS_+ePK{Fxd{!Tgj1`5g9C$@Nk7Th4ZH-Gj9H zblt0Bj*afgC9_;|nLfE)!Buq0b;+GaZl;mk$yg$OlD^+)TJRWZJc1Ch4nfViR! z-K8cgKkbY>3K|jx{ip6YXb_x-{cxA*nFs3jM$ce(6hEi-nF@l}!SAykm6P#NDj{h5 zAGJSv34IKe)9JUzJO9=Dn0ZuG)5k2z@+!#s{ov!&;P|sA4^U4Vt9~4PYVtFt zVOFcJ*(%8*`TH$lp`|$`>kJUP0(7zD%{z#hr1LO+10R)qvRQcR&~_*Ec>i5T$9IUc zD|l^l4)6)U>iI7Cxp6na+g^|UF5jm-&mU1$JNMN7v5Foql0C_hn#`O|A__6n%2lQ)Z{PPCJi+Qc z%URH_ac^!XnIY0gFX_{Og+(rWiQHM0=d64xUHcz}eClVJWOw<6IdjMvQeMB;rSr{q znAEVT)=Xs!U!$KPbypHfCJuf;sn41otvimPv+7B!FEkmB^t(htP3{6~-;MQ_$Nwke z?vU0~4o<>H#aEyLT~j^NJLQPL5JaF$-=mm^rwn3PFpof=~hu|$4(CAQIaF(Hybe@8gEl~ zLa)v8Y`1%xH?y~Jm&QWt=F_P0GQn7WQJ#;gG59a-t)iZKIIgRl&7QQ1wa+^D^_6^B zIL(*Bbo$WeewLZnw$;xOv3cz8b^pQ8h@e2_QNoxtl-PM) z>&Bl+C8kV*s9z-}E%$D|40zz-7z<>E0upQZINHiOBwb8Q1Z+A-^=lQd;}ZYLDtyYf z{7z@cxqhYp{BG+}+v5x6zTh6gusxr;RpjKBBis97EvI)Y@7v;hTdSV=MtA-~nDY>{ zdy%|GD$>YIyf3WUp^~8{FIOVTKIafEv!2+Z#SEr(jwMOtS@7@vIeM;tPsW-ieiD5; zx}(==XGaV{q`h7p*}94@y-HTadINi$OD5|?e#8gKqv5hwe=6(dk+yN?X&Q=q(~gVt zxMwmNj(Re(vdU}Cr=7*7o>>|JxBWys)Dmy9+&4^*n4VYTGY>xt=S>XpB-?g6f9EIp zs4!HT8J#hXnvK3heruV>=e4V*IrG{UTlcG$g#f>c9-L{j^qnr5sm++V%&-op)px98 zWROZoiOd+vTT_?pGIQHy=Fym&S6<8RGIP^prWP5d(-^&A=Y>_iHD9SACcV2*Qp<%ca(te>a!;XSv|ivKsP3H`fd4z^3<2)Ot)Wr0V>xewWw!x(vAt9e=W%Om#6W zRKrVg8FCrQWyt)m8U)&9=;q2$O=p#MWSiT%Y1#cP**-LvBP@=vT(>8GKS-i;o1EJ; zoFTU*RwtEU_rwq`#pK+Ex($s{Vs3NGY$yl>9a`Lmx(%I&4c!q^K|U9mWZvVc{#)G| z+yP!QPl8z~)9_crw<>Bo zsEa$+*)Xl=)u)=vFEpj^-#RKh%D(;@mKC5Q-(&}?{MgRN9LC2qY^=V=&$grnem!U~)<3gtf7koS8oF$nK6+f;H_vM(8>UUUE_Ig7bIIYM zDiW}$FsBv~b+vP}eHMEthI3CA92;J)g{Pf`S75SRk`JO)dpbo}Uj9t#V_~ypmX7=tysOQ|1-H6-UIi7}V<+?AbxZUX)wD)vJM|`K+ zfB5F*N8eC1f)98wMk2gRaBY|1WlQvfkSDrVF+Z{`E1U9S=r}?gIvamFm2{x>4<%Wb zLAIDVy`$LnnSR^E=sm4SDnUN#ojrL&``Vg0)P{>~B*)_$HmCT5WRH0e=mKH|_DVfF z`oSmg4eM01Y-xNL5Q|3@`6idf;eCj>cUTRx9jjltd_B^*U7;JXsitq31#u?*(Xfe%aFXI7Bfu97pSRINke;-PWT= zOGN*AqKXlDY}W{uW1VJO=`4aLnxYck8Sd)b{bkD_Jnh;#mDy7GQgU~p2*={8JgVuI zKcbAdz02aiM}HjsK|21gie#_5iVLrvp1x`P{66^l&AUiMGw&_N%1mvdXJ<`Db2^ru zMys*kevC_hEQ))d>KdBJ;DcfUEa{&9AL!Mo{?qG@pZkhSkjOLrbuMjr6mlAD%N85@ zoS1|dgFJeA&iS1{Bl4XO`bj)vdqw+h=si3B^l#&jH5C@|nr(G>TwNPiM_+dlIK1_d zD`9=49j)`MKrT65USqlf+E>%&ip1419rO3z*z>RDpUm5&dXtC;T+8)`}0hC3XKH2Ah+0y>3dNUDH--z+9AU`BA*32wT_)< z7ugZna;-Z-vfn8l!ghC8FWSUhs$ff3REZROH)OO*%*m_|+5}27Bs=*iAnHW-rBdYC z$(xy-G~0c39v_j^JbPTZttY0#4?9$h?W~XM=nm7hDlF=;nAy6{M@$HAIuZ1=ygWEo zZI4nSuD)El1(Nh0(wx%>56FuFIKH>Q1!VzNEO2_n93DaMM zOu@*k!J=l%)MOUvUy|rJU2scSzUPdnI$XWp^4*n7(_*3Awwecc8rY7Y22p1{7<+f+ zy&-6{s3ByV+JN_AhD?L=6o=iPG8A|Q8<4QLbSDK7at`gCF8?sGQ$YV?P z^jFln_e1`^rn7pQ&CWG@Iy)%JWy)N~nwMmH%00>Si0OGX`K)Md$k`q0|3&aAO3uO= zc0(9;(|iEK6uPsc@Jdbt3hV&&Q}`T_Ur(H31tQFVxqB&*5JG%mCd~-pKaC!)mye#Dq^|8SJz46Dr-# z0!x(0F?u4~W2UQn%GB1TUcJv&8CG{U-BYg9*7rkCDfk2K!4P3OM{s>Pg7aDvj~q)@ z!~@#l9?ZIXFfhbpcgqyxN_`f*nP$7wz;2+jCEbR~LF?PlwPo~kz@Y!6n0WD-W3FYg zs@1c}tC#Jo%VfaBrn=$qljmGsITNRm=lxQjN@}T^I1|^vvf3a!Z{+Qi;&kmksLehd zeY-yNjcO{8hMHbGj=nkic9YRJP&ey8RuIui*PLJpKq&pi(=4?k6o*WKVKYFIo zR?NF{D?Qd>$jA-L0>0Gwf+w<%b`~=C#M5J@KK*~F7XaDN=IZl~8{`%}e>e~3t#x3f z;(*wx`73`;mL-fmw#%z<(`TCRF=Z?`N8(VDJ}(wEF$a6gb*5>L)ymU-6EqvK4AZo& zP6;XeNu4H`3ya?4)8@0Mij?0anvm%!K1JI*Y%H7C*vRHE$tB`La?59@OxL77|NZ(q z2i+c>i?(&i^{z(P>E&|Cuc~w7y!Z0B$#pJz?RezTYnan#|L* zzU#9)u9xQyY+n(rXjtTb8+XTyIkol{e^x<2h!RNRj zpJ_D&d_D39a;k_Q=MEBWN@jNi7uk_rG_5Y3TZJTMDe)>Y_4%M%DXXS`; z)0qq_SRNs#`=-+%71Z=VquV&>Ig*4_9Tn%xP3tw^i&Ezntk#0D%CAx@jdww9)Z0(k z-?sQUmNPH+=Uw{@dv5E4ZY)O5EDt?@Icu_8o^QJtU4=bRIwUv9sFd%W9jZU-Q_Y%UVBHwgcRF zJ~H|&coX<_-oe?sIxZWDZtCUQ5l-`2z9xuW4?-l;)Y1_>+eDIb-(or@?TiY%+xbSb zrtj9ry8tOX3Q_LA6n%fM8n7q&4S#~}bnj#-;dFhFEOx(}%dBBM%%J^~^mchA1a~d3 zjr6IBcr1UGC)M9mwExr9L>I3b*;{VFA|R8v?cggs7Wz|K$r%}Bc&qP)RK^LK{Ixlr zD-oyraHJ<%CE!9JUbCtv{-N~(3#nn*L_`r}6^<$#-2Xb5@Eb zKGzenNvO~DJigV_?VfvJh&5R@M;6;G!S&NWO$}dvR-@VODpi5^B{eX&=zm z&z!sebw~2{mtYTF=Ex|a-4EsGQ^EV2Ub)ZTXtw2OKe5{rF zUjMCT8Ad@qCys0}vnKHssd%Ovpn2Bh{OE#h`CE$(?n)Qhe3)`1aXMyV8Qz@V#+h#D zJYMPdo{LB+DpP&n=-X3=hV76sxbeR zxTLI>q?jjZ5ypoQGvqNwdlvO~(kkEw(Fbj2r8f-J$APg>juZFwx-XhO7xZwz}%izBS=2 zo=JS+C#|bPt;BuF5&ll2m7L`^Z*Ir5deY|o*mt7K*948Pox+;x)O?>Ft$Vay9<4VL zns=YTPUpNE%fC3TQ4>roez>4Ixghmw+OBY!q&38<=NVsY2e zXEETSSK9U6l=bG-7DK8n7N_}aie?SQm1>4uCf!4I54GGwMgR2G`+_7z9soMAt*^ia ze$-YVOHm^lYD-_>QglC+XO7WEv8*n9a^ChG z72Fw3N-1*KeB)AmGvCSf^DaD^lhLoCyTaEx4*uPF_$1vv-71x^8YDMz;gREb#2l+~ zc^x9JX|`!s(>r5L?n^z(%fNbUnDLXJrq43!PO2&Xq-wMBiQ4HIc)n}3@?G=eYfvfi zMwJsUq=&3(hUzdFwy}~dN)Yh~=nz@grvh*p|qMcWzJTo>Whnde6zo+w$5LMIn^o%59|;|$Sf=zM%sywXycYRhhZ zEoQOp7~Q_5%h>#7tZP=nm-2In6b{rKjIK{mb{b5;BDV&>{|=YEOcg} zX#&voW%mb5GrG;|96hjVR%)qXnKK)>6#MXAH@C5qQdgY9jOkP9*UR22hSJHxTO;cv z82zz^dz@!K`JCfoU!%_kR(7dQKWO{*_jBBY{M3mM8#*dY*Wvv+sEv`ck!smU)YQXN zjFtFgk?m6$D(V8y;`UO&ZIr<;HAMx6)5CxZetxtm|2JU;A@yj;H z5|i`Hy#5}q$vd4)VoT{n$nD*=X9=h%-UFxnQ8%wtAQDrtZm3OT4 zG&YpwwE8(vd$5)Jy+3FW{;dR1dv#%N)CQY!`z}o*iFje8#GkX?4F^^4RR?udjmUp=QPRH=N-}SQH zO=dXn;?ca{*MH`&{5$4SQWNQ!N9(>`yIVO5A_e`{7Hyqn|aBmiynlUAFm?HVZjs86BQXu~PaFRf zegue2sTOr)(X)p0$Qmw7z6}Q|_a$AvUB2fb-;EzT%)fm&_HWB2*O`$wl^I!^Ni6qo zACCRo+4euhI4Aj!`Rv_PgTj1h`l~ssaWQyO?k9o+#7Ty;^K;+JTZH?_GliiTJwwZ& zc$UsFz&5&PvBhPGPr&l{J9hM;lLj^9pnS|*Hf%hV!!FFv;_U4TG{-T&xW@6<@L1?x z39G?aW44Z0i%qZ$NqQW5Qn@4z$%(CxByn~7@-2>n?#Vd-Xd|)>$I?Trg=X7)yT;O4 zC-ZXVba(eV`25V}Jdid0UB9u)=jxh~`a{;Etltl^I+R$+`K_+fv}o>i{cX%DjmNZW zOY2hpu4CJDabv4`%}8ygcpezV(@#Bc|0P)@O9eXjOtN8?vyno&OVNqLkvN+Ik*=FO zj_^Ls^PEFDA1ROV!*nJ~jzQCBEy_OGJlI;Zb9reLiqF&Vc5(@6Yr|M=HU0dYX*2)m zv=+I*a#Ar*zbR}NISy>OO}(?JR*lq9JG`wLV%M0iG0A%^uX3EboL08=ZON7l~t_nzhR>sj8$7;|as?rljAC~P|wETvl78IYwtI`Q^#4_y~l1%tl#b+>~N8_QkPx`@34%WEC` z?8QszK6&+A5hxHUp1t^@~uH15{sYowW5U*3~u z-{VI4g4fv{wkx76!Bdz)!wh=5AI&3fbUWg9X}xc8N;0;|F8 z2n@zwM*klDar6iA7yl|g(al>U_k$f__Ef1I*%5+5z8zfSAXLWhs9!37or&WF(+XLd zgh))+j+^UM{*v?U7wfQaO`29X` zO^+S?p2}l1`yP4w`8JW$7bnc!EA~pAi~sEvtS{bsJ8NT4W3_6B>btx=ldov=cGFI} zu4r%RvYCmf`VkY>k)KKQz=TaDZ zrdc=q@@T%K3t&2%-208MIv?k%oMh{SwG-;*K8&qGlrHjet~DFXDzyrEl;^cct5%yt z7p%R&{%W3@^={28lA3y??SPGLRpi*pv?-Eus<~1p(&>1^h9}KJOwFs`P~We!;8C9o zb;WWVPjt^Tf5eV~cg;3<-Eo?Lqp8C@<$2V{J=b%`)1D@AcUAd`hAoeK8d>(KVpKYN zjq`BnF7-=yB*ps$-Y8Yf)H0WI6x#Ux=ID9Q*?3*EHRP!@oy|gMY0J!6;rev(5|>6z z|J0L$RoxZ;Y)g0ksi1y1=KH5>&#!cpGacnJaK+nl3CjPSB!JrEuk@ea?X7CEPw5fU z^RiwM9Iw6q(z9UYc;AO1eIH77VyT4Ql}@yd)#Wz6{oGwEvfgguESyx1a=fRF52f4o zX~nzJiuCs_=Ru|VC)cy7mWrJw({3}R8mT(Y6ws>MkuUCUfbT}tO6r65FI zeEwK>Kdd_qEIg!iOTUNMe9o$!ecV(A^JLt$w!aTYIYyA~@pECFABEn6)X&P6g6JEo zpNznsvIp*Q4)Hh_BY*UOA%j%obGEbNUFhkKRtxnVNGCNZo60DF<@5B(E+7}L^m`hY zI97_JbuH~9=RR+G%+xdf4^@?sn{Uo2?-j$@kejkjGRUY`nheW0Elx_A5Iuh>ou)sB z$?AF1jp(x=l2B8B`dfm zh66q%cz*L&Zov%ChofXxxjch8tvUmnd8v5`*xoq7psS|NYUao|P%&)SY23bT-)pk& z=^3>5bVo;Ik^@<-@}qC)UfKi*XCn<;L8%OuNhEPfO^zw`z^2(*YUzFmp4l5oXn(AN zgv{P2TfGkKBN!v)@y%qEQXb)WJTpXt*UI1h!0BKXd1;*7juzV5$LlU`t_?MbA-*k@ zm|0dYPPX__7RxGz&|l`=PKrHWc+KQCd_QWG&{Bt^zX`Fi zeNy}Wdh~a7iYeD!F;=$oPd$n}=5S553{CYQ^kKhW!7wk=RQ7berU4&%y|fl*d^q;| z?RC0FBSV2$6R-b)ewS)2mz>(U3+p5~<#nt%2LV6ly{yPPMM?1Uu`%GVT~bFS3>B@O zC-XenJo039em#}0)`_-!YKhOIjo9Wo=`wOYu$a%KjgDjs$;gmF+|6S8R726<1Qt{J zz4)zkyJ$b@?_*hla@5RuuuWuA9&hXi`;yKC^hpeK$(wIIc7qYm#^Xnd3M zP7a>&Uxj}0>!U}PE6r3x->v9NGCTK{@<{S*S#4K-0OKZ(7kto z&rN(W--vga@@f34`xWx}V?feh%jY7#q{kF>;hXAub3UFkzON3GWOd_~cP4VWlUd-D z%ks}4v%l&Xrx{9Lmjwpve=Rvb&v>Zbm!y8K!*XSj{0m)6%5h7d5OOH5>_Y4BWmt(; zVPZ(|YSptZQ7p?55Q4V#lk9!YjgWg?-2 zI`0i#7gP7>00oxDwoEbI2vxE4j^e#OBn@nd?|jftCXU!%$^AF}dwRu_K4p3b;x!u^ zz$ZBvf4H1U&3&%rN?lF%VJknbs9W=#DQoYh=1i|5OZP+F?RJG8^}MNdE7;X6ClHZE z@`BdQU$pbRT1PUxW9ombqXhmkT%$Pc!DcW~^HXZ~BlZ^WWs|Le!NlG<-o;Y#StVF+ zUFPeBe1%J01N}740|Gc%%bVuM%K3i#<4C2sTb|pRcQjan`oWE|j6!+$9~gCS^bfhF z%MY1jDo*iIUP{hwecInhNBVcUggn!}n0N{fg$Fu$B=5K~B*!$phWrQJ=hxCxsplT` zqIIPo+Mz7pBi@A1rkgLnH`<G^G*=x_J7j$1Zm)k3x)_(5_5kvO=s#%K3!sqrH8(cN)11c4p~)a8};cS$S8N zu}9;~QF-0RY#Fmo&u}@@=?jgvgtc<6_=mg#=mPS!r4`{)_3zOiM}H7{aJ^NfIgg=) z*I?-7Rz(fF=O1ro{?Rb-#dg_(KVw)-xn*p$&*g-*bzjYWH8kF7@Ww!J!MZJ$=<@FI z-+mO{b|N{V<^X&TJef|HhV`XhPW0x;ki$nVm)I`v%{v>p)&wPnrGXqyYTLfvgw&gR z6-Ikic@@U69!_l><*NA0UDeCZnhOAb1%yGf&z!c~hL8kMhFF zoX@J4`bnPqf&6g1q788{V2r}P+|i7aXZj7k1h13a_=)z)>wWzLgTmV<8^4hpk8ixy z9@x(ty`pE6p_uITSl@&1dG58Fx<5l|H|rv;Arkm7paYL9xJfR7!)xZack5M4u?z{M z9%D=1Y-#4Egprm`3Im0|2&lvF1sc+Pz?h3U4@@Alt4`R4ECwOjJA2>Ht9~iTI0-Y1=;<<> zRlOCYucm8GSr*JRq<49~*_r)%X|t?CITkkC(jt$S@`lOJMNSo->gyt#OV^O5L!R;8 z?AvaQ*V7u;$|SW=bQCV{O5+-^yrbYv$5Mw$+m@n@`Q@ifM}n9}Zt0!zlm(A7&O%qx zn}Pq-%UW#?Kkv8oRF;*<CCtx%((d=BGd78>MN-rs_DSxm|-ci zZ(pkkrmy!Rq}rE$(etmIUd9SBZgM$Z*tbHwb0@vSiQW#?wZjqiwo!&3Lp8r48t+2A!-;;v{fVFCer%ir@-SrJYdi+85AgZ`Iv;~0{#htmKTEvJ z>x~lG{w#jdEvt`0C2I{^WVVgA%snU=Yl>V$T1kjrXjcbdt8HuRe{1#C<#~x%$8Tqs zUTa>>?>UO=%TXMu^A@vSy61$zn`3Tbd0(eK4Az;=j=Qcl?s}EjiYdr+Ah<7Nwv=_? zzO482p}P7)+`800(lhm{vWVWU$uH0LA&6WX_8*<`|EY7Q&+FgxdNR`A_{5XJ>p0Ms z#?8j7hz!E!)#sX`>z>7GZ~-k!v?*^N^wf}0GV0L-Zhw->?q*;`F;Rh@b%&pN2Hcf) zgoA&#qH92(H{lsw&*)m$Sesq5T+d=rYsC7m*Dx1-jdQoGWJLdBuVu zb@;XIY?(2!m?rrqFs;9+z_a!PzTy=Ni=2A0BOHsWeZy9}CnED%v)!pMEO?EF88!>P z1sZ1at!$IT z^|dFh^j6xfdEF&Bk3$_(&9qxG*UZ*B3;B7o0&x~Edhn$>aPNhgV9k~}*X}3n;Xu-A zGi)xxtDPjv$|p~>kN0{H{vp>AGq7}@_*L(|uZS)7w7>IglFo;05*e1@MDO@a9qc() z?;Aa#i_tKRoX68g+S`ygyq}f#P*MwWRnE#wxt{qt;C!+1mtt_lS@%puCv(sJKpMZ( zYhu%{f+X&Rxh%QGu8DQiBc|uotc$isP|<@!$l~McfI@5sv{<=qobs5}vyYyAT+QrbgIo7&)n>aP`1S*>7-JBZcM)}MyXxAuk%`61&b@#U z)>K5e?5w)%H0a(er0=etKK6E7zM5mi9uF)g9@v(Afo{}DS&D%XRkfKVn?kYa5PLlC zHw;pjev8U2CKSClfUZsYn|_yTMD}>eWg3%~@;& z9Gn@QpylA?yl2&-9?{=bAJdY6HkE(2)14ABRM+{>-^RDx#sx> z%h=X-6-c#RzP~h^5T(!a7gx(+tsA!Y&DhG2aotyblr{fGm?zh9tbbU?14-qs>W*Q( z7(bJ46zGJ@iS45H+ZwaO%d7dPOR05V`J0aacjeh;+uEnP2Ged>P4pi6j!Z6mo71qe zctwu*GFW_Aimbb%pw-!yYu?c3uzBDyZuEK$bY$T>AM}%)v+Wgo-5fu?zTD>^?|rG` zqt%a94W3@7+jzX~8XLbT-;@p&uw=^f#$_y-pM$=~-VU8a6)pLBB1L(RAZI7cBWqKx zDPL+WlMlWa{h+7&A!w6apGG}NCu*e1^<>o3t|!SjK9|f8c`R-QLAh6Y^;n2$?DY1T zH+tl{6E9{Rc+|_3wuj@$yFAZf*iM{GWtuvTgEq&r`*w7<@dxqjh`<|NMa)c3pD*>< z?>hc$FV(81n>gIgA@u}v8}96^A?&Q>%AM7Zlxw+0ek_jaLNAHBCc8t;#xT44ua-+? zA5Pi!Yg4IpIUORW<-VmwLxws=FVlTXB5jYse;KVt543Wv3*(t8oIX|vLe^-6OdCED7_N4o~MG2LpOHh`4V;9inZHu58hz7n zXQJ2kIAlrcWGH6~65|--;-xSZaF3s$p`}Nbc&?@Sga_j@v0js|(w-)*C<(_#lE zFM53}=e#)xF}5`Q7VRvZJIEdXrI?f5jS5G^A|9oy<3hQewUyFFUH&%a-^Qb~w}9Pa z>`XhFb6>8T`x2j3E_d6ZHW;>cX)S<#Kklvlt|h8uR*U@HvlaoLM~&{%g7IPZ@*V*8f4U{>-#0wf-eOBq-s*r}=0wXTbPi z@gK<+OlI2Lr(6xTz;K+|W=0OLN_U)j)oawRA{%&qE*m$uQ)xTX*_HjoZnSe$bT*^X z9H#DHl~ei{FlA;rlVzfZ=u4p-4hI`TPNMFcljSV;YRal}>7#6YcFK{B zX}E048;a;z7dmUxGa_qfmZwzHZ!|rFHrf*L+LW_2`{)~5Vdkkh&bt~F<;0Zqd%RbH z#?5-p5z~!mF1fqc^1{<-6p3oHBi%1w4Zpk`!FVp5-g1M?7%@F@9PBP#BT`atr@bH3Zfpz8kf$c(X=^OSGh;7V9{bs9ZZ@@eaHaJd4A;TIXc6D%CpWlKc;8 zMX5St?~|(Q3K8HTJ?2^FqsBK)fcQHIx2Q+uDj!`RC&GObSZVls53^(vG-hqmS|K% zu;;@AaEaNTOos7K4Zl5INp!C zrdQ>>kV#~Gbg3-<9I(~5 zVx1wcIcwtos7jJL+{@4_9ORWL4It)c(s_n#od(@`s824`HNBou;aYUD-FItc8;P6N zw*?Q4IWbHGp;nTqAP4$8GA}G^yPj?k1aT)^ogY2EvgYS<1udeA>aRB|6AiD2MXcT;ZhT@tZ{x5vXQ&$rB~V85>z#_CHwJ7~DWvCu=Ty6LPhWYN9K z>uRfOp3+L6C9HIL-e$ILG<FK2&9uZ)c_ZTJo56(qeF%6c$oNHwT)g)Op5rQFK8jvB4uOmsYpX zpfPw$9y3$-mHL3(mDw_PPiP@BSKf7}MCQDH+EKyHP~AnZKPtS=6^)RWh|vh$hQS8Q z=S_G;>bm8Q^Ne0uj*qMbeZc5NT^b>j>QFINob&${VcEG1XmmNsN+63-<=T$)vWA)JV8?z_i5@R`(a!CS9rwa+wy-Tf{%aY5|X3|Y8YNfkDitvzXrf8Ut4)_*|W%4{#v$@YWXO0Rxw%=&E~$+Q+Z=&y7Onk4Cz1vMo$*H9PfK3PQ{*P z5gmUzvu2;3(HoM{YshcbIU$)4Psis&aYf`@UG! zC9g*E+7`_-L^m}w59NJbZnLg?EZl^;pz^spwNf_OYqgY# zA2E~jz-RWZ(u-mpFH4`nyP)FZZbc^y_vqZCiyh^ySH|z^bpxBX4ljWRZ(Uf*SwAj& zH(T~5SsF3t9vMBz8@(fcle8TPoubbQ2p#<_FMD}ERM}!xP2+h!p4w3B3v(N*xECpB z)?XYsE3dK9WA$|j*r})PLIo!Lwq{=jhEV3mqV9B{J5?jDs8zf z%f-@Z&lo7>y;WQeT@L3hhjd}4CU>hMW9D+`ayWlEv?dx$uQOp)^ew+UzpE5lk!n zQ6AImdS!SUA0%A|Bl?n^NYY}pR;&=L;U*ain5wP4Fd_A9g6SSVvF+}R8RO5iEghWF znl9^xwr-WBtqSnvL>=Iy43$fW*9Cs1dpytlZNv8GxiJ$m#aYR^Pi{eE_Fi4wn8KWH8}*U- zPUZG3ml{|OucYbTOvubtWTe@r>y&xwl+*`$A$hPlGxVK~pLEH`UBzg%?4MeeBX;XT z=kreJhBF*jYtHsG3l(L?I_Q^6(__W{b)4B!?4f(#_~v#js{wDep@%ca$HOLyx9-jddgplDx%1h0ehBjd;bpK->?KTFi|lG5 z`j_f|k0c)oIoQ!LnLK|o5jC{W@$-N(&_8Bl^vn26H*_X@I_L9%Kg4SWi zxvwiY(lu;^b;K2I=-9K*$XCJQR{_#$c&X{Q7(JRdSJOWROrUwDX?7@=+c+(RevvjA zhdB02$;VInoAm;|b!YUwUSDMImB*e@mM4#3d$#>}Hw9)j)Ko@K>d}5oYno);l^17m zXE`?EvQ_)63>{kkcwtiJ%%1kimgRNI`(C+h-E`TSL{8h-sv(o$RG=O&^_yu!N79a# z<-rFsi}qf>PxRS`z<#i4&Rysl9Gf9%NW?n2csFL%c68*UPuxP$09#MPW*L{(&H=+ z-q3r$NrulP&6bt-DD?WGQ05pdCP(#567XA+Q^o3ers{0WW?8>X)%Wtqe$~3gH|x)P zK9Ee=bjh1*+F+K5)Y2YaP2cs?UUvWWz+nl;Sz(6sj2pH z9Rm)${)p93iFr8IG39mJE-|-TVq(XM@>t9z=C(@==y**nv`frwmY9c%mFQ~Ye$377 zA3a~s7m0y8L;sJ`$|~0}w_C?pX9SlR*D+-X-owBHc0Z@Qzk@YM?MPDRPNyzr=pMB0UPq- zQ&#<4ne>0^9N-53ts|?xp=rvNhes}9^X}{W=aO*po1FV$^6K-^-#rgM`uFIMqd#2x z1g+Up`b3$?vvCd@Hq!UXG$9FxW0pAV?{u3k`J`%?E-Zg3_QC72^l+e%(Px2u6nkam zJl`R?`nX@u*z@G+vTbX5cl2EA{7`&dRz3U#ID5;kK>kw4ra}Qtvn$4S{0rTM#)0=^ z{RX;Zayu~M%5`QQ6+YFKTNS&{vi)UkblI2EWoWKO>vc(naV6yl0 zS6~2{e3Dg1r^5DmrQh_j$NnB_zT$=|m8}wCL+`xRdsMev>OY?!>n~OSpPb0@T1|_6 zMh_3q*AL0pH%|)d*46!>Op@*ewvbEG?VT&omZTTKZoo*5b#z#-$?YsYwr(2jZ$!Tz z9GrU6@*HiKUV0w-QxQka)AukY&{w}k&$ut- zy`+cbZ|KKyHT{(LS6QS#lpo1`qU-mG;1|UHQA6#U=l?)?V_sridq+{{O*H*BR2yC> zQhqz5N22lHYWkp*VUv~-9EwY}kCEf5Rw-`B!0J+sOO}xCL0}2zj#CN&c@?rKH7tss zB`?@;zGK;0kfh1?%+EOvSjvI!bwrP1hiIy3OObBxXMZ#M+5ambZ-&tAPIUId1Gmp7 zdwxYpqQ|(^FqYdhmn4^@rh8nJB<7xL=OyW=e6L(xC>I`=DV%Flz) zSER-#a@})Nbx$KPlU~p6Ck9)TrSpKY9xKm8mg(S=U$hk}2GB&MUQx*#1{i~)E!Y|9oK`g||M6TH{Q ziz3g)cWgEreKFaqb=i!^Pp=OzKGoal_2$><9Sv(cnIW0RpCnVtohBm0D>IH$-{~WL~ zs}^8VUMa@(EFhkz6WQlDpC?wB-^prx&GVX#s~bi_ojU$t+e`b~_}K9%?JdCXslz`Q zqxgDFzSb(@dIq8lNss8Wsfqcj2-{I`;rqmU~(lh)i+zU^G~=tq*6{m=!R z`4qP0olpHROv;E3<7^aOr!t47Jkj?*XwRv{)I_Wo!JY+bL1j1H2}>i+0W};t&h7ep0q4@5OqRFzJLm zWByL+w`|IbfyY8_0R7xViZwKvwChd#}+bMtN+kni#SZg{XMg4-WUDqXL8WIJve>ujGB2tv&1cpa_ zq2s}!1Q#O**^fWe#B=ExU@h{DO+={bj=mwTpLuzPXE?G|8*fZXW37C`(Inqfs^?}& z6cY>$%fga1{W!mt#GE;@rB!(t;zRRDR=J84R_6zuD~xONw2-Yv$AP8BZC+`c3q9fY z*%na?8WWglbEQ(Yqa!0bCoO#IXT1xe3D*?O!Ew!}yCY8w+>3Y0(b3;p`+@Inj178V zfv&;NcYkb%KNjWV>N4~=APh*7%h0a;fZNkQV}3G3_k)MBclRqeV6KU}?A7|AQuCA| z>!9zt=;{pNbwizyBD@aprsnmj`~~xnQvWD=KTKM%jy>h*c#bkX)iJ%}^J+0wnx|hQ z3CO~qRQpup#e9@>S*MMIP?x5$HL8}h4TUFW%c`S;2a zZ%pjfJEDB6yHwv1WvE10XVY@sz_V;*U`KNBM$dFp((rrGPB6`>;wAq-OD-ZeiCRzl zMk7<+&zluPlzSC#dze&MkGE~vjnZi6rJf)W@u8yCTtaf2L|qfwB;V%F#NSb>K=bk~ z+sI!Hh8Vd>QTMzJcI~|+8ojjfY1W5D^pg_kQTQ@7(__U+ZmVu;R%3`C`?$JBFV`JW ztGKON&1&u;wu<^)xQlM9;Gmz&veH-45#tLX_sjC4x7B3?T<>lL|I8z77%{7!f2ze= zw&k4BXgK=BswrXCs3NEH~Zfx`U?6W*;5GSzn1T5PWHCAo! zb&tDOJ?{Qi*_aD;)UsZyusU~z3B=^c~8 z^qnplyf?16D4(FsJY{-_fQDUm^yh%l&L@^DC$~o!?45x{F?|Ehaz{wQ6acI9LICd)%Ngx%3|S^Pt>_Q;*W52m7&Zcx~$`8@Y^W9?6q z##%YG9$n?VB4*dhf(2ZBs+i5|xw*^uk<>xr#}T2NOM7p8+P=KXG5VEuM(HZdeL{~w zhD0Fqk*^1V!?IPu`E5rAU0z@_=^X7$C-PV^TN{;}PmNqBBMFzI>yx90p~eITc`0|i zR*r_w>Wx~+n(RDn?p*BORxUHo!oFk0!3+5wd(sYIXxJF+ z6$lwTSL=I=rEB^xefbGbJCmo)BOwrB4wG7NtmB1NDUa4}0Y zk9SSFxd;V4-sz-qDLn*gPCNqc4fZvOiBVxiRb%RzMl9@cV06NaD3z)d1%098;`Q+V zGW5yal&(3^k*M1JC{0!C1vUMi;vSgv!W2vQdWLvCv(eMZEq3(mm=1~cF?_qb`<8js zK3gU4)aCieVfJuR3fn0E%FBuFr$`uf9(xa4sN9byrobj2>zhaVx2d_=C)$JC z)gg8@K6_A3iwC=;U^}1%HGP(IIe4n)Y`sYqDF@9_Tox873&d~R9>3lCjLD=YGe2L4 z9&Db2ZsYXsl@IgE!T2nzNmrB041J9GPAp))RhK1vP|03}Hwe2cW<%+#Lgp3B6N}4d z%!tjiddOF@RslB&DtXdv5c%$ylNp(q`E~!{_ zs}W$zd}L5CU&MG<VU57l11(lbP|=;m`z_(-X~a>=?qQ*5p# zS#;UJuX4%q>ZVESZMg>c7I}qN*ZW->CuM`w%xLS{m)pgg%P2BV&(&m%{xJ6|n7l4y zx5+{-E*J19#FF!1In8g<_fu(XV@^4zX$Yt3Djt>h*YI4=^jyzXB+JlGuadUNnfXD*d5thea=p}-+1gbQ=0b`bMySYMhDj6 zVtQy!W5#vAPo#XR^>I3}J}h@@eNJlfYGskS@#%&}>Fs0W5u$bNvSW11u;)dFU_RXv zWL*H-oZf!PdKjv`T(TCU1CV<3ta*PqR=kRM(D&jmV!>e?g5FZ$%3O|T;Tn$h>P2|( zgY5gsjCXTgV0w(&@Vc6$C>*1xyJN9U*6aLAF?#BWO;UF;STh#ZTskQNw(<RMZfBG=QV_LXP$ z+I#jIh@0F!u9WMU>!c`M)+3^ZZP%ygur&BpphnZMne_YrM}7u*)yvV}3OXJBy~6X0 zoCNb8@c|>BfvTPh{cV*v8ySMsoR7z|L*m)t90s^D_;ypHZWqqxMZB z^ZuyZHS!RR{J$lOWMwQ8-XHz?Nj9f_(j}qWK|b&6XDPqzD|xZU`cDR_@oZn~=-7MX zGUAmT6=OLj%WxI#dl3ivFZt3wW2+{{pZ4T;N7Fv(mI?Sd_bVzLT_#qSKS(CxDv<`A^7np39l;{<>LnduqsyojF!G_T}VVrldDB$ZYHOmN6#+T8*bU54~qm zCHThQg;>vK7Ca4S9(y=_(3%5V-qU}&mXpDun5T**f!HxTnU#CaTwb}6o&+FHYDXs<* z*nBU28d09T@@lUmAL{<+F#nVF|3+GBUwXB9-6eN-RWE8emj}hTUaD!((EWAF^RG}w zM>n}VuT4JGQ+_UezpUIwzutqP`cdbC%{!Q(^&SUI85u0al>731hF@`HpW^XXt&q>g z^O^B8JomTg^>K9;TI6Fq46NF_itEe0TgTN`7gwL3WIPJ`lAope(&b`x<)Q{_`7U^K z^dI{u-;QgV=FNd)*Tltr7S-$Q+=?Db+N_KJx_X&lMGv(qm@!ly<+$ctUCr5GDf5d( znD;|9Q_b9;KHcfj2zajL?>!pX)ty*(J-Q{o(<%|ld*=785ce+JyIAh3n7_vj*XeHX zxXb6>^sNcE8g4ay3K_jK{am)ys97IqZ{zmDJFpsU%X^+piA`;Co%>f8>h9t*n_o(P zVmHmm30VK$3NN8t^8U1_o$I%~z3|((m zo2GVXRvi)bYnBJ!D)!}`jk`H>l(brrK1G+xD8e0zy`S^0R5sJn)V!K^I>v=i0J?{? zBXA;bGEI08@Gkh>-l`_zPmh?MS2Ittz5mj)@ThHQ)OIRF=bcs)ebmigj(^+JIM#EA zbKYQ(hC$sgwu;j*sP83Rze}#{sLynalFnd1i-&2e$+$2U*)t85`C|OEZe8^LdM!P1 z7BD1`=J+{X#B4Q!6}<{L1E0}PY){v@Avr$_ui47Fj?vlTqh512PQ!cFU5vilw&#oS z#IxpVe7@OGp5wfA<|CL-ovNl)Mx(gzF;np;@wH4}5-HJE+W zym&d(aGdMkyWsO|1{?fd?;8#ZtLTX|82$e7h-OVH`A5)>Xsp=NFiwbg67;I=`ADBz z_vRz*-{&^ky(MRNmA`rQ4)q5ff6kHc-nymWS`nJZNm_nJTD6Svnd;;oaM2NgJ*OU{wB z=-%kh>UYs!*V+H6#dN3gVopY@#D}Q&vK|F1SnlbUNzn9(UbFnH$*gm3v#`F?reeFL z8e*yb89V^`g)xAxJy&?|m_cvYj zk$!^wMy$>2hr2On*O5bX{NF9H0m@-yFFVoy@034HUxV|#7qS(txbaA8YL|1?{?GDf&$P#gG3VTU5H_1AX`h#4Y0u;z zgY!{`3Np7j%8%q$c8Ha&si-UKI8A5WdjVVX{&(Kh3w)j!!6JqA!*@!vAmF|>B@gXJ z<@~Rm@%$se~sMS3wW%{ zjq4jjDT)53_jM|(?7J(O0_87{THOC5s%?L7uDtz-79pjaCNGAYOwP!m4Evn-~Bw)pHeSsogb+Y z?e2zR{cvk)4*OQeGkFOh_jE;>R`2>OL-n!jO;=UpCYAUEwOf)0o7IN}4$2Evy?}_q zmN_3|UZ(-6I@Ec_nTVe2T*bP#MXwZ)PG2c;4fsk~Uk2g#(sAfr5L^0hptIjA!l?1T z%I1PHIgiQ~CY6=;0Q^yBL%$X52#5&z;KL4GygB+-@3RH{5$L$EFTG7au2TQS*(UUb zo?q|WWy;l~fc0)wWS)HXU0NHtS~cs-lN=&K>-RFBnL6(C!us=^0oIECM$66_#H?!{ z#%5jIz}U)>SDZTHwS13;BmH#r z-|~jvDV8{v{Db%Ob5-Lv>1Md6)$&T;>c-h>yX*9=7H6h9Ghx|YMzk4=Tp`RtD)&!b zhHjf60|(+Kvi`uHtzYr+gw29wc%j;CdKuG?bFvrS4*>}QNwBUQcRKcH8OIb01~2}X z_Druvo2Fz{jPxhpFWGd2=0b_^;U(X8hasjyluvK${0Qa&)sFs=M2_P@PJ)& zCQC!U7p4c6@Hl7$-hUTR-E@67`U~Afz5jghFZV{>8(p?HI#lwvt0zqN#bJ*8I`V5> zYOe?RCGx>nWE%GFI2XzsgK2XV9w`?KgQ2`u%QI%HoG~knXTY=Cam>AO58rYxAdN(G z&%&l)|4nhs--{*?J(ZMNBtp-JI7frY1Vm_@EpZS(_m#~js>Zvq>J**`6NPMg5YkVl z8Q$w-mf75)_c|7<_~I`^!jpM8vS^hI@$a>-E*z=T+5@RZpp3BJ)}=IeUePe z1{unqXkR^)OYS`RA~8;8rB8OfT1AH8RVDYqc)~|{7ebd@5U%5i73w;-R_B)X3~aU| zu0NHf#J*0;YQZS5$T?o+`lIL7MpPFeHWGrI#y`3Ckvp}Zu z4v5UBJr}x`Gfv)l?tk>}(H}>DPzLm`Lcy;OkN;k4l9kC6cEdB?jVA!pyP@yX9FekK z8fdS&UPjZA0`KbQUA7im8_PsMYHGIhv(&@u!vQ?A>Y3H+)8va^E0%}#wc@jAZqB5S z#WBNSs?~AB-L`nG(Q4KjH8^rV%JDSB67V~TC161`-|UVTV(-0jjEz-t5zv$~?Y|2F zv0nT{qU2|vC@y7=9_O^FSd`59Y-EJ(e6Gh=is1S79f zpw5A5kM!!e)63Q=ubfHu__^e)shjDq2?9|wZr71s?deP%OB;rzb$606T|xb1)7c@u z*QLLk|>*e?Goh@^}X_P^wdNb z*{d#_M%=m;GLhws`)6bSXp(=7H*+~=tHw&wyfV~kgAGw3Z+IbZXjT^ei;C<~dIs%S z;f{_-?J`{L@}qAkmav*<^Z14MCJ)l&azmh43CG_!!IVLg{ePn1ZG znwXEOc&kOZqsZ}{-rWz|AtAAUDz9JYlcth|@59EneZsYRt(t-wIrR$Xufm!lx|zSG zrs|YEH~mqX-U)~5RdA`#V&B|j#Z^>kL|%sZ_;)K_5RMGE|XtJ%7kS;p3 z%eIlrdbfrs7gw*O?~W_y-=XxOVoul`u+&O*qvOks4xhbxER(k( z{qOUB;gc;=KTnHw7O`$@_TRkL4Yr<{fLNC<&lYXoXAc(D5kB=*($}-`PCFwQUDgk% z#*6W_@?7_A(QBowf;RF6={9{7s#EcBqgP`*E!IM*^(ghMoeO9P{W>z{U&tS2f@)JW zj7RjnqMaw=C=wYR=|8?}x=oZR`cyE#&1>~7^SJITiD_237Sp~fPZd@uNMxzDX~#v* zY$qc8vpkJ{&C>s=t<}})WC|KY)}*wS0!)wT4{ud_@Lrk-)**YaE{JdtPJ4CKpF(Ai zOXA{v6;`pKYwJ=ezf4JlPkFzhpPB1KG=$feP5NK>XjjpRG3Q)9$`2s&Y#s z5wr1WzxXbhGn{U+S9~esxqXZr>9KlWI|fH@^JSfpI)sr*#y9PYng9J#Stv5KR@a|D zkvPSEJM_t{$y0ki(DQ+-S#L58d7OVf@R9Vd)isvu;l6d_`9SXlw%lG|%Umn>LcRR9 zV^;F}96g=PZ{Gfou8UVg7ynb<`?2t{J$d=Ns)>z%b$Rlz zo$ENyT~VNS0lTTW(r$)nBU7^_%xbP{y56)=fi9Wr#sg|=t|JrvJYk`Hrfe_O*s!9F ztDn#P+R)kp7vVFiVmG}mR@l=k>6))}M~-w~%2vZPU$RcR{(tt~wkeJyS^u8b8?oPE z-Wf;iax9*N92<5ZS+?1~EpaT_KKD6nI1nH#8w3l;GW+T8{8dg-Rnt8^Rnt8~4`etj zV4k{X=IVU7^2*H8IWdN=hf>q*!geuJ#cY>lALH4F*Sq3{P@7EJl<6N=uZ#8FvibXE zOcz_~W&Af(r;_ZaKCKJI^`_$)(a7f3dkk5IEcy~rU@HPA*(@eU8?xrvq4Y3q)|NzC zhAdOz&>io)TD&dtSHx^_mhO}?n`JgDMpoPYqsQU}u~+%?xbnCM)6_5x-e2*{6SwEg zyFvY|n>X@%Aq_S8oZ|AKrkBges%txj zUb%aW;UB6hVyhZb%UqVO$*z$`ji-C0#U69dd2{`QS4Q1)&C2?GUt0CwX=L!qdDQd_ zm;#;FuuVtbWd(ay&&r&wd1KL{w`J=RueWzZ-AqV9`KZ68*S&UXJaO43)u7xu5FXOD zJU(oVghx~}wwSa6m$7CFZMh0fBQdK+Vn=d)x*HEiF{tPK{iG-KH=rz^F;hmua};$J z%}>wWm8e%$~7|-)e#d;HzxC<>D+wgj;Z;?G|ugxqRm9BI&?qTGvpDeleM(Z^HgqsD@Wwr z81n`~$cEc8Z($!*^Cqir9kz}HQTq9Z=f(EI;|qU_MWjC}H>#Vy$BHZBX0#hvk)d0x zRsRGi?jKP1D z#9@Z9hlH_3`O|G@>o(1wT3mOhaorPFzp^Q_bVVBynUsw4+UlE&M z4b4vz)e5gw%(~x2dSAG|?q_j68CB6rx&qB3KOB$Tz4fb$3fFEmRQVHOcSRxat5l3H zB`!U>)h%G9$2AH%KReYEJiV>*Udpb>BiSSQLSE;3RQc80^3^Sqj-aosuVWj_OD9WA z%24)hRUz+03xYaf{1&xPXCpm9*uc2%D!-e;Ra?c)n3*awGkN9=dGMs|D_*IG((YXJ zMHjW(2beKg+A+2}>M9(!XsS|CtK;>3sb23#$<&Vqx>uHSLixn2T-^37R=s%1*4g+B zs;{&nN96cy;>|z$P?!eYmu?nwHs$pz`JN9PPN{W2cRY?)aQz_nplDYHXVN2?7>xev zNWQ^S$N1FwYpt}DbPIhaI5@dg4erX>y_H*5oF>n+O8Nd4-+wUpDDMaD|EVY{{41J% zv`hUc7GrvM1>OA2&n?-j(lpPX?-K6uQjlC{)w?Qi`E9afVtKTG#imiT0 zT;NsJXl4BoQ;eF0Uc7~7!X_G>P0{1$qOxkWY#TI|_kM1JuCKe~+B`*KA-tw>TeERn z^R2t0ae|S}w_G-f;=b}+^F$gQkW8*)D}1hxG^E{6q)}g|`uDq3=k}9m9lcU~Z=Iie zBo<4xBKeWLRaA$veUa?wRIa{h^MEueAIdjm6;*nB<~harh14CdCE`LgtJ9pC=KwY3 zxI}=u>(aPj<5T9#r>qIm)Sugg7Q@ zuHsbhGkJbi8N%@C`5Qf&aul<-W^eCKYsO~18?o-^^7BaSMVuYS*^^Fdh#wo@8)6Zr zxc<$}rpc|O8yk9m*-+ivcp&(qckxfb*Hc$Xgc+#E4^yZ*04W|C89na)@Hyf!{!d|shOH2YbYvUV0_?Ku9rK*dE<-s#zu z-p3>DPi~H47&VMeiWsz4uT7ToT0Az{(R=ad@PjAf%R{zt3*V z!KL$p+xq+_q~iODFAb}P)h@EM`C=7@(y)3ixueC5=PTzN>pnX{hEEF72|2>=pJGIxItH`D)B9;Md#+@Hue8*=O!&1i{vra zYzY^Gb$YYebdig7)N)NbDOP1)1sd9CuF85O)}B6_Q`cMbPPl|$UEkNG+>iG-m3nO2 zpT>7tor#@a)AaMK^*m#5VzbuUN0$9T?zYRA=;`SWxvxjeH_A+qON4VJ^VfCyR2k89*){<6$D%TYRHtX;SLAb}0s6M7DPT$2RTONg?#Ngf z{3N#@j`GMgvAyQ;`!SPL@tLpWMbDx0e)5&P@m|O(ixkIjtHL}4Bn1?qnT!7l3byL& z;k#3w5oKNdv!~&kXU>k?_?Z6~ydHcZul9$Fo8QU5u-2xcn?*&}hW~si`N@@h@&_Z9 zD)0hmNpwa*ezs)HfH4E)xw(62=7(Hm^Yg2r(=4CQ^I=vGU4|c9=6WChR37`M_y_at z%jw&<#k13K&Q{*;vTo&zrlAL4sgp%Qy}_bJsxN)az)Pb>a%zy(rG28}aV=4msu|%K zzmwnb?f;P9$D_94?VjC~{UO5huMvLxRAM!=V*RjUlO_jH=bp4%H{G=RwaZG6M;i7w zf}2a}G}C>$dUdUc<Z4mv{aP}OkeO7yz4`8b`|dr7({%DURXCj^cq+G?$$#441ST)VN5dJjjhRZ_ zzQl0xqv{@$vWcp8Q{Qg8b{8}0Y1z~o?c>WAVvWuPpBGXA0li?FnDeG4%2e(=e;-Me z&9<%2xon#uu?dNEPizSjHkC}$S5$S8>^x?p$(f5I!(S<;{8T^s`!^(C$+d!9 z18J|csmt!GU7Qc*HU)2G{RW0PtH-pnbBei5nGlt0=lm|4GnaRhXI#0goh*EHl=HxC zpf;zs`I*z1E1OEBPha6sp3Cfj@vWBsl+5W$o;P$q$s7EPvS*SzFz10+K9$?w%Iomk zk^IiwG@gZRKaz8>d}5Y-BHyN^ode^Y1Wc4-A_Vg(VQK2Tt7ih)=a7rLbS~-7a*Rv) z-udoNq(_zSpKO!Arst`CtJkia-GSt$?BRi9S{}Nx4}=9#692Y9J+Dc;*!! zj#um&Yh8pti)MSav=2>L0{nEf%D>DNi99>DHL88(dpyHd{xqOv!`33Btu?V| zs7}{2*o?Ko=MqtWlFWD`@;V>#pmv9p0#C$_D~PF5x& z^IcWv7E^0@D=`>b)~_35xZ%L|2bJy*S~T9MA>`m~dxSTO*&a^JwrDKU6Stm`X`1aj z82nvwcCWFhkJOs)?PDCbSiF@_1~%LGaBN@wM(7t3^ZYT2j_Ua`ou|51(5sPCm1pYP zj$^+3+_ozh`BkR}zHu?zX=7Zbk)!9zuRK3@H660) zkh{hqdfs@1<{seio^j!Si~ z?0Jm;s>92cQ^S?aiGD3i+@)}3-^w?4D#ub~yq_{2)N;Bn1bgIdQ@Z(KG7lFseqYNm z4&*wxk}Nt^@5Yac-`STlM2YZzo?{%!vCvs7LJfnnVvxWB zF?X-z^*%W32+}#?yOBDBdE3emhsUf4GmQOu;}jm(BaZk;ZaEu#=@7O%nk~$p)N8>3 zuZj0%Hy&K_r93Xb!XInqcjTCO=JPSTT|LK7-I>5q4+p=E&U7eeav+}@>J^kL`kwiH z{9O;-QP3Kqf;g4;pc)n4(NK$0X!gF~8-q{*3|_%P?=4?+@nDw~`a>Cs8w3 zgTE)v!aN_L3UBMSN_%r`2kUG*SQlG&&}D_X?7*kAHa-mGI}l>aX~ZP zp1SdfjnmLx>Kx8b>Ih|NBR6O1x@}L@nd{0P2Z|c$H|}CWYvA*VD&?F-m2+d{oLU<&ZQ354<=?d?}~Dh zi6UzmJvg3mpYC0?a=GKI6ABKkDhB(k3IP7DDmurv`sUj(^SAT#x3l7l4u=xI8c>pY z@zsG%Rq8&9S~e>e{9sp}ldfu%CHZsZ%yTxOW*L>0KDO!#Q=3k$RI(qp6jMZoWE(!_ zCk}6#U}IX#Me83_nM;4lpDzE5|E`PSpN#xuegtn5kM3t*AhUl^b?0M;7@qu(Ey%eX znW5*tqUTr1s;=cfv|h@61=TWtzZRt@d$*Ovfm;aodq&}ji;7A(*GZjKnhSm-M?`yG z$9Lstc=}pIA8FP6AEO>cf0XJYzK|n-aA%-Lvq=r5lN!(mx5pJs6@0_GR4j8XmGKSm zQ(U>pKaMO~e4pN4XT`P!XY_~W>om+O z-cPR>deaUhu2L0r^|m?;`PixiMS0oWI6t~7*rw;LG?$AzH>yWY-&1_dm}&d3!H;s4 z5qHv=qa7x32OixeY30Y}na*a1b0-6SFW&-lN}D&ytVz}gziPX6~Hr3Os}hkCDSHpXvBZH!K;XO9fb>Z5{4Z&D6{Rl6DW?D-hKE|btsJ$m4n)jTb3 zEa}&a&!CF3l~Ha%RX+ddhRn7x?Kloq=MiJI4w+=NkDSfyQc;AagScYXaW}-RWZz#q zUz%bS{8Z-*=4ZiH=bUGqb5>0GotXK##x(onyOiUYjqcnKw^<#18LLgRcvIp#X2Wb0 z)G4RqtKJfsB2uFqKAlPWpnftYvmtBCF>;SOMOGXydC!Or@~!Z&;|iZRYDyn#KCvI# zvRQqicD9zxXPa)bOj~yUCZW!XuWiSD7`_%g-C-F$V}7rIzB}fIcy-NzWOiUQyhdGK z`PkLqOVCIc%E@SY(D;rY+a1&=b@eQo4BaYknhaB|&VnB0^$k6So>|bNk&&Ut&@)?X z&D>A=Axl^RtKQgb?ULErvm+BGv_zXYomKF>lT~lnoV(0ZvS;Byv36Rk&hG*;YiHJO z5!P;F677d}xUeO)*%GQ0=iSnRQXsQ)4;P?jzfyy_|Z9wrHX=K=&8t zTfE%Z%;%%Ju~=uN(H+3%26Xr*qN8{wzg@~Ls1DIk_+5DXzULIX)UcRx#`D>AtO`Zm z_uIi2Mf)mDb2v}UVHZf$E`ZGryXrh%>NycbGS<+vtk}OkD#F_1N;kAWDq`E>yrUi; zt741JNBVp=@5IjlS7E14z5*~VaA=! zw7Zu5U9-)!i+eI>>(_*ZV~zn?W^Q+|b!^_xj!nPKQ0HAfch{)zgHHe2mFxDsT+`R1 ztNRDRFENo?w&1 z{>b<88+}LY(PDlF=P;Dtna;_UE++QyJncUn$~)q|52I(Fi*=&Ml1^{!wY-q~cs;*u zY$!1w_xnjd{&<`h$JB`qI&bw;dH2In_lchQfy-Katmxx8G)>Hkz=OS)XM7^P(xLy< zAK_5WU2P=&2fVV)Pq>@;39!Lz1uLn3O=4MWGRLuC{#x+7>@}}nouz0u@nsfdm1eV= zc~(0B@}oR&xAe#{3z=?=wYkKz#BlBN1^Sb$=T~PPRhdHTMsGjIraeYCM^jOfF_TuaTJwXD9a7lKlPP-riYRjGR4dDW^LvNwvW3W zySQsZkklQ9l*91Yv1;io9*3x6ndTgHfkd5_oUf^TEmzW|Ftp#w)pROcE|#7xPrLH( zQ@Mp}jh#zJV#oB6E4LPn^L;B>aay5|vjX}++1bR-rI^zwnNW2-I&Qkh$zrfsu81xW z21`rzv`br8jln>U?y(#9o9||b?agz}%X3ma(fOL!Q_vSKNn*<4h<`VYQgAdf2v8OJzFVk`)KQ~lXyH;$e8 zA`RQwrJsgB%gITe$|wG(#0cZDp{X~QDIZCdDj@ezzSm311yDi7{+qwaSaoNuPL;WK ze5`V_@pCmR^L%XlD&FI>OF>niO#-P zH4To7fV+=h#wTg;4WG$>s@L*;ab)wCvX>ky{?YyZ`)IPbf26+xQQ?&BGKsVP^qN*C z3za^*YNoTE&jmSJleu(Pf>vqRkY_JkNtuOY4)@<$YI+}5PU zrP{+M^+Enc)26S=XT_DM$B*A1*azoQTjejO;)ZZQ_T7uVQrD@H>Kn=V(~W} zf3vUJbk$5d-0V)v;9x;>2Gd%Gh%4i zhIOk;xp?ASu05+7%vLo}pG-`-BNm4kjC_Gx*#@yMJ@n0wP%loW02!iclhx|^KCJxh z0#pXVY|-a(9`HMt5?fx$_l&)xi*$ON>GeOmVvV`B&RoWFD%VeVO~cD9cu6zJDpQc& zuU6}-)+cU=E`yCG{LJOCtZ(YR_D#i}Z#JKZ&IdegiD%5klSNtZLHBhoOjlJOzZ-1L zX@N@gWM9dr3;#f*N6rAt`c8BeR6)sX(2(&BoMtOpm2nBr^Q?=p5v6PdaSgL3&Lzf~ z#0$W#g~!!pcAMhA{w8d7evD&2?0#CD>h51EWtVd8gChTX9fqih=-k?T6g?I6!e099 z_dt-W6&mzi>>kF#TubB}WBW&W)REw|nKRXmggMpe(no$TXNA4PF7mUQJLoH>`$i`{ z3LcRPOMX6ZD32#Y37=M~JWG26EJK(rLl~c_;ITjbI-sUqw)@(ygP_o~>!43+5YphcU3w;uHuFrgSbCq+`D#iWAE=7wV&n_@v1xPucv5D!s|nr~ z>EJW^?AgwxX2&_gsl1mSGyL25ZFOGmv9SN-kNI|o{L#-6yQ$$LR^>K&G6~z z?Q4g{lrQFb0ioa#&H~N%l_77?kGO00io=>%J3M8+y^E^|DR#dSY*1;q5v%4i##jx6 z1w&;WHmQh10t5EVif`)P`=?lQn3&K5>NyhS_wj$x*sQ=A&^>ePq zJkeD?EymDgwktR8+IISplG(|n=;GSAl9ghKWT`34>d4aU-CY5YM#|4 zR#UZjeyu&#aeO75+#7lQ6Hytb6RO60C;6ML)$qz^axOzTuQ#{7d|%3D>VFleDyvhi z^t_BOn}siXA$%lyaF_wUA2j{%1-s0(=6Aj|Ce7{-Ub_1aor)vBXUgr4@W#9H6Ro-5>`qOD-w)+KUsr{R9!AI0 z?TIMtK{&hQ`GlCb%d0ZInosS@s-W`ulhS+GCBrjaMCODvb0Cs>vJ ze)f1)vC{>9_d8#KH7@0it8q*{dg@~}Sjg!;4NW@BPaNm0ucLe0(#a3w%1i5Qn62{% zyVOlq%x0JQplnC5L@fkPn>pfsj}Yv(_JsMF;!Pbi)6oV)3}4J{7Q>f%qP8`$7sBN~ zlS)LK1@W3Mgn>C6eC@tfuMdhJ6S$Tw$F&fv=SJyywo8!%{%6rBRgaOLy-vN?W7KD# zmJ8033woA#+6?@E3bNQasWZ94MnsP*zv(Bx>tK2;1tx9=YG>l9TPriM3|I16)PRrW zU8KIxkTVN%UWsM@;5><+LmOYQ*rfCk@x80gQt7vGDL#k|weQ_@Eb5G*LQkZHGO1+K zb=8tsq;((nyQJt+yoD>g8~jn{qVsP}{_WOV*88y1d4hEvRTk;9v+kwK$?4;K=h)@$ z8IyT&T#v-!mF@ybRY}j~U8CBtt$9pK@6V*R(it-3We0*@oj3EdL@snMr+(B=jnV0q zYl56yJ2kzYquZ%`M%Yvz%AeduzUg1_(}GG5+9RD;>#IZ-wapT>P0k<5E18P%yWp%2 zV{FwcQx@s>?Ae9>?jE9T=aJ%{*evCOgy-FNxCwGv;cmdt$RzSt9@3+(J7B4#`QmTXz< z*&;H`4Pj$-<5|ACXLl4qVSR!|hiDDHOqo(|`%?d@^Ko^<9;$BUUrn>4UrIzttd&y> zh|i$v?^ooAe*0kl(TAcvCyP58ormo?C6_Ikh&sz`-tXmFWv0Gzd!FTGu2z>yO*$;l zj}p_=Ar(bgQ{FMJ?UR15B*%|`pPn=68STh*dE!31lB?%%WFKue<@{J1>QnIqrRM1+ z&Gb32ItjB zG%B!a?s7$}^F!EX!KMg9*r`O;_fy&1J;KPtKNIeUUADR0^|YKNo>rK$iRsp*{LID} zpLy2O=7TEo>XL2*LzTr_@Kee@*2VhRDo|C@Up*aF%Gh|8nwHlCO@p9@hJr=`O~eX*WhbbDYPm5XaZ`{97N{^3CCuYfSm zBy@RuJ@r<>T#D&Ad(e@=FQUIbl=C^QY6v7t;-q;|VYFkksUq_aX$-40-m6e)TP)mK`zAcTsP}Br<%yjGc!DVYf z{jW-}V|kS@BP!0+RpDm60kiZ5EF$9prKM9145jmAPnOS?maD^`JB1-0<6E&s*pUA? zo0M8O-%It_A=DHPs4~0nn>4)X3<962d;LR6k9$+LzU%k`s%O^=(bQJshN{77FPwpCxNYWe>$wZG^K@lx6sq(`&< zo>}^P=8Zb0@DLXp<}50{l&oO>mTt?jS^1H`bk1HGEU&Y>61(%A*lVUx{iDL$zY~VZ z_fQg1AGv6hO*t@F{x!mHpANo|Ya_Q$()1wnWHjcF&22Z8Y-0{8B)C!La>7!;$_8%p zo%{`EQw94wL){Wj_$i6~{5;r_xdl17`RXV_LxX=MRu26$)s z%AW7Ej>|BzVbL@W~VSo}8=8Q%x8`Xs@8UGj+D0f(*>S8i>UMFV+LV$G;tCII8}*Bvl`>)|F`fIsL*bNo13ou zDyg3NN$^!IxSuNOZDalUSR6N792cW;9GySNx6Q23%L(iqStHghU$s)|M=b|Hnb6Of zDZZa?&*f>q3O^4=K}{X59}bxOZT$As0{M7s+bIOsq>sR&e;>n=tA8V(Ci?bSu5BL~ zFN>$_9#17||JbYW$yFdU*N1ZZx%^9hgkSyWem|6VK(2n}Fmoceh2!yz zU*#2e9lE&j%W5NeRiZko`B#RonWEV)@TFW_eucsCW!Xo0Hp@IiGev|dUMe0wy5g_Z(bYgaM_q&}#WT4ssO^$1 zOpEZ?d`es&)RjJGeJ1f4(HO6MD)+-(YQ1?#|WpOt#d z={d#rH&rH?^_scfT(_9yv%Tge?`L)p zTd&yX#9jjKEIbaa2pp8M&6l+r5wGRW-@R1lAp^5DEzbH;ytOfD57Ck-XKV4kO;qdB zKW@1!vZNE={Nw%fk6ohbiBqc?s?1h}Xlhce(odj!A(58$E-P0A3k4TY7cZ%n4GxSA zg%*45OKlW>&9cZ#rwq{vOVj$Mz7l*L4t|&T9u;Mr2lzTU`;5@t(#4X?vQFp2R4KG0 zM{S-|!^V<7C4)8os~wY#3oU3(uJ{;bw8DE>7tG!X)(lgwRHJwA z&CumA?=(MZs*CcC6}_*xqV7!eb0pPg^!le_lfIJQiNlZOzW0NF%D-zC)JJyReQBJv6@|~&YeE+$;#FI7%V<3oxeGhn3-P7ck(Y$ zv-P6Qc13lAP&h4}xtXs6oL`!J#;?GOx--s`es*1+jNT4 zk~w74k(T=7YD@>ZJgN*&_orIueUs!-N#_P&NacTK*teRA2K4 zI^{XLeW~e;cl0!|^INWGwnUv(jh|MdZhX@$!&u)RX0(bc(DY2~!5gs%$Kq)~9eg7j z6Hc9Cp3YW}LT|0sL_JeBk#o8y^j6Ax$%qMp+KDT45(fLpzgJO)C(?ezChN8Be4y19 z7c;&0;owR)C!1F^TwzC7U4MMAuXS38X0K@8P-iaM=8);t^Ahd>BvK7jWkiUzbmCI} zeBkM^me!ME_O))KCfw%-H*+gYUaT?{#!B>qm6&eFs1W}lu|4{naT~@w9E<49L(b+Q z$I)c@q0U9I?wxA9HLh63L(+{;mdgy8Yx$qwiNRhA3vuZbRo60E>%HuFpyqZWkDv6c z;5C^A{HS1tQe5dHH>ysnSsgov=E>DC_tRgKN4*uM(*&87|ttVaB;#-D7OHN^LLRBny-j^xL3la9sgC2Ex4$+!Miu7_8G9^H;I zsdnybl<_N8pZ%p=HC<1us~*K~D6~z4Z8omP-(-xo6o)?vLh85Ru%{9mnZGY$cQj$2 z3?tsD8`sNy)u|4LiY|}DX?aS?M8x(v^p{m0B0|HEv^j zyFTu`a=)*eYzs%NyP$G88DpwHm(SL8TDenB7KLLtY<8L%j>!emD$SQtow15bJ4Py2 zfyFG!T5>7_)`n2*}&QL2wl ztw-tp^eA;@C3U~rR>Ai9>3Gu&+@o$1!($5U{wc7#LzPY`&yN^$Q8i8dZ%Y3V16@co zbUyfPaDQ>O;gpGw3$$Q4I8*hMw_nETEC;94zUqPgpPZq~8F=ZW6r10g8(TlTn%kQ2 zD|k(2s^s!4X3Y#wupjjum^%51e+^H%Tj$|wsB*cA@Hi?Q@1+`|HIH|$gGsIOmE42M zC*|OD2bP~}myfwBqiVB!?yptL>qlyf!mZ-ziiSe2^x0-&E?=y+7!+##cfEjHGZY#M zW3P(R;JNJF(~g%b@y7V%F!?NgtXCa8G23S<pZI zyV!!wV(m~W8}6*@Vp30N7p(AOSCcP^<8pX8wo6Z|W>Jr`SyspLDU5rvKB`LFV-1W^ zfhh5!Iasrb7E`J3Yo1yjtEuXvYm{Npo(V6=*0(D+b?DXL-(tU*hIA~pj(-nif_tno z;5(_#EMnpXjN`S$lGCSoU&-qZ<*~oIpL#vSamCP01LS_DlG`MqStbd2rSYCq!T&1L zd-#5se8ps|eW^j9jvv20{ubDssdmU`s-SRPtQ}MQa&rc=b`PB!F1L1DBcGbDskF@0 zGSk?0&6b&>OTxP4PY^KN8Sch$_e{L1pC@@)TXSWjD;+xdx}~SiTaz<0jjs-M&m?YR z6R_r9@j0wYY)7P*8<${a}oO~Q@FUylm9 z4GcM920zygpZ~J(6YRMBAm@AS)Ei)A+}5Z{=J!!lAK%OVf%w@zhNsJltvc%kUM?qw z$HIiIUtWu=S*6-7tk9u6N;8m^!BhD*{*+9D-0_Y4jz)#wVP%*T&jfLDl;Z&#F_kg> zLH>F>_+n5pv(fU*d2T&SQPv$s!NrDD3cAcQjlpf^)SB<@BZE5+^ug)s-mxxsy=sq@ zS;+SB)UtW;-1x7QCs`BUsa;#fli2*a@p>B!?|hUaCpM-vLS+X_e#T~iak6e!}K_BFbIgwkr za{ej*zLCAl>i5R?+mf@AwKA{Eux41BFV=h~VSa@_r^aTg;N?^Wx3ygxQjcKDAe;2M zv|Wa$hl(dQ)*7D3NQokdEFSWtk@og!+u0{{ZQa?YbP`u}P9RzluM5fNF+69c{x(+3 znAWX*ZMJ=!z9BpWJqGLYvpX#LP6m$`*sM^CuVTya)R!5QUDzhHw$zTg#1qVxM^lr^ z?U^w8m*QWTzhp``s=dksFQ3+^3)`l%KGr&o7T}9IL7zcyDi*;&7Q}exj)JO&lHTNHc$2DOMbtGH4@)>)>+QZRc1Ppb9HS~>! zHQUb%TTe$z96wIiem{3wzDrjjdM`0JJy&s0Oq~6DZ%Tb=Lr_W^-Ui&+#G^HG&;jyepw zqSJ$IAo2T3yX=C&I zPg2ijo^rC{Yx(lbd7*5}#bYJ2uO{t<)E>MLg~fW>A0@&%5{5Wed#$fk&29fNir)ND zs*m_WG`Sz5qy3-g!)=da*&fHXRRL7jWfM5ma!vkLH9LuG0xMEsdgo&Mf54)3xXX&~Eo*d30RWjO&|U6kyY8ob&8>Z(j$1snr}apGBLFKaWixp;?Wy z${O@B6PS>faq}i$deXbz$ms+8cQte)~io^G3F^YW((zut`Jte90Dk zFS?(7%kj8XUz>CML!SG)dlipPy36^U$+ln0V=ekefw|b|AC`=+Uei;X{M648jlZHOaG8dm^fRANJk~>|ter*rcN6I=nsnwsb64<*?^?F2lSy{4-@B7 z${Mc-4$*osJEcjLL-zQ@vG%V;fq=Gwt+3SIQ7wET8<}Q3i(lNC!$khK=r737Z{+pR zMO?|hO!-&k#!&9%li_&ANtJR^-C^t-!5VrOolUO#<0gFR1eIoVq0?7%eLWFX`Nz#i z6xSMhu@i?gufKt{;Cke5rc|>VLU%-bl-t>GIFxJPz~K^{GW%#Kk7mEvfuNMRy+gT| zNuwaz@cPEhN-I(7Ov3Aq*hIb&wP~o{$rktyz18EEx<`F4-vn0XB6)P^Ih8uM+6 zjcl@w%wt!jS-ov6JMu41NrpA2=6NRnqeKf9v5MI@f-(^2kr*S-tZ0|>`MO8tYx$m4 zJ&6AY$5(C&@khCRychgX?!#YG8JITve;OuBj{A!omn-MmdEn<_<=)EK(UGEiZWLpN z%OBs-db6sG4NGzLRf?_~$^rt9{Yr`@hofSiRz!L}1vc z=3PtEY!v-e>|ZC#oOC?03m)S)C!3w(8&LcG+n^s)3;tK^)0xW@G((90u0s!1C#K-F zvqqDT@{6-Lf0(@)^ugZzk6hnG+g!zm?uus%$f^8)BED^Z;P2m&`(ZZ7>NVQkmz)fa z^+f*jkzR}^%{|j+eIw7l8hc*+9PbfzTU^^*bNrmAAN?13kK|`F3#LVA)6PIMNzK0L=fv`A9=H>fjhpL!m_PNG>DCC7ZJ8Q6Jvt4@~0N0Um3{8>8x0TjqG$ z(Xe>%P9Fa|@;kK%tL^v055E#DQ5Qu^$Fy{9vfrYGTJ_5v^#QLQy~RI&)rpyGKUQUXvbh7&fI;To2AbEdvdSmOxQdPo|?Nr zr)3CD$HCM6>dp(~TTajqTNI{R{UjLrL9oQO@*{^PG#lf$#K?k$!|zeIK%sjynqiM} zNTdAETGrgtS06u@)d83~m2DUL8}^$^!|Se{@#dfNKvNIlk#M! zciZSVa*h{NXv*HkXJdY^4}NbFlaaEZc*RMa?6{UUeH`_ypyAPqY>Wc$HN8S|e%$T! zGckUnzx+lVpY4f{ypaFVSno?03%{WYKnE~AcKb;zBQ;L#z2WD@1S_eYce9n1)HrVX zF|DG%3{#dTSWU|8s}+aLTWUK@_3*=MKEo2-wbJG(uLH~nb8I5i4+J!)0UVfviI%W37YBTQo0&8p(;|R}8Ud7OlRfjOTCR3#iIU@5hTUJzaZ=Wl#&guR zzi}$UGglL28X;;N?S|vsrT4oN?f2W8dVnlCvCF(F{xSZXp!`Lhh>)kx5Z<^L{@{zG_=!lq+#)OS4 z`APL$cWT-Usb?}>lS;-i%#f;Dy}H~yH!Ab~R_B_v%T#iYY4yGS`dV}@sHAn;W|h-U z@Bc;~sa+L33!9c&JVh5f&9QFn@{F=0Q{ThRsn^8EMf{{mSKVVan64c%R?o6^M3T%J1m)v2L&i>GvHf6dL!p!(E&6h*@FlRw7>R z*Q}KvoNxSpf+1Dur+?Q)`?^bPv!$}7={Ud0r3`}oC zCa70)zha`r@>i-MYB$vc|2&<)V*WZBbDKobk9;u9POAF9S7Mu(OMxFecQZE0@#;BH zKToqAhVqUW=W`aD_aQcCMkO4<^=%{``x#;>6oy1Oy1S}=)&xGUeGRAiNLI7yFYh@? zgHu;~&Z|)S9z8Z9P3yqYd~mB3JDPJmQ-Sptfv?5CG2;O*N4@5Q{AAAWxHYSPT>Pkz zA$Fm9$T?n}9^1U*a(Ktof7ap1>l@msXPS=VnFfo@`x2RV-6fUdom5S;KGF)dLtD=A zOsCafZy0kBO|z1AB(B$;NGFm9TqoYr`@u(UA7I-#AI(Sd7R%2eC`^RDgPaJ3509 zWqE(-r;fJMeC8Z4j@a430C#JVd;cQ$c3v{A_EhUZaZc$mxF+gQs)_A-D$0%w8f`N| zpY?vtdWUH{o|GNka9dmWw@oL-^!-&SH;U$!7}&DKK4gn26M;AEVuOoL%W1DC&Dr2` zF1Cs|E4H16tv+CjENqr(pZL4B*zw1XQNhL^@&k*>`%xKe&!y{J*mlwRbS~Yrp7))p zDx1%$(UWJY+Rfc6JF+oV{bi~qWrk_yrTsWDA6j20^vZ>{=xRC=Qy8#q*A|QSf}@&* zpej!=zJE-W$!~;Zr-PXakMV))kxn; z7wbDgI2f<*?szn+i?^$9qRi(Sdn>k+`2i*8QCI(ra}>*5`;fWrNQInw06HGsu=iHJ zZJic@t<@eezIW6>^h|=d^jYz@>bYFM*|r`2%8zbS0Qxp7B35Zk*Cc)|*5*_!&1Ac_ z-ATt0`p3z~sAz(2=c6&3W2huZh zU1qGMXJQ%aa%8NN=8LqQeX{O6XuBx_lg=%*ylNHko@`u7XV;mPyq{LGOy8>Y3eSDC zvx;R$HY>OsR&bIZPgz@-kFUheu+!^Id~*C(YLimLwX0#oM@)}m^^5ynmt|f6s@)UE z#}NfyO^N-wv2rEHH5<3wHm*&sQoc`CcOr7su)pr9AnRQIRxNsbW`?XjAS-lF;Si8eZ~3{)6LDWT9;_T=fB0 zlUTYo8Lao3><1{Vad{oQMsV#|zBE@TJrmQ#_g5FsENnF9J~xQ18ys?ae|)dEeVUE7 z?Fef+jzwwx#ZUKEFK3>kw{1F2xn0dH=Xk~+iUl)ai9JtOZ zu8k&9w)4B?M>k*FUt8%d4S3T1t*<4|cq6!?R!in_;jqSi{+>E)`R=oJEJ@xG)9Daa zouH@Sw?RKTw9}aBxto}TohEKe{|fU+bRNh@;Yj@6Iv>Y9lAW#Siq~3I6`GIqiyZfz z{QsNa-?G+zWUc=DsO}$7tiUkD-|CIv3r_d!c9$5K0XgmJQPYnW?>IE{^Z`A)(q9!% znvHq%v(Y`wUQQoX=hL+EK56pb57NE$nfq^j@cCdUj2-i@VCsf~!w(LTL+43{a@0S? zkJ4$&PDOSF-MB}=m{CtUlD~NFaPWVFpX3pA3x06^_+Nrz?t9~24}Oh`6t{tR&5{r0 zFVvje1`CJ&g;)GPIj7IX?*8a*zm$LXK2cw)ubCUd9uC636TA?~9tc{P*X{qRLyp=d{x#fO4<3eP z`dP4{z3cmf@OvFP)};%No+|cE7(N~fKD>{o4uUtn9L*ZQn&@rtM5=i>l!#z=REH+J ze=m<$F3qd36+e?Ihvt{M_e(>G*R*@5K9(9vy!C~9%)BEyy5`=ujO>mi8aj1q$-4LT zTJT2nO1yj5?<$;2HChe#tx7x{za!;Y*X1f(+&c)z+?Q-Xzaw-5ZzM85k?)JE_-#8ezr(e6j* znBJ4J14GBKe01NEvb87jo?b{C!@T{^B+`X}c_pv(s9ggudup`Iv_uCOq z;#mis&odO>cm7OC+t1(=`NoD)gW>ZV%6nAS-@k*m?wjTwunfCI4QJ>+3Ee#X&f!3L zA~H>wD*rjb=UmDsh6mvq;M4lILl3`!AOFemclbm(qeZYxfrou1XBfN`y<4ktKBw}1 z_oMzXc|xt~$C>`b=f~$rj$fC-=`8GK1;Hah{iZ{`M+A(c|2~i8H;$m{br`7d4T5!I ze!QAS{p?2N`&X;LXN{G>F0M8xsbRZg<)7jNTq?)NTyVY_u*i80<%qw^Z{Ul4cQ9vH zax8c<&TkPos=jmloK|P6Ha6xmQ+w18tg%%F3lE~2HScu99=LCz4sVYfUvO7=i{Hg+ zO;)N~c@1fI$>Yc0Q8Uu^1d&Jb9~Fi=tgSl@%3WdYd$D|6?Y_QYc)JuE-@iVKF7ZZR zMSt)XUlV58{<46$yV>V=i8N;5-5t{KkcO!Hg(!IVyF%1+$@#(rTZ{JR&k!_QD!549 zGCwT>J0ELj|z^+&}Z{MgU-I#y9a~6a8H}$;l#qUu2IgollY6wI2@v7vGM-tx?bx~EMrWz{4pzK_tG4p|U?*rRgCwjT=3T3)m z0(4PnMI!;S4&-+-O)5y#&g1(HbN2yr%;R4q=HeKuim4cL#%J6$pV8i;-DOp>8C_=4 z`dJfikGVzHCu1hI8FOaQmfxZ+x{?&5i~W{pdR|M6hPGIlSVPtFqv|d>etKvwM9*fr zip6vZG-dny!fmzXxbBj(Pj%}*h^;ylbX`goc_ley%#T_2xcu4U-7@rF$(2Hv#2a_T z=qz5-Pv50}x~=V6mtK!~vJpDvnSKqO;SzHZ#8mN&HAB)}BFWDNPdx_J9cG5(LC@TE zf1UW0RaY58lYczYd#~K7@=MRw;`6(X&tFJ%tIW0U`)<}qd@cB*gDpm%*AlL~iEDSo zm=a$RPw7TeL)Kj*Yft8i?MM~+hfyw0wx0e~hoO0QqNT@F-Imp%?>^opAEJAe_yY@c zCD{>i#_?#wfU4jK7=2N?KNTA5gaF zI&_RO(_QtiPqDq-nr~j$Y_}|C@>4YW(a)cLAI*{YGl|@p=!)Ji^*M1IT<0t2%c!SE zvAr1<+}yOsfjNr9R1LjM%ElGnAhR z`aTnmbWJ8IGF$8umx=Pa>8rhze2*xQX<4B3`gVuK)nH}fJ?Qk&>nmHuH22hp>%F@F zEOe9Y$TfkY`BOO?&WVYSALXY;F?7)~?@8w{p@x77=93u;F1e5S^p~UiQAmu>izjF0 zinCcvZv;Jb_~lQ!|6ZQE*T1l|X0NXpfo&9?zx4a*F_LmM_LpP}l)G)1!_v1HB)#K|E zd6i%l@8XP^M5i;5bSnsZ;hRwf-cef3xJU4L{nO=kMO zkiW2&)C?38`KV8=cD#jV(lHFDecD#l)Imf|_1yVWqSEllaBGSxweU||6>PeFXL6;+ z71LiC9U526u2`kt1gTt4D>K^Z$%vhN6fpZ*&Ov93VoigMWn0Xpiz?`M=Miz-q0`p5 zA6x66hdKo-%xnf~(maP}hwd%idBYsJaHQ&MrFNaOd?~M@p6a8#KI{lHD%01g_X=j` z+4@%+^@JT}{ z?(^j*I6x6mcWb?!WRBAGxFY0@(_a~%ej@*Y%eqI`Ws-R2y2lcEr|9V-ldL;Z`spm< zJ(ykZlU=XFME-TeRxCPuySojk_q%J&pcdD-o8yleWO^pqhZU3-t zwE8GkR#_OWjHMYg%$0WEQHe~SG1=gokScx z)LjuTrOvBY*fcga&M}7a&OD>KBW%~MM9CfYWPEno6=Ga!DVI8L>@n4Hn(n}`*Nq+Fx>Y`$f0>1WN2K1+PX#M6CDA3< zJ=QM#^|M$vDoZ}<`a7P-DejkRt+j7dZX?5Z_3)oF!AoHlRa|_Fdu*sVU zm=?7w*Hqx|o{I_%TxuV+L*yUABYttK8E%UApO2z? z@(k6bsfJd2h^P)}X9U%u8#&9N%Xn1XM$V?$0Gc)?c(6mB+nTNnRTaM%o1A}-X zSH*NTPqS9ElyR>I^I80BT6Q{1cDnf3?unaJSK@~aMSbVc7LOvTVodKTsq9*g@Ngoy z5=5retDI`qBf%Y03bqTn40a?UqCfRq>T^`jh`rG3uMXguVP1a{-=-a74$+<}Cf>@iI69rM<}qjSm?@tdN2^*tAljkwu`5iyZpo;huj!SQ`5Z?a zHOI$YWc@(ZIm4u45ucY<3dkd>);70_VYr+Hmn9Z2<>VB%)hhpMXDN;)LPr&#^Bn0a z)ot`C0=3Ftj%nr|Xyu$)9G9YIsN#mrfYM=PJ>aqbbV^ApL%bG^19nhMR?z_fzx`hNpP>um5dXQ9y* zgvWWzZn)lFv%*1N8()*AZ=GMydb7SYOm+^QE!_58^f==h?GjEPt?T?OdD*2fda7uB zHKuSy`OuZ(H9eAPC1%k|1RECoah=tpa#iBJx7;kkl1}s3Qlvbm#iQY>B@3_~y~!1W zID_gI(Oq(-hG;`{{sx}54Ar*dKaHVEXHb1lKRb<_UC*6$r-c_vqzA&;iblxy-M2Jltg8!7ygV;1=FJ2${On5im z1-0-~xj$&fO&h77E#GvTnOi$&ec-gxFPH=5mwrvJRM=0wd@FH=za%5>5gvQX1gNYTe``MN303P^82+6 zS@WE0*^Q6YX-U)@bA4>*!80AoQMlsco zZ;}}ZvA+m)6Wv^ruK~9_;C|}8@h(j42Q4=)&U!1^miiNN3~wRQ$JJqK-6v+nlvKtTN*g#Y2}qm5NR9qW;Rcav1_KKRx$)WofN$MYx)Cnc#$;Z79qT zS;DFNeQy-&kyU8EfW|<5HJZ$~GJ~lkx3xHLzHwfYR}OXGz`=*x(pvC_!-CaODTDLl=uCv1GncUJradf3fPU*>sk7oW;1R^uA*i>9WT{ zri_NMyz4*YwNRUsfNAXB(DMtAV9!Cwb|k*hb~K?iHD2#I7uuynNs6 z^Avmps#V=$#b2fmS>|Z2Et1GZ*;Qmn>ULY+@{h_^0W zoOU1;5vKB;3oHAZ*fi8_Uk?6HqLBRBx=jr4dR9oY5^}nCdor57F@Gc(O71d7Z?ZSK zL1WLwKxdL&g=pnUG+S|B7L`mUEtl}AspU!grKVY*Hke6|WIC|fbYM-m(QlUcJXj%r zTZ$Xzo)AOZ&Xo^xb+NN0)vZF5f481peAscdQ6n zGh_CR*@r`8_K?mP3KL?f(zB~Jk7?T)^%2j?%%=R;v>4Brw!2nQG{tZwxOpsAs7+pA zxLGb;S68^%9^odx|1D+qcg5zhHEf=i#vj9CpzdQJuUQG&`qvU46K#K#@AS|`yvMF1 zhnU&-bDfQ1bRP*ZPoNv^md&TSOI6?U<+e?Bu!?OmEhd(bgB_1`kFW*SZ&0LeRnmJD z*LCVL$+VtBjHrqVvPRB?j*rjfwojx&qk&1EPbl4Ins#tm^wNFw zQj#IHRnJ+5^bj+oHL;$h6GALQTDC5!rYJJ4G~j`o=1QWGE9+yic{2BPo=g*}G?MXo zG^onUP1Z(p5%T%rI0i~1M9Z};*Djd_Jr6vW>sbuXum!ej2bHI$6LU+j7|MbJ!R?DbnJ5Jg(3sGhdZin5H@~)xl)dL0fgpW65O7 zESP074>6O8tyGTv((Q_y1&p-e>LKDPpW7wM!d6*-qD>1dQQN_#lva9;+r3ZRZmI9m ziEUeg8;iXy_MTtt?I)O)@COzp-Pb5dH3lcbccD{2Z@?}C=IZ$w+SugSmIbz8V-y)t z$26N|Hfx?XYs)cHX0xnk{(psOJ`+`z?q%8^#DAxDs;UJGwrjgsc`>;*#2y%WAa6vs z<~?PsBZEWFQJdv=%*02G&r2uqa=faVE%z*phreqc9xI0~sH88}sSEFVmUlGoz(>evTp|)&(r3m1I-j zt7XvRed<37Ug$PIv*{+1pQJ$Ya*_H5eAy-1vj`rub zHF2&+=1x-ap=utU73Tq-Us`uMFzQXYHS)X+U9<2#$7XRZ+JQm!rfCLmny<$wPRbOsMqY6Z7zuSv(!x`P5CjkYcOW%?cPHY zKT?sjzB5zzG*|TUSsXHx(jK#v#WD8pA+mo&>(;mNmBgL-(;J8#A0}38qIR1)X#Tno>sujL_(-lhV@v13md2W#={)IU=V$55&b5Qn5at!1WRA?lJ{`Q4@0;GaE9nH$ zm>4Cb@1CZK`)o*}Z#;!C!v9hlEQ-Yf( zqpD*5oo$ucR*H&lu;tVTg=7_K_WoAMAh=69#&uwMn*E;I3%7Hqto@pjiPQfyOoZua5T zs8l!dq_=zDz3#G?k}g@xUY0p~`QX_3bC;{&b(v~$DPHANvXwWE|9>UFeQ+5~U97k1 zSl+dQ`TFtev7wW`gSYZO$Mw~R@EGP#{ou}p?V8u}yJlCgh*~?_9YqeXz4R~enlQD{m7clJ&A&ye58 z-!|`!&mg{FHre z@8l|e?=q7RedEW{`_tH5Z3=iOn;{m*Ea@x8lWD!Tvst+9A{Qd*`_o?$<3;iLQQjY3 z==UVv^>NmQcs%->*M+~%wOSr|HVwB4JNHd@FblGnpN{`h0Bq(G3sc}uUVMQ zy05umS`};3Xre}8;?t$e8p+bU7kng)89nl*5T2*vw#i%eG4@Zfq_gaTVmP*1%EM2> zme#S>3L-2xv5SU!I>*!A7vI6a6k)PS?UOLod0=(=l}~o<34P5gUvX}p@P2y2r{dX; z9792e)UntPG@t%=rToN`(Twwa*6J&4ies$6}xee5e2SAGzi zPyWJIUmkz&ia1{x-;;0bVDN7_&T-9_t-y11XBn-x$9jA6 z`$S@IuQ6vgSl$xeF1Kz~J+9eK^0dE8Ox0YiYQDFR+#T64St=EJ{jDzdeI(T>onx7g zBI^#zzv`DQ((_oEj+$-Bj!PI_L(Tm~&Hspnp$dgkh*>ZP@;6M^xx~abVuAeqJ90lN z#JBPY^oT@o-~w$CT$*lmjO~=hcjv2D!^AXdebvADK zC|4@kEgABA`8Q^bbT_;ybZ5zPpUUU@M(ib%|HJQfHf-D3uqOo_US`7{jtvXg$-@z< zkNmo+A<2*wwBO#(Z9Co2Rzdf?;ppMuC}zFlXd(7(8sk%C`da)TSrV~*{0NUV-JD8w zE0^)Itn>b6o!w&Vv5VK|F$Kg|Zgs})%4n`MRuBay-R5-1gZitH>LW)nVzW`_snjgb z2I*S7xvgxjyEwfBO_QvnpKy@&XE!0_`6x@niiZ922lD%oV2pVOI4R#O~&tUye=Hu`t*I8{;9lX+ElC8 z*em5Rzy!=4l~ho1?Rxs&PnfWlz957|GWTNk+<1dmM`*FmL1@^B_$%jp?W;xvYy=?LKQmIiUcE^d#G_T;Ms@YF#(#LOMEm*ZZO`ROVjC1k!5FkykoPVCTn@eL(wPY*Y-gX zN;hVq=K99GIvHrkW55aT$xnD=B9l4}B!A*x_1J0j$%M4)vEzLzTnbUM&H+AZ`<2FOld=J=)_SX_&p8%5c;PY=FhL~%b|d{3{VX^v9IEqNWbTgYW#csiP-8n? zE&E`KF_kWzpqP5(MIah)O+1*NhnUZPC_a19*41w^$=CE579S!Ozjurhl{`2^rlbU2 zUr=N1NIr}|KNAmp?i2%8xB7-BPAy||_Jh76j+e$`mH6{DeM7rxwXsd@0>@hE%V%@q z?>YWnjU_jhykt(%Q)g4@j*C%*^?mAiNGz^S&~NJAE#Hf5v#a_%Yn^Ys4ijic*;NFK zcrfzYF>V4sts8KdYMq;5TV3Sg=KC zN}tz~&z4P7NxP27Zr;lAUXAS~q$i`RJ%#=lrbK9~L})^e?=))ihFfl?-FAWg#k`?; z!`SZRdc((~KHvO(sfIK|+H6Q;PUmL9J_19UA*~*1I}#1S@!rV(=t;9y{8p6wKJQ6h z+xl}&DWB@{CLtww-5iAK^s=(7VA7EdqlVE^jJ_5dI*I#bN(TO#sY1q+7*8_JlRT3S z3f0Op!5AOx*#o+OC*2o&bI*)uje&o2arV9IoH(lO9o8z`OPNOco1B$SS4J<~W5&U*{4 zN>S_KupW+mLCj(&+AvczjY>2c!8c%?p9`|z%I`!c#3jVPJmZ$pbVBYVwh z6iU=ElX;}s2|5C1@KLxp5PkyEi{d+|C2X0?#c;uv*hb;5j#Wp)5E`ZpHc!P-Tz1&7l z&pWx6qjDb`%zt;s%#SgcOq|9PALJavmR6?noXagX@qurn{S{TUy^|t^dZbQzv_~y7 zUC|<1Po2*+WA9?Up=5z@iu0HRiLD?TQGTr2Tc7z;`yIH3LarX zVCmxTD#no7f4Gc2!7YqMQv|W)Z1JN4)rig8u|DRKKIX-u89Q87>zX!~Tk|{kNVZ*^ zj`4pmcwA*vS!_!S9mtpRdHgo`*Wj;%zliU=>uaSfmeq_%V}lR!jb2HlFg==uXSQh8 zSh7X4WU*y!iUz{tE*wh+2OLKXt8$$Z;lVZN_FA8*J(4O4TWaTFQFr86hjKnx&ttKl z;T@m^xDq@2ll+9=;}L6eHRi{(w)<+n^Tw-IRoU54D<0=(cigvpFlc(5N8Ogg9Q%=T z6)V*Vq1DRT>S#_RQ89d%XQaqcn)q6;Td5u+y@oVSAbY=X*Hbkruxx0SY{)bFu|lB< zMdUwaXd`AU$$<1b{zec@wYm;zV8zcKjpK*6Swo~uIv(% zY%O3eKz5`kR1iU-w@{!V?Gw*^$Rm251SZUOZXRC~Ogw7sT= zwH493YnNJn?T1cq*p>6ax8eg&CA#8jrBeB`+)AYXlf+#3;)C0mZbf`0tUb5nXAOT; zUWbjSyvBjNp4TU@nu_|VoDq2Zw z+-3nESC@Ofbeb}J`E=_QtGjLlfgj{qLt%CHL}fn|ES}51)Z&QoKDyrzo!0D1?3z|@ zhO&3@qvUrSk7xWUKY1OtYr(E4KDiIA2fVj-u-QKOZuiN@QQNF>ok!r40zSkL_>eTU z^N#aCAbIPS@N&5|2}7VE5T3D{Oapy^YFliAr|nc8XA-G+&D#d9i$>58Xj{FtW8^Ln z$P8n=F#Q9$UN|q`9oM4F%Co$Z>;f(tJxle-aV)$lS8UL~1ntYs;J;*(JW9fFZ<;s5 z-jL&j&8EiC^p&AuvOB#lhFC*v7rj~Y_wt)!W6>UL3TAU{tnX7f6JF)LRA#8j_>Mx= z7QUC;Rm+EEq@#vv8lT8CF6f`a*c3Z2b)N@L1+V?{Tv5+lhCxm4I8x2uBwEqi zqrtZ6-gRf)^4r)+*uuu5DI|8h9MhdCj+xp^j?^^|6?7M~YP7xOyNVP)DStGc9hoJZ z#S%`|WS=;jSe;PCv{L#>z4tzIz5U0Pjwo*{AGsM-W-CMHA78KN%VA0Rw3*Nt`v%)^ z*>1yS@aC^1R%2o$eNN*&qu!(E%%6HB)yp;M1s^(Y8-ASl6s}xnTMgweX0;v5Blwrd zmR>^GqT#?aIi;GM@C~X8!N*~Ew)8tq@AtNcS|44%`D%yw+KjJ7i_6-th?$F+#W&UrT%lDnGhz z{`lGPBSXYey8qSYm|0{}5}9}`_W|phF2*V0@nLJx46)<5e)9nRwA@G6kFig%3jLi3 z&?hWXzh4tBG&g!7vbeaN3Q(t#*XY1klCIqL4PsR4$?D;?$7jXOc>hz5PVC@!SMa;; zIUpurW*^Um6N)FPd?B$;n2>C4MiGwP3(Rb29K zu9dB-kLxV0+Ot``ef1czW%QY-9)qJ3U0{>LoK&-yv)D_|CzLV`x{KbJ24fmfY%G^8 z2J`hBfhNzK^p#fPznJAkkreBrVkRQ+3EJnv<+HRITBxvPC$BV0y#h+K^LQ~<0pG(9U zv>|x=dagG=|M#0h8+qkO{IugB2~K|e^M6V&Klv4d;9nsjz8giEV3&t7mJ#; z_}P_po;+o#u$#(%pA#r_QxRlkA@7S5mcO(PwzUatFDGL@Yrak239~lytKAlD9t{32dbMVpG~c@{7OQF_uv2g>zeU_z z^-u)ofMZj&tHC?eNKeH>R9|sVYF{_PccQSpn)oQM z$<1fB58bsKe_H9>7Sr2aJGQw^mOD>fBOPf}Cf;Xu?a;|kQkTm?vgHiRo-?S`ITIx5 zKI(m$3iVR{dp5E({vPk)nT}p&osBUx#;}WttZk|)It|P6T&7!`OC0e*xSwOW;@f*T z><6!-uf}v3EMkBAxk|NH)yJoK&v-WM?W9*_<@cITwv%ZFT#XZnP;;Wm{Max)Vtig9 zW}f{lOgAx`ZUVm6dt-Q*)N}tR*B}a&u%pxGQPbI%Z8tCIldLSqdRLdp)|F$Xv|^T* zC0M`n^7zM6%qYuS(wA(QX^NVbv35|3nQh_s%6i!iGxrTMrOYt%o0tXL6*Ejd9?cxN z%1YAJ5Te{Jnct3IoLOpwKmPdm5n9`bE3qN>+;Wvy%RSRt@|ULB7v^V{I`B9S_eVOVCMBw$Ew|%r z5fyxo&ox&grdDjqd}@>FRt75Fp{LH~EqBXSmLi$%AD9*XJr;)KSNWakNHLnVB9hOu zOtSgbXJT{mO6KIvUJ+sLlE%{cs5Rx^{Z;;{el(6Qef-Hi@$KG+v%Qe6^GEVCzt`6= zWEeWTjRV>0qE@Ixmtq()45b*-_^X70HVoZg42^e{O^UX?hf5!y`npNg{WbA@ST18& zjA7|UMZ<<3HX5YazsD%|rT6$a466qcP1|JJrZ)NDmg@xD5QT6qCucs?e5kiiv-nUL z2&%y5L(PYF;X`-CM^euPlY7F_UdaF2w}y6r-`OX@u9T*T@Edv5mF!GLO9$gyzm=4Y zk&iFSMJLYTetFP6WX4i79e{jwtvd)WCz%? zN%rVT@!UM?nG8ysd|PTNnU{jYW9cHnqoSOeN7hxX(KdPPSvxc~#Dn9*^R4itvsjhS zBc4%!IxCIotV3fK)ycAT7U}s01s##-bB6?`S8(OP;b6^)`nZaiV9T>~HmQ1ml!5fS zD?uuV&5anE?7Jx+hY~&e_}FYZ$eh1T*JwFLw`UKyC%)Ztn{ZO4+p#TDzMqlu3$dWY z!0gQ>FGe@_UhFHrHnpEVf>tkl=ALyVk7v)R?xp+L*1W42 zT$#puCXM%^(fHUg7TX2&CPO1r@V}ku+vT%crYQ|~gU0m&+lWt9d(*V%8E%4@<0z^* zymJGgTM47b0Vq_ z8$Nwzo!$x};@&i6C)wJ>%+8XEW^Acq+rr+tkT3gr`#vvyot5|6_ML8f=9VjV^s(+d zczB&7m!tZKCt4GEhqFnqp}MRlz5=T6rm7Y3SI1<|-)3WX-^<_3JF<@!-x#)*g?X)e zV&UK}`2R*2!(-t@u18E}j1!h(#4x`7_4z@_mh%ZA$&JMGU_CBF4(}>g4vQ2dJb* zr2gJ^_4&9)t6AyXSf6_=*QCYzDrA|Ck4#ECV)HH2!V7u6+Vam}||(_0?@N-9r&YNc`ded6@z zfhiQ3C0x{WOpRBOeiB4eiJ*G9CftP8j9@MLw&Avk|E$Y}Qs1h1@P$)5!bN(UwKafHi#jdp>}%9H$@Z3A6R6>dLhYKcJ>1J*pJkfL ziTK|A!~xrPQ~?+(zRp{!6C?*fl|w$!{iK zK7|weMxM?~eJ)6*YvNM02I?7fLPWmapgIRNyr!{lcgMcbO$F0XGHb`! zH;Y~GGy4YXrt_yPpELGt`PsKg90zPoeKnBE*^b19)Nt_nJ~H*bBELT(uND{|>)2J~ zW~&0elJkX6BJ3ci&j4*uO;L8Mm~#K=OXC@Ryq!N zrSMn!J!zHD&)ClI!i~Sv^c77bVH$~VoMj`IVVk!0DS^TtWjY?H#_n-%xbL}S%I_je z$o3T5qCJ#P1zT-fw9(WoqOU7pb2j9X@qyg@-6@kTsrDoIIWg1O0Gkc-kY~fRM=rgG zhFr6``(kSsS=VlhT)*!YF9d&@JETG{p9kT9cuboo~?k*IF|pf2mhElr~M15SLl3ojZF+ceZvp9 zxwzGwSHELFYjwQm75iwF%ebnp99{o4bnl)3^b;V!=8gAP<5J(9QAqOc^-A< z!Adh;mYfJX&;iQ=;{)mXojtMPX;jr}V_%Eo9`V96Gj_-qU*{X&Z7 z>{S(^)>G={D||1R#vfu&e6}C9lLrN=Zph8&iJNBfbfcxoQ84DKZsPfm9 zpd**bk-;5H&Y;I(g2Rc^hntG${$CSBY-Qb_P1l5}cud7}ckIKYe$sHepF2?(Yr@8t zZefjWYWkX%ty{L9pREUkrqd^?S+PzB8lR(5eVmVZKy}%k8N)Qu(3$kXz8=u&YCW#A zZGfF0rZ>$_yXf5}RxDaa|58+!zln8Vlj}Q|ZDNn>ZcU?sQ0YQzQpS=}YomUqQw6E7 z96RQ0Rb~mYvAFK&xt+9i&mE3BEKlXAHbZ!p8N&0kd|M-Rc^C8gEJC#iH9tbd{xtRb z!X$Ye05-8|uiyq=%cGd+7NS#SZ&YX>>td^&SGWfgGltC@L}88YS7oN`{J!Al^ru%>lue0Dat~Tw<_D^LP4PF02l6*+$49VwSHHOZ z?(`aTN}Pz=ZcpqG7U#;@r(-t>TK&C85Xw8)A*$@T+V`p_t9ts?!OsreWDqc}bV~Wy zAU8AdR_MxYJX1y{oftkoFWjusELLfn7p+!cQ(Ht-r;#6Xcs#PU-6R)uo!#O}BQ)j= zu?4RbQ&sGy??p2rJw|eO8~J@+Q=$&V{kLmY|Qm|8(om6)m|UsV!( zX}lfMqtfqp%CE&6E={|P-BXqP>{F`lq8dxJY`d@;8{-`>JxL9vHLYe1RKC)Q{Tcoh zKNX*!t8*esphGigq%2FHB}>0cbZ!^qHPw1+U8EVb0<+e2O)Idd$yKHC=F7pK5@}L< zWrqO1$@_M{FE?L#65Be9Ijt|L-F}g(uEkGku2V7-Q-tg}Wa%EwI{oHRhHBJu@-TDj zKGu@zI%>Qc{!B1LFAve_cf!Sh!Mew*m-LVJ7-K({^$wMDBw97X1C7r{)=#!yI#A`> zCRwLu&QSZo^c7-zg&JMiX;^76G@a>bW2ck@ntV3ichzsHH74+lQ-k}x5BXNI1T|`f zVRw(Cj)TynP(_i)kWNWhE7%?}nG;^^Xd_ilreRZb$h~c&N}b28&LXQm>Z$9xIg}op z(~<9nYyY=Xs-m=K_bfgp%}sn&kY0`Tf?ZkPyIPI){ql(}i|>xvY(Hs6naJ^Z9d#Ia zB=H@4DVbzvmE(uK^@(ZOWtBZY{f^n7$MPS_`E&U<-j}SlXv-$TIG)_5XDoVp1~F$E zqv{^|ed&+>RjLBqi>0LR1H1WDZeeQtAA({k8{9_UBAp?pm3u>ciar8HCfAA@vuIUA z;tciGvsVolg>U77Y+J$y`Noc={up1s)Fs2dVs>HO$fFG3UEsTIeEWD5-{vFNl#%yU z89BfB_VFmbo$mi*j&of9_?1K%mtr?=q(`)QBYKl=!nn+?xlHOOq4OJ$U1cg?NVJId z(Q9daWT+JstI`<qG{CikI^~! zW9oa0`%;+4tlPzHD)VepnY-X9p5M;EWqutI8SLEdD9a9N1Ks-0Bo1TZjH!UdW%eiY zlIcSGN-(1{l)H~dyFt0nA0{hVQil42yd!Ucspgr|=8q^ptBdHC&r6qA=J1?MDr4Rh zzKa?MzFarq>gL>l8hVFIbONy_PO}i}#IsJk{7$@bT!;Gdjnv|FTI`YNT8~|X8fF3N zcJY!~fQD(SS9DRYP-ZZ#IHLykUZ;9bYC-E~TQUO*-%bZhZd_{$NIL!M^}cCtcqq99 z-+kz|uqi)Z$!BsXv4d9_wyjgo>$=b`80@`W7j?b3wqKLpU+nLE3hsf#a2$MPwH-q7ZR6UJAN&wBXT%9ud%p_bQCset-V%gUN(5M z)7ZqYMl6DgC|E8ZJuZ(feO_4eb*cO+Lz7*z34b=>@9rl2&F>mvr*Mf1z^;*@Y*{3J zK9xMe^2T$iw*71H*TG*zck;P#7x(QNVFwL6=$U@hMc!zB#Qey8yhgNxG`}~{{D}Dx zUyptWJPW)deuUjqxqf6v7!;Uha=9Z>B%I4m<+tvyOVK#NRFVHpi$QoEj|&}z=$mfj zwnMosebp=5sVwYO_p0#OYB|ik)qS7Sy9KA92QdPvHY#ZujF=RVcDX_t>e4&Rt=@SLg}{aoa(CL z7`BVXn$kK|r*g+}JwDZk=Fe2IOpfdCzGrgVZh~!BIJHd9GP%3Um5mvl<)`WkK1z&pDHGDF^VEKp$B{G90l-f3^zmutIT;JRWv7FTMJ-VpNnbkC_xvW#L4xIWc_&S~4nsy|4{&z*H zYjC4$1vR!jYYHDghy1zN^e~rU8e{5Ns_HRPPoO<4dJLkw>V6ZBWShfEr($=}ANSHt z8hk%-4%;KwgUqzxTsA&n`6ij$v^v^D_Yav9M+fk9F6p_$BHrUt@B!lq7kVK7AIWe3 ze|vA+)W)@KZR_){+W&!X+o{@{d-G~Ll}d^@PC`!N_{2`~)H&=*VZg)*7;eCJxPSdK zt~Isj)#{eCR;z_2nB}q!QloC9(eq`@G3R7LB3-Nedmx@3mW$ZrQusOv%qYil1Y2k6 z(=sk~(i|8xk^Ia%{mXPZdsXmSoj?8kz;va=^tkk6#ict!!$C$gN*6Oz1@kouP5ypW zov$c%LFIG{c`p3f&Xg6Q3Emzo?a0>d>i;V}0!qOeI$*v&&>xGg-{>sIdaOF1RRrK5 z-|3m(^&B&D;vGU~0eJN4R5#|KBoj)Hjawkz>cA_ovpS{(ALUR!v-D|9%hx z=(_nzfBC<8R7v$IJ!5)ZHY0%@Ui9Q+DXiZixH>YtG zo~!U83$s`%y#BU`8b1@6RZ~>CeRlf{-#%-v`g~%DZD~ZYh@<3JznQ^Sj6r zK+jS5x88rbh?S~&+0uuBb#hzkwzLmhIzN;$waiiKDD4BKX8W6Z{@8cle5US?QH@$9 z5_UXBrKs>gDT@Ex+%5I_TvfCBxT=cO*>Gy@pm-s+jD}vYwPx z;R7z8Pd{hkR_qi>`&yc3uHR$nIn%r3|EN2es%CXX^;t1=o=}_O9;V`SsQc4Vx>zWs zAF6+pjkkGRxE(W~cn zvAdmFo=hB8VqXde_yhR->btrJGd>@Ul6mF)3g)=(41DJGP^lC*7_{}&SLU~*`T5OgmXe?0c%<0Hf~Phx2Y*{Z)4?wC+&sCN zEi|o<_g&mwA8Lppzs*I=G_MyGzc1x^tYZlKWzjv6{(-(Gk35zod!nx{^a#gclj7_! zzGib9u^&B3SgE4{8e)6RpY+{p>4{4`Y|NGI`qPM_o^!aRx(!RU9cGg)6#ja)FfCQ<)(LH*Z}Q?g5B*^rap$6D7h66d^?7kML3ggzf1 z0}tDVIyzzKX!SZ-ox%RX8DL?jd?Hp^Tu-N~O`^@;TH^a?W6g1yVs~mj?99BBH986N zVyzy!SIg;B3k5Sw$42^d)N!byrpHD9$$THH66CXHu7j;IlYFk^Aov&GhJ&q}->%3K zeva+~+wACelxZH`yMpZ;7eBUHPv%^g?hk9@)2iOi>6L!(C0!;DJ`PQjJN4?B$vEUu zTi7VbdmVX1LEXB7Ejx7NF@5B*ly@L6zpCKKyFbXI+IXx85B3fPk8%5xGnN<1a%=`p zHM6^_64-X-b}MLlll(~zUh!Xqy(7zGM{gI+*2$EQ=IOP!R7X;;meutvSm>rEnz~!m zm(+hcKkxNA+dMPg+r+2otF{W}=DZ9{`fJ5pi`CD5n@HLkW;6M{L}_Bv-gZITi$(}$h9sw)TQ|mqi5pxD-*wz z#b?7&nuW*5=-PS}w03p7WqSI}P#0u!U9J*vQe6;*-l^g>x*F@5M>R)o(o9ZM+UF>D z^7q(`#+Iqtkoy>2;+3Mp_T0$MLublycn?dW&I7#@ygpl{;7RCnO5;ygAkOYN_yi-; zyP)6oJxyQX`krppgQua>7Y-D?RGYO$g#oL+R^ZEXtl{dgE6EkG%cWy{s_yGuX?dbg zeJYmY&CLXaM`8ZKWG)UykMVu5QxR` z7v?nut^hja_@qXX>7KR4w`@#LH-n;qb zuHTQbYkV)OY7Gh|stZIJSGQ8n%Hev;DqqjV%`th8c^a2Pc932}kV(8_uNG@!`Fg*D zVWv{OTVC7hI~$DI)udb;ZIo3M@^$(s>W=jXTr=f|$}zp8c$OE!x!r~KJ=N3n`+S7# z>a|dN!$Yz2ZuCq(ai!lL@}KlRzt$aHx0sO|wwZbP7#W`prJLenww_uP5aYY)=rFvy zy_TS(OVz#kbJ24@4%LhNNgM99y*qs|w=^{|Ze3CFei^67YW`exZ&*H`8`1Jg?M#;2 zZhF7(H)qf9PY)0^=`>d0`>z#4Fn^DI1oUjA&qp*e6^U6Q%%{mk8iZh^$N3N?9s4tl;8I;9b?}J*;kG23zfA*wQ{Nahq?j^ z8SuESJHk=*pTXY;e-nG~al16O`W;owdbFrBk-h&lnez?-?uWb3Nj1Jy!Er4U2akqA?g;Slh{HeJQ@}OgN(F z0DccXnMs$%^`%ixjOM72m+kVvF4X5i`abx(J5#GZV{jf;lYVpW!f4)A-i6V%3!`st za!r06{=6S{(tG4q)N2rTCmsZ^<~?%rR0$AcM)uLFdb2W;+z~{&`FDiJx$hN;vGKxn zA)~V?ER!#ZbDME-+{YE!!mmTr%r?Oo>28N8qh#kv(?9D(;~jzd|l-wlEEW2`Hh&8^(zDALkRVX*L5fpz$6YDZ~|0b?!ZGMUX)ufmLO zgmvvu7wu3JG4rr-?pJ8)VCFTj-RdGtT#VXJbV>6 z%L`ST@piepc{Wwk@eHIHA2@5&jWxQB`ViZsY*Vb)hw2psM{PIM&hF9cHK85(RC*n# z8U3#RWA1FWmVH#YabsU<40xk=syCrkkGtAjp<&8>wB3s~(R0=uCJ&EvJ=hfOd_?+8 z_>ZgJvFL7j6eG7~Tfs6pQ^~~b>DHBZ+x3*~XuGfKrSVfhZ7*}lR66g!@cxTM?Y}6C zL70JOlkJGAVDXO>bMC8hbTp#KvtGJ2DW+_fX8t_pNq39u0bCDo+YH_ORb5*lo`DI@ zpAt4bsxbvW{mTcsLr+F}^4nt`SMM*5dVjVWe?2#RE=vs#;*3+e*CSs+t)G~ByFmHh zgV zszN>&Hr>;L$7@By)aRn6ib(Z!md|AdL^UDLbZ_?4?v0nz8<%2|UZ}F|v2FqH^1P6; zoV**_)|GAaSD!K)Ne6mV_B|MGS@1mLB5e4%8~jf>)=F#m^?6%Q#xI;{voX;0d zxPXXO z6IDb7VfED~gU@xPxfNcIEao{M605|7$ScK(@51JTIBR;`GxgX3Bpqm80J9~JZZ!C7 zvW}L6MH61p^@^^|aoAwLIZNvc*^-s8P4YM>t-mPXvktstA#g?WWVLqm+0jRB>eu#-$UIjacP>Y_wttz;_sdTY5RTZWt*Pp86x?&Gq zwqtLecEnhX<(W3||H)RomCe|f)xdh}>wB2vGtI}jmc5J5@923Z{k{(Dz3qG+eXP!5 zKGSP3740(N_#Y2B{``s7yr1>y&pv0z=j`NlshGNNT|O5^kWKWt)lTn)y1Ttl?E2c5 zRr+1lt@^rdy9_yxLmv~}*!j45BWp#pK|SBRK-|TP9ekk)-22*K!BnVtWL<0bvmQST zxdQdktMJuMQe`EJc%s)J)2*rcS*r$SwBudY83LI`4Fihv8L^^c1L0$Ar2U`=9@@Y`E%MeHk+kdf?F_oL^yU99Xl1fH;w6A)2ENW-B7HS&-JlmkWPr#V#uiU zwq>H$H{&zdZRR4}Bzqzk9Xa#K2R4K+*o_jDrQ96&YAQ=s#bPrd_H;OJ_`zT|sr_Gv zN7+zxtW57hXJ4s3Tk*|?)b?}a_g9R@15T7!@yLh*h#YtSnTII?ofZ&^UV(KSNi@q`Rd1;&v9SX zf%K=NmSwYe4#DowLZXRz8*IR(uG4B4tKqq~dfcW7pkQIw7TOhT#DV{)kmqT9?Jq+w05dz=|9FMQa?S`A8aDiDDYpV=RB34vg4xlTOX>! z^Sk-SS>x5=-jvUD{?FAZJ>Azn)$dSwQtTe~j!G_in{)l;H{#y|T|XWlMIiUxNwDf1 z%MmMj-g?E6; zuqJhT8to*Ls6mz6$!MqDPEv84zs@2*DxEzSVjDZNefnmP+;$ShECXY7n`nDD%)ImK z9K>ViHxqZvQlHCmlWp7kYZCx>^xfnhk}vgBf9d?wqg0!|QRU%w4QV7;_u=ldyZG$e z#hvw!_g4Bx+wmsbF_2l4~IE-esN%Xd~Mf!yLpb({zbmZ&e3kw-9~n? zk^N~MCT+WqJWswR(LU+8*R&09AZFbD=TYAdAL-kk7kS6S?cgv@d@QMkI}&H>KjPjc z--}t_qU$ieQSFwQ3|E8y8dh)k{YM|OO!FdeN?4*dp^Ag1pzgP#Dw_!mC7NunTkjA4 zrOHv9UfGVH$*qgMD75hS|l9XYn zt`@8m7cW%t1K*&Qx+LB){XRdVZSHxtb9yY+B^D!JjWt#fLQNRk(|oke#%vF}*!r%e zng8>+e%ZX3>D;C(5KtX(_vh8tqTW3}l27@#I&O{st=Hz+N<*w}njP){EWhmsb`8RT z>Yk_P$PEYhUO*{g~R9_*vC)w-I`SQETV+0@%;TS8IOq5rI2FJ%t~@nzAF~ zmFz3JtbF`MHH@7zwc=h+o81!UGrP=)*bh;A`WZyqMMnua0$pjjC~ESqZAh}u-D5zH z0kI!+thv6*b*Mz3x4YvczoJ`~)mYS5!q0hDA1zF@S{<}u}Bs0F(7%(gSKdsn*i%qgRPw`veuA@Xx<+}%l~ z%}Qrm^%K9*tWh!9j81cux-hmM0;kNJBC1Tx5Pcz*V_W&dqamZ~RnEIv<;;(2^15@G zqil0_@|lfsylko)itJe%J8RoBqH1Vbq*St7BfWwq+Y?^v%EK+lxw_DF{ z|CrqhobF};8#nE9j+}0c#>sMDD+*7uQ4rOf*x_;cV#MY7491V41{$>?W+zUA-#yf< zl2ljZosQlSe%nl3zO{UzinYy%Z)Ytm-z>p!j+J!Q;$n(+ZV@xneCvqEJM>QQS{~-z zI*X(8%t!KfvW{fP@h93n{pL{Jm*0O|SAXv649pCir}i_R!_}YN)SuM$-wO+DbcA(D zzi;!M<(NqGg!(HoDVo_D*UBa$E0cC>la2nMYy+KOeSn z5!elZxth_hLx#yVAiBO#6@iR)%e6MFO6B((rf8_6)D@#_(dFH~2>Q?4t-ka5E>|Z{ zYC&@>sxjF8=m1jt<`(rRAm_emmSapeU4{RR?kys=SNb!4{vTarC7H5YQdg1{0zE`O)W)iHH_JZUvlSIm+^&3}FE#?-P z+vz#7*=p<3*5um6Jk@?R$&ZPdWbRk862$Q2$CEnkM(3zqDkh;vkR6Kkjt`%L+J}F= zEu67$q(mQ@hckG;_k#*;Sivi0sBbj2&yluR^9ODRX=_2}^-pPb^7|uKvH$Bh1+6O3(DF ze0`ulaI@??F$HFIKAVxsWE6I=jBd)|H@7>0>++uAdG`#@jzp&V7?Y=+gO4a2Bk!4fcnT<9vnD zuTwT2G&EJZcAlN!t+_i(>gfl1J#tZ-4?s-8RIhP)yZiMn74qB3o~ZC}pR9`~&$YAD znMZK$^HSlkxJ&B$K$p+{-VPGsz^(5l-{U(H@rCy%!pyI?OzU9ZQVzpp5w8xyH4q_; zZe#Q=uUQo&eWH~)OL*!0y3KUkX#D1AeQAU>{}_ywof02C9fh8oj91n!UvAQ$k0lQ_#>n+z9udw*-_|EuVQh#9^U*rp zHd;jJ9@;Hr8bihj08IV2ZO8djcXBZ2{nN|XKixMgNOu>r{!$e|L>|+I;Rf^fO?XG@ zcpJ8edBkW%FR#Xj4`dD)v#4{c7dbV!)#0rBQN`DEPBK(8DBC~O?5 zt9^bwG=1h6j{@sVS9Pv+&58HuO7R?HynkLk7N(osWqPO8;PNZJDbL;RIah<``lp~2 zI@Y~5eb@T**TmYr4r*5z>3nPJ=kN2o z;(jY+PagMPN&Se8_qaE1hh4rHzB=MhZ?3F*O|R&6sp#Dnb~Y7Z({0>m7hE+tgiVGK zwWE6s^U>v-vFBMgyIrJ}SgGkXHPq^D@yo-@<4Oqz_DZ{_T@ znrzu;LrqRROY?}&<+tC-^BxX8w$GB8_bi#F&8+L3`a|Ay8|dDaUh^YGtfL+0i^zI4 zku$k}sCj%I(jJAlZli#wcN@o6<-5Cewuz)gL0;3Nd4=e%R)}s3g;pIXiScsOq^mxG z)xE5IL{)<--4;=bve8+qxk~)VnOu&YPUTaji5O>{b#Ytv4BZ7CA8Q4ZFg&93h%Qc) zw^K} zUQjV}96ApB$DwstxnE|_>W|7*=Q}lmdw7}h;lAU;U*yj(#V@ecs+xkk8Mx+>ErxCj z?~g4U$H|O7Zk=1tg{*x=jP{*zd~`{mJ4T6@n|(O*ayOZmQPe~xdGzr~Xo^$2w;fIL zXU-QNg|35x!JqPObh0$-5|^rk(XsM&Vl4u-I(CX2)$Noci=CY>g{c%-?RE;?#yg?w zaKKzLwuMH`NbC?S(I%M+n69mTy&{${8P*>tZfUiAe`RdxwpqijaJ(IcY}6A) z4;3+k%_%|CRJ`1{~*nvDIa?s}Vad7)?bbmV(^6!t0K25a9pYM9773u=Cq|GH2# zX0~yj$f=*nyhw0l4AqyyNAx@JTMq`$!cpmC z`MKw~GuSKJ>-aQ<(rF5#b~I)TqmP??9fzznMRC@3lFv;zwn{&%Wz#>5VyHW|tge&K zmO8fXI<`ic(adgz ziCjmU?#8^@j?R2?GkxtcY|3u#mwu(Iq(dv;XGY%5Sef*9^4;dM_Y;2%3^LWde+>F| z%Vped*^hrEGq#PX`LWydZA7cGW@k4w?%iO~qW-p?JLFrl^c6o*zWG5m9Sb*Ym*I-8 z#Q3ojeMRlvv(S&1g|f$}v_n0wMzt#@<$Y391!rEVT3%N8nIf`36|WJSO|E-x3sbfo zGk?QCy_NuWUh7QrV(vR)V8=@oe~y^@jF^YYm6&Sdam?MFAKh={3u4gD ztQT}vxsAEsHpV6+IAYw!;gAUl^n7h2ypl`24%nM@jbs_GRmdh)ZR@lFkIsyf5 zQ{nNYY6)oG+d6V>&c&mEru@9yG!>Jy9jGC%5>>|oZAM0oay9r&TF77YEGk-bDC>HB zMH))0!&4_f&3m9DE`@OFo2J*VzWQYFx$8g{q{Cr4N}s3_c`>X(qegnBPaPy24OQaD z`YJspRq90bE?vV+VflCVbc3=gJsPM>;j-^qeSBT7*x!Ed&2(gbDIC(FfTh_RRNrB{ z(8^(ba?4p#KY?|O{xmTUdx`BQzz9l$eZ^1Qxn zrH|?L)hC5_Yny)XrM%*FBy9$@kR$2-?iFYvso6(|_ZmGeou<+Ji5OSGgVRr%U!!f) zasL?RQ_&?e-4310#-L2Y3SG!fYB$xRRzCIY{0(4d}BWp#| zHkpUT`OKo>N15z_8j|ipY#h&F*XS_3bj_pQpI1T&eF6EbT)&(JbKFbOHZEqGr&6to z%v`Is2&ge1SYo3bHOseCy>D9+cjn}KHb>3!p=LDdVZzVol!1C~-+VsCLR(?3euLCNDLts>Z!mu#M+&Z}CdxSa#9OWlwvA=8845TLXs?Pg;xCa-E!Hskrz-;XFhwcF|MTmLG#MdLnQ5FR zJ)eFK5y@-P+%a>h#5R7Vvw{ee4{ft!nPhXN=T9=K#fDzH2dbZo_krW16d%>}QS;*$ zn)?Apn1=l#d@5J+lzcYt0%F?j+nVrT^Mv!a;yEg?u8TR3rax4a&Y^KsEG{aHlY<>1 zf3Lo4^Ap56{mrHCPZ8_2i`geVR-gQI9BdA2sQHtq%)^|A%#zsUO6+2#@1k-rS=Z`% zGT2*t-(Ca{vn&>6M|Oq0<3gV~bNs2@((Kep zL?U_254tv@RXi2{H;?)vBP%lxyP{XA&Y0#zKkISZf!KWg+^g^^TbC+Z-MV$fBy*7+ zlW-xaCI7;8x1FkT{a|v#G1+RZ-A>MCC-Kbxtp6fF?(@vws*m?$2M+cha3-)zAlKVbHQ*^JvJw1_?ywV@5 z9!F$Yw*Z^+awEOnz<8dIRG;I1p4egjpf-=&BCqMZdW_(Vi)=<|pAF9)&(b^s{+>Sk z!(qJW>}4r?*%z*Co>M-q;L*=-CKNP3*@&>0`gG~L{7HXb>(fpne158_TFS>=?A)|# zN$;k5|E7DlZr-gQi^ViTR8hGW>!mCL9Q?OJ%t@%uv88fV^|nj(qn`*d2Vn~Mq4+mD z^1;nK3_}^&Vcd@NB__lR9Q%<|c-eMK)etAtG_)EVoK zq;botq8M~6amQ+vDViD~Uprjq5O!tj*?-bs-7&tR$4OmKJc@yCsCYc=u-jCqjNSG-^mQd{)HrUjeWlh2OVS*E8tr%!xdETu~I>6ah@Ec{db>b6qWDyst*rM2`+C+3ZN$pNQH^;3gu8w`3mx|@zs!EKu_)My+_^Lh;rQ1Z5 zu86S7runv^{%P$92gmwMSA~YZf^|Y^P8Tor|7p00+9Y~C?I$Ws`8;p#7_!`1qU~;| zuo-U~@*BC?&I^5lWW@AC)DcqmN%S>gP3p%y82LV;3O28PWRv+T;Si%1DcYXjgI{|q z`-5Ftx!Lt$8T}{%Jqy20%k(&O%eb%lmryx5-3PdoWq$G}YUv<}g z6)I#R8244~tNQX)XfbVaV^hy(&(*62aRWP_fK{8K#VVb>?s@m3=iT3`8gr$IS~hDH zRp*|#oYBYX_=vd{ItQPx<+F_Xuv1_TJuf|5$Fe(y!t{|g3~mlPF7h{Mvrm~BA}A`Z zTju_tXy+NLl~Y@%&dQA9Zi-`SpT-l9ZqRm(aTmt8D^AL00fGVB2u#1y7_mN{R`Z)@uH!yEXF9{-{|K?@uB$7m&-?h#c#mWnOo zywhiTN0~>NenKcnehSYX>iN@97fFv!kF{Fy14aDSmzu8%YD1$>L%o|liOpy%H$p@C z?h%?#n>5wvtlG9+S+i5wGya{?bI!f>NHm7lDEXAqK=*piJF}+t7F5v2>W47MUjYlWa zqz{rfjtu2e)_djV`1~%%7+2aArFUUHCiD!XO9s*pzP5vgWxYW2+sq8wqQGj?Io6p; zm=u0JisQP*9)(F!?^=Ift#?-?y79fna)Jl?gv?_(kQ5!_Y_}&O)qS* z^r)vx)Pr>b6XV&_(Ia;B*|Col?_>OS`}8e~sJ$NP^~l>{`Mcuu(NLkB&n%=Cu5L5a zJyFrSrki!(4}3EfyFX6k5$>k*ERO> zbodM&uzpmVC)^HGy7J>8bc3k7_$iqpi^YeT4asWJi^W!_Xp+2cn6JltG*w|>yfk192&LFeOm90kgMk3 zC7!9eG6U;qHrn=ZTm)STyKUx))a}qq=SX$-uMhSQk8V8zY?+S=3igYb?ut4?>>e;S z8}+v_En6Y7aD^N7pti`@w?NFU#O#hvi+fADONmu|tLa^5kh@wt(~@iy^a1AJ2{xHs zre+>1y&io&XsgV7eFTMV;U(<{H#UC(YIyk>gG@_qGO`b><()}&6dja>N}rDnvkDvdqL z5%`_y>XCC@sj0VD6d^L{_Coy1ju@6*{g2IB30CYxUwsH)AIO$PwHy_+mE?Tzpg9h+w@;8DmW z`%pRcx9R(-EVe19T+`I0@;^&N5uYr&@J$=JV>!*ZoBN)CY0%uvN@37@en;@^!FU z?6$iQyU#}FL)UnOYX4$3K2OgQE?V2#xgc0{+(>^X9*<9s#bo;m{_R*^2 zZXew~&c{BIOEMRzZAR`l%5dJ+^c<@LdTi(fw#gy%qQuB@t(eiB)UQKiYm+RQ>Ye7l z^Xb>g?ZS!uHFV^pU#C~tp4nS}&Q5s0iP%fFG#@DE=JT&Qn!HD+?-`oolyU8klPRC; z{x~1GKdg3Zb52U?YI&Ku>FK&=>CJQ0Gen!(W#?$eu-8Sp)J576WO{(6rgt*39)@l& zM;087&(VD*{URP5#Ubo19j@%<*wy#=&pl}xdF-A1``MI7>$bq`7`@^1*~-9v5Bhd~ z4}AAGx_Z>)Kk9$8KM%xlPFHgByP5uy|1U#-to`Qy(06sc_~=B`RcEj}G1&9R9FtN@ za`2{KYh$^0ggD0>{5I47ES|J1w_X!l4&J*<-cs!piaASE9pvjc(>T9wF@4UL`{VC) zU%is&*;6;cq5d@O5K}Ix*1VDTW1d#jdfL{${K{VQmAwZ7>wXtE*S6_~$LWddHYuXZ zW<->z?Izhd`Yf3Z4Qn)xn@NBEzZGZTcdiGYWlTE!ydd(6ngoj;i2pIyxp6S3fvwCV?7(p6Zer5NYIHN0`l(^h~1O!8eQkY1w$a zd32clAm71;zRC;5nk*cPD`{Lw(}$AgHj(={OoVsjI&%9!F45mrsJtG9TJbpl48s_= z-nXkG&gJA$wxm}($n5Cmk+CKMTTP_dhuyQR@-yYf zpNp}ct}J*Ot~}0gdKWYl%!FD|WN{QKI83|Z{y7ksby(;~ID|*ay4(XlByH|AqQo&_5xM?5izo%!;r4#HcK5wt4JWbzY z@SO5$FoD(2rAJ0Qd*{`DOFh)LEOeWT#{GXRD|H|oR$sT_ZcY87R&&|T=JirbgN2^l zr`&&sGB&!Z<#}&1TF3eK?pO9}vfV?W`axa}pLaOL>OBseG8oL|lqc2ujKAW{zQyBH z-68)N?q?>>@D2gye|{xw%&Yd->~<|xp+!B$!=S2NQ(m7R-8!$nxV(CQ$aoa&CI9By zOUK3H;-Z9W`5{De%pd!p*pA<6Tr>xdU6L11@~GZt=U((kXtOE)%Nk|E6+P5lv8I{4 z`B{!z&c(Hy^TR$=;tyw$rl__*|>sdp5GCcVgM?=(^%g>qK~z9e+-`Lp-|h z=;C(oivA;Rv`%Xw;?CcDGwGgiui;+f=TOnR(7(6sHA?OethZ@<(H&Tiw$(i^#^k29 zxz6LOD@}Ltoy{+VpEyl3Y67TGgQmsrIUd*NUUCPaa78chwcdy8@NTqoIyU8Ny`V}$ zRj#gw^8U}e+W*OHDkfz#H(VN`@|IoT@?r2P`K$Rblr=5mHB-l-dQ>v z`l__C4Hs2R$$l;8ix-zKE{V!Y^O|*47to^irDAbb%vrJ9WyOdSQDfV7?mcbiCMrUm z-4;1o7GE-B(6bTV%WiQM?;RQOvgF03SfVbwB|n?1XK^guA1uw+Yi|xU0sUxC-D|to zzHP6atMR99YY}SxBty5e_s7oCAwq{|x><_}fRHYE$(NP3t3~f6eOP>)El~?r@qjXGyyi znNxHv9tiDFoc&y%N@ZIftcn(A`SB{}H^(>aSII_&^a`4<^gunA%%i4;mw)yZA>Aes zT8F83UY2%VmZ6c!M9i$p%`B$jXY~eKFZJo8Y-0`;Hq7$o2g;jm(;jwmUB^uCB(_R_ zHKW|FA3fF?mUOwejQj|jiUIZ}zhleo&E2iY=i`QX zir~iWjn9WK@l#tN+ID;6dw$Z)Ed4r-B4dueE<5AfQ|8+TzKl`MH1-E}`#?Dlv%}G9 zv@3kKg)Uc=xuUEeEsw>==R%y#QLle*tjuX(jt*}&rPwUQlKlbWIH+er`CsCn?5w+D zdvYd&{VE-%ajB+-vCN)rsO%TxUz^s&?623#hAwo!@C>^s?0Ke$+1&_N^eXTSJjXn- zef^#*;sh_k*BoV2$CzyKL0|K3oQKD3x)^h}?Uk=I3xu;*zm4xV>sF8F9qh+i+LVv{ zeDP_>ox#fWh%Uo-OL^{Kced##jb&!m4S6VYz_6fg@nEchmvHvc^1|iN!*QuUZvwNk z8kDSW^|aKY>th?=>I%3g z_w~KowQhE89v$@?st8gODya#=ty_foH27bT6Y+JaPnSIs`|@^g#lFWQ+iFAj)p&&c z%-i5=cNE87=_f%i$2`%iF{hK=3Bp?{(M>e4duK{b|{Gpb9UXV4&y1`xP4c7{fM0H0$$&db0RBxH+L;|i?SXCFPIdxQBQb*r#8>o|3sj>jpR?tajp-Js@=U&Hgg6|)t+xamkrdY9{}{a+Q&Ug#Ag z$6VL$!?3~4!brnG=W}VhijU#>=tG5>Th)D+p2<10E}U6OM_t~;X(sD#25!yg-}zLp z`rNMNo9dNY1+gkHQRN`y`dVU9}N0%O5PKqwO;c&Z<3-?*MD^h_`H$Ewdo)2_9pB;Kl)EMlE9MAH5 zEZrrR?rMp*gC)+d2Du$}J3QVF*ZcA(Z{~XFk z%5Bd|=@zY&cFWZ7s&qz%YjjPGMl!#R?gLM=?F6a#1 zy?G_q=8jjSEgvgYhMUd6$2xA@-t^b2vL;Ny^5n;~+|AtYoq(1+ z|4#6j(DV24`8!osqCPtJ?W;CjD4h$|Nt2JeJQcAin!STze7tB%iE}Y0XM@F=%NH|= zm_xLoW-IjL^KeUg4kz6myNVKE?k~g}jq7*at+D!e_G+rCX_Indg3=?YgHdT@{|)~e zn{^&4kVm=#-*&kCs*`!&Da=mvJH_vm<-b#IZ!ajD^O)+-rn1~wwJ&9>*$avv!CF%f zK5DVptJ+q>JdG1O_(e=^bQz`iVF^HY}UNg9jnn4c7W>ehY*z%cK=h*Hh$2MINx}zMP zEdDf1b{w7KXZ^}H5xk@$&v^saNXNMhi&m$Iy1S=?|Ep;DjdF=o;U89LvQ{5i zakLs{fRaOzOWKZWYB*nqE2-B}_-U?>qo|vZbzK(pT*XwL-gkJ-K0__yC>LYI z41Dg6HQzIc5}5hESf+o;A52z&qr}1v9EW-@$KnZ3gGJ!+H-Xhn@9)ZfVY`^#*AM^Y z(WpnGw;hdkMgB(dl(k8Dm@~i5{2JFyzv`as?`>*`;T|kjWE=M0uolW5gK>Kl9;p_K zg25|h#Q)1aV`IJImpbS2#nf!WpkfiL?~^U@&pM8Lfqjc7wY)r5I8ZrK-&iZ?DCS+G=YZO9%tn3; z8yty!ruP%18x*hgD)cO%1$Zu2f?dgH`q!9;GrcNbAB4Ed_L9Qbt!T~?8zVWNZDgjG z`<lAtkXf_1by+ftdbfMDXU0UJ9)Zt-nW|4fWIyet*tNRi z75KSD|AE1UcKh zdM8k-m1)D>w|KA7V)hzUJo03g<7vnx(07tcpn|A=vOQmjv-k2jHtv$Ez@}X2_1hQ_ zo5fEiN`3Z;@=~_jaZRhrMX8HVXGS>A_j-J#jK0sx`MhJ4M`3DONx$&ZfDxO&0hVAe z>Rk%-Ik4f8Ssf21s&(=^XVO>vL^!MZW+wLp!Km3ZgcE(WuPb#fts9qit#|LO-a|Ot z{a_W|itjL6LH}em*&#mGX1_Lqhu;vdmYY9%e|lb@!1C1t`azV<0(V5g6!q(S?kl2f z^R*+&5%o-UIc93&-R!G2pGMxg9x9Rfiu>JRd{kF26FCv1Ta74olGZyztvA>h73zjp ziiW0D(Z49D9;H{%%oQH!jBgZ0q1Dbm`-*Z2>v^__&w2e)UO(b*Iuem0GTCbbh(A;nVLPtK`wEH9C32dBMJOv)jCHZ1-PZ_YJ=OR0x5U zYm02L=9B!vye7h@u}b>&biUKB2t}9811gDP{9c*=?95ypU_6d#(o=BreW^@vwqxR{V%&B01oA>Hlma*(A ziE&;zRzz~EBx{OPQH8=p=31L(UbLDh&8OFIUD##;);i-5xp;(Nk^}%rkSF*qxbi zB#yUt~$ zHt&^9`4{wf`O|mXB9v-kjPv;8qm<>VAJ$_Qc0HsqO->ABSyx{%jN4+j#fxE!zgP5r zD!y!Acf_80V&ivhkvwYWGR?Ew*!#phwD*}+n3|3->$xtOdXvXIfWx-_*|MJNsD!^v zR4D&YwHMVTs%X>d*Y|#{=-z@C;W@fuSG_M*+|w)B8q~!3+nL72l4a;BofG5ex-T;` z`>QJ*fl(#8!vMx4u%jRdeu8S@8GQ3VW45k1LORa7_)<;Fr$_=FGc6{cM{z@_Qj2HTj(4@}Z`krFtS}`9goL z1J`^U?uYs#ZPlE0p^Ki#lA2~7x^@B=ZhK^zCmH7}{itg+d-Xt>=JX1?O*$RVx}OHt zo!uU6u63Rr=3-uRLb_wDRQu-`yZhWi-*ybWa{qP=|KL?arZX(>+XE^V;8E*Wz!d1ZZ}rK}eO9o$dRFFa&BN+>^mg~`9Z@$E zQcynHSM~eecBDNH+2)p1=ecztJfv@Vyx$s$h^WcfV$up+#=0xCbr-ruqN_$?N4Y-T zjR%TU$aiD?vFbLny?ObJnK2TPqiC~eaeD5q&S;%*)IPrsxj}uhUVFxnAD>08!>%c{ z(REd!M__$MV9(_l_r;#s9J)Qt6tnO7+~JrkYCh0}a^hh4wP{E2`MuR&Hv7=W_NyiW zp#( z+Dx>nE8&0k3`IoRWG(CSJkjH?bw++0XWl?aAIw{|k81KJt8W9g4uvRt|Er%%?M1{F z{uYZ!e^hQ%H+_#4cf|E@H?SeYwpcw7E^PnLRRP0$ndqtA&dra*EzwG|e-?$sre^~l zugMEEpp5+_c+wAe9A1!ZRdkOUVia7*h9}R z9EY%YO&qo>NSNSasu)y?PsIQpD{qB&h4GC%an4coT-YkH<=rhFE8eGA@#A39rh@te zWcSxiI~glt^Q)nmWn?OC>7+NWnB6b#um4$`kB3#XlCD7a$oI!1_iz2$qQdnX4ORX` z*j*_Eepki#LUHNgjcx%eJ*rW#UFdZ^!Iw8x-V5!DJk%b^XL_BhVdd8z%U8FIJA=Kl zy^e1zFYW#qHyP{sjVk1gv>@~ajXq))>U5|lxV)*jZG_72mbhxKxH&V^%!tQ#*^>v4 z+rAQ&dMNGAq%S&e-9EsK$OA2&n?-jGHISapC#Pmg^=84)%xD=Z7SHwooHrBnXb(p z_Lctff79~WanE%RvCr4ylW|AI9pU-7KhQnH{miFgdr6qkT5S$?jp6(>hI#kGmNFS; z4{Yjg$c-^y%GO@U9*#~LGyh&i9_W%UgQbhQ{rcSj&YE4l+$~sNG-|{qU&~&i-@Xjq zxq9{M+EJ<1FNq7Hsv50qJYyZBZlQ1ALNj3#jm}oVB*doG@@>#q-hU~onmm_h^0TJ? zT(oV_?RA%2n`h{RxCuqx$}_1;3FSgE_YD-^9)wUFhB*=cqOd$HwK-iFozO!&5PBROv2ytUXk(>D*Q~ zZfm}ES2RvAviX+Fb#-@@=b9(d=zwH$9b4gZeWWApZX%8PI@P~FRh?^2*H52q^K)ym zSf&-pkL10gx}xoiWJf2u`=-qU`dRfarT}?Gb^d(fGu0ih6mh|K+cc-ibATr0xI}>5 z8SBmkJD(yv)w6K+ne>UZ?V&$+X4tvA`C^U!3!Cql@9~{qxx4&I8X=a)k93lei99Y~ zf+xj~@HI@iqA$3vIWnDb--^6kon4IgIDh(es%mOiMVU@-M@;Uq;>9B=r9EbZ7yD!I zpTXY;f0MHDQ^gk+C0{63-qU;ZUeVia)p2IWKZ?{6h4Li)(`iIpaj19bgD~?zD!de9 z=oqT0sD`cGVMo#EbJKCgq*8K|OILO(KYJ(3V-=U#HvpBzhPEg0t#bIb9DPF>2p;>9 ztZXjZ@Yq-vS|(JvFWo_EMl5$Haz6s8_tH_T{hJAHtq{w^e+A-e0>=zi7*50 z_%WRroO&*PJU72Tx%qQ-aPJ63KM6%J!1S8eziUHPWYssN&d5cTTcx{em8goq)G~vL zsTs{W&FB$zRJ{nevstUr^Vtl*{D^RzpIsHg-{`uo=X<2J0L}jWAsSAX!iLP++)0sy;@x#vxr?PY(;vj zxfEyNf36!}{9ON@Dbiz4A#usIB0eTivp?ygHRhv#^Pj?I$=r<#+3v}6U%dCpK96NX z)jTX8d*ezsle_J^P1S&-^no(ohePd8ZjRy@b&QUS7_3)smMrI`JT}?UTlsVN!DIRI zD%(M&O`tV0%!)Q%#=1O3m}a57hl zhG2olWhSwT48Kj6?fBQIqw(pGO){1#Mxko~nn`{aDx2EyDDc0%DX46G3*6EI!w3A|0`zp}TJ_%LU!%!nY z2g0_VH{ue04}D)3dLHj_qIzt-KaJ0_ITJg-rWxm1+jXYi#AmI~9$7{NeSG9T3KlUdSekl*VwYVje0aRVYF;mws0%*qX10@2>NVDC^pPdK$j@$?nKa&-vNl<=}I@ z+WQbUztO+2)~=%KqN1CH|NK$;$)(=;{UJ+Let)QgRiv7 zB2~S?qeiMPRux&S47@aIB&P;hecC4~9#@L0jMIT<{9a$<+dtFSqfy(+&7R#l`$L2m zU!(f!6UAz7#TLVgjhh@moqODF-TJ28uR~UPG}N%a5^gTkX=eL$W6g0pbbgoA!#(!% z*sm=1YoAZhH;&0+oHzHGMENs``b8k~S=jE7pGD{7B2243yz$g8m1$I&Nz>cA?_O-* z{akUHO&+HTXLAHk^vJ3HSbr0kypWHEGiDnzmAXB}aOqKP$JE(GQ@fdO_g%Zb@eR(k z-hs)4@>%`zGg+fE;qzP-5YP*zi8-%ZqDXRO4T*Gy<*U!!D!Nsik5#0i?XjY>iXWR*d>FJ99xKw@;~x6sdT1u- zV;5aXLA|mWdwe0i(Q&8|91aymK3Ax8uF!3=li=BUXuT70{+p?}UzVw2^IR3b>rl(K zDt5enW~I{oOf`_YwLQ*c>1#bhceMSU>2Xns=F?K$wlb%poct}h)isu z^%>-6-zB|Yrs%D7JwNF#Nj07ir2m;dAs9t3YIEBoJ6#DBw|m+)-HV}bX5Z%rRq~lP z(AGWXXzYT<{5*Wzk!|`OI=9fAF%dAgg6NvFyQ-qdwRj~yncN!7m*2mT_I}ne>ofL= z_vtF@Z33Rm>A%nlgcYWbb~*rk4MCHzm`5NDJ667HF!SJC7;N*Y4y&5(M|#;N-+_F>7}qVZQeC9f$Ve0#a(?a>90D+g+6ya`(yQ} z^7*3{=ey~7YTW9ztE<~rZpt1WIHuJ>{dFBlU67QUHRSOmo1q3$(uL<<@&0(lzOhDT zx>3M=2Eb8O{L16nq0-Db44E{lfhbR&b!SRZ_f#9<$w_nC-T0AKjT78JVWrzWu?!l(R>T1&m6Y z9@Bm8cxGc=9B%1kV7Gnu$M&^vgnp)&=lw7`YUj&rp6Yr*uSQN)o~ds;f%%Ga+b%=o z*PI^sD#UCj6XPiYxJ@6r5jrRTDeUFvu0GMtC%W}9(QO|2 z33x88v`)9C(Sp`zV){muWs4R~EoWP8U@!K>d7xvc9QeuDA&!fVl{kH^`mPNx+d&Oi zGAH__n79jZW#8%yCpwoY31A3y40gpJn`_x5g9QU6_8k*k&|tJ%FBETO%-svU-n(EO z?JNg+byH_BZ`&B+>X-*&hOu9-g2LlUUz=rxLH;5jY_9x`+DC{ub^D9-lThzjCF zzk_L1_>ER{Zj>xMd#K#2{fZp(w~KkJ`sQmrD?B^q@iN>e+*ywKJ-r+6^-kPY|8#2E zOYHnsc118&XdLry=NDrVa#zf6hpd0IfW>mmJLVS$^XOa2iS}wyGj~ILCe6YkA7Nbu z-fdOy&G8+q-FC3vZr#DMQ53+rDsiu+-k)0PZDaAFSb@!g3an$%u{fXl)mGq)y*t%s zl(p%zx@t@w1ynHsBG=nauZmJ5u$`yu87iqmu34}koF9yvNMZ30tO zVY;p{=}c#;AKjLZFwL%H`U9A;O-4_(5tsajZcp2I#K!6BjC3B7ui7R z&U1TpdzH6=_umP;y`6!Y*Au|MU(w5GH88qby&}-9B0z^R)t0?lM?;EBQ2Sh;8eIql0R3@J?Gu>oc&{JE2x!9_T!dfipY>`BgXv1 z;gcrVxYqKv^$(^Wqd(=ZkbkD%x5e;}hki0Yg7=9>ce5{$**~bd^RYt=PyWXiZduCvN=!Eba%wC8Pn zS3XN+uhpzyeKzb-jAv;c@wv|YE?j|~%_lXKPHI3OJUgyns;m!rGuu)*-_S?qG%03Z zL_X_sH+D)mJJH71(;et7(lQ+q%D{F*b^<7-Pi))^hb}SV2UaKlml};b2+ZdZv z&mI|=)ir6;@^ey)_4v2yt6NpZa-ke$dM06=di20Ct9e@7SkkYTUO_Xvh`9w-`TVo{ zmblrg0d*Xj&SM%f$!gbv&FoWAgr!j!V=47N_gg^Rxi7wZL$9$H>b!+q1t)&(!*Jd%n4V`y>opL(9xHp@V z7F-c&QOTk92BX}lCY<4>|kuf@ZTTBbB=svqk%YmvJAN;3d7W!S8e`E1i| zmTSxIp0;c>pUm}%j{^7M_`2=s4$J5n^LqvCwY9CJc9ou==%9`9co=H%C1|7z zJ6K7 zFNVs4&zXRqs{DU^zmq$FgMB1-UES z-K8qmC?!r?K3U(Ry_|Z9SJSY@+=a*2&-DyiF?5JF!--wTrcmVfem(fSXkUeE!se+7>jR0_1+bN^wVsZ|h?jOw z#C{&msi`1y-OgfEEoaA-ZD?OBV%sWx>UHpzO?;r}KO5@v*}Rkf1h}fS|M^HtU-1)J zzz?!^Sgn=NJy7@IY4nO>-}-ErapyDbuC%|a+f2K(C$n3>COhhwV?dUf-!p;@I@KTg zL}4%4g=A9_R|Edu>T&a&c*H02m*}SHsh!qo_nqDey5yOLi1%Fyh~obzLKc|fl~44& zZI)sSp7+Vwdpm2a|3dF|HPiBGxJP3jbp5;C;U{le_fuu6??OxzXBkk#q7QiTTw;*- zZy}Fu!AwZtQ@$Kp5qct5^vGYszNZRd>=!!IGxSHk)mLD}kZ~BUVMV_K(>dAF#l#+v zY5k`w`i*$*-SDT+gdwoQj4Z>@xt`M zSE-oZPnYj~?X}DjgLLd7cdJk4_%XZ}^UNOlnat4zS<`a}!$r&_Ec0x30OaE=+ATYC zJ&sE^#$vV|p8=4Yd96APu4EgIE`An zG`j^8&3u@MEcT7pf7&hMU13tiMNt zOS^a+Vp0%dIAL>9r2t;U$&h^@(WWKmYbsyrPP!07`>o!a6IplOA+|j2>fbN*2=^L0 zmkwpe?8pZ<7LDtDt*p3Sp--~{`as#)#LlIZ(GP|D9aWF4&U&T) zsXN6g7n_{6oqG$Jt?Mtr+k9fc+d(oc@^*m=Adf4lGLBJ}q^fzI=?=S;RYg@tOhi5S zADWI^um3v>a-<9cPT(#e4cpnLp9VS6OHay4z7)>>Qj9Pf8@hUPnevgkQU(8gpwIO} zxd8q=_1~t6Arc^eu&FYs$|e0-%gUl9N?#>T^=pBDxkjX8YE)aAj}{^VYE# ztNcD#1e& zKIN}NG-vvomtxk*EI)A#&YZl;=p+q3VU&ZQ$?jGjA)CL@=2Wcshw$~E0SncU@eV|V zLzb6cNgNmX$62qa^x0K2o%MVw;hlP?f6=trtMXn|`pES6gT1SiyxcL>o}v2h=~eL3DtO;Wj+;{Q z8L{+}PCr>kviHT$)))U@vM`5(|EGWJxU#(h4}*H6-#N(6tPzhc1_| z0#Oj#AmDZ_(j0e$#iOZyI!2nY4=aDW0F{Aiw&+t`2a1FX#g=rmz}%2YO^-7p^R+8$ z%)NCQGL{qFKh*f>D z`GBWwdB$8kbJ)DFd;i>!;Y5v6PdaSgL3&J^Q};{~j?9gl0v?6%~;{wcOPKgMw%c2|Aa zXfHXHvJ2h&peTObh9PPqHn%n(MPCZNu&0sl-w&}d88P}UX8-W@l_KX9+du25L*aEY zXKFKTbE?y&NB*Fz!royQ`M;Sv*ellejgC7i&W_2?2M+X!P^GKht-A88-W%Waf;+e|b%v3-Q-5nrjKAtI} z%{@~WOCNJOKAS7$b7_3AsFrBHcrs?UuL<5B>2T*SvS&L}&5mn)5n|IngMS-+tj)_k z9CnlB+Z}k6I7`eXKh`H;GmVelIJ1;j`p)!}FuJROWtl#aFIFQj6D^rD4a|(2ZFi7G zzEr6X!)FAK4hxLJmd^*Sr;ZY1l3?UbI~g-6qGD9Z`ISgAvU4eBtvb|XsLX1oiuwoY zdqdH|e6eQV+se&r!QR;nWa4|Wu&BzfzWPLZ%Y4?$=TFVI>%-~;*b$pn(yWTdT0?bA z9hYf0uJ!1~niJeGlk@T!vFXT+c&a1q>%dmm`C@PlhYcQ4#iDw-bmT3}e%G!{>$2+1rjix=$y$a{1x@0WGX-p_S z2tF6T9_wA{*LB>Og`=8IKY}B%9(R5b6aikW2(QY%>vCYfXDQWc) z=5tdop@ZpK7B2NXsb$0BHRC;gYx<9jy(gwhf2PVq)`r;1kM}%-jab|eCETTaM}>hlB>;)xrFb?n1rY0w0ZNb7SQ3$ zthB9ySuBpWyISjvb%Q7JW<+4r%10lo$6~OBbPdI*>|sDti7IVeY`7|R+S!u6r+iMb zkBeC^JrfGZfh@C_mP^nR$HpCSoBmuKwXxIKwmaslJaTlttBtwIWI@Ju!I>?NAW@PolZRov5V+W>yw0{?sYN{fWw^+g5OXe^n?`p$DyhBXfach{58ScuvQcd5BrHz0bs{JZWKCo{51u z7buRiy*Y$6|-m=|?mCh6NNZ%$aGBIsWmi;!>RP*Av z)@1QYcY)MZNl)cBQEm9vyv6Bju{ox6apupEAurnxm}cJ0ufjLo%XL2*rv%#c%5@

^3sYO|h}I@ho56 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 cj=~W{rRO06Bqk(c{dD**=UUa@t?;`4KiLd Date: Mon, 19 Feb 2024 21:03:34 -0500 Subject: [PATCH 46/73] RSI fixes --- .../Suits/atmos_firesuit.rsi/bottom.png | Bin 1036 -> 0 bytes .../OuterClothing/Suits/bombsuit.rsi/meta.json | 2 +- .../OuterClothing/Suits/eva.rsi/bottom.png | Bin 914 -> 0 bytes .../Suits/eva_emergency.rsi/bottom.png | Bin 893 -> 0 bytes .../Suits/eva_syndicate.rsi/bottom.png | Bin 922 -> 0 bytes .../OuterClothing/Suits/fire.rsi/bottom.png | Bin 975 -> 0 bytes .../OuterClothing/Suits/rad.rsi/bottom.png | Bin 1098 -> 0 bytes .../Hardsuits/Combat/riot.rsi/meta.json | 2 +- .../Hardsuits/Combat/warden.rsi/bottom.png | Bin 1093 -> 0 bytes 9 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/atmos_firesuit.rsi/bottom.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/eva.rsi/bottom.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/eva_emergency.rsi/bottom.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/eva_syndicate.rsi/bottom.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/fire.rsi/bottom.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/rad.rsi/bottom.png delete mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/warden.rsi/bottom.png diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/atmos_firesuit.rsi/bottom.png b/Resources/Textures/Clothing/OuterClothing/Suits/atmos_firesuit.rsi/bottom.png deleted file mode 100644 index 8ad4b108c2dde31303f938ddc6d5b3b0d6bb54eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1036 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|WCu zPZ!6KiaBp*?ajXJAaP87s=}S4W;2##OkB_*m!cuUBzQVNPB3l6W0yk*~-3F;#hOG=)TNv>QrnN;iaP@3d(l_8eSNYIx zDvyS9gVwZEMuwc*e&0%W$1*g$|9$GOs9A%d*izQ}H*X$%^k|We5>tYPcHn{1yWF?u z`lT=0$90}@T54kHQr6qs5@)4-Vq~~%l6c!JEIjI@;4HJVX~t3U+3^xJJ+F5~#AhGg zq_gzRjPi6n^_0u+P(Y^jY>9~F1%OFn6x~jcZHBWaRID0KG>*uN!x$;Zm-miPD zG-rXmD)X+pdaJH#u{AULTt0H~Vqj4C`s;;NRaT8GTYoSZ$nXWOziueOGwJ;$bw`F5 z-+z1leDj9KQ9yyC>B=u7AYZweze&L`(L%;gWd8=nUN>eZ4h9LyEqioZ92Q>;5DOG= z=4gytZ!To~@7>ob0jC2%Uvci(z!)7JtdSMuTghA77^nkJXfZ2>W^05AMrcC z{b$>XKl;!kdgnJbjitv8r~U4~&V54i;n}ligMuF)s9a{D_j})b73bM!)As1EJ6{_d z^I~nmEeA%Gm7iw#EiX=GJCXUxfM@cS$et`YL; z+)(l1b$0HZ+4PozQ*%JD&Xz^GcoK5v()* zr;B4q#hkaZHfG&+kU3^Q^%v_d8TLcR@&hjM7_tQ$lw@vB`7&v(V#yk_vvS6>CQVxE zY*STeBh}@)q0L0(6T>klg)LuLZB{r}pNibNba%+7{a3y_ZYY`b_3xLT?~1P751XWN zBi(i}+k$DF4N?tJY7AKnSu+_{Fs?{tT7XyZ{7S}>C%e|2V)j{m|Gjp6uy%tMLrG~- z5z{$Kh6lg@+Q!MrFfc6AIFw;>Y2UmehIOyi-iB$Lo?+_vd;6yiV?yR+jTLvZ8jJfh zx-OY*JZtH``|6>$HS0=!pIR;mTz`0P-3i;{d+Qt)$6aR%xcdC`X_p_x=Pt)7fZ*DQ%@d=G#_+09v>O{Gy5!Kph#j-;jDM*?G1NKR|kmx zi(*VU9)B&QZulwde;@#4j>`upD*9Ztt*a~vt$voZESj&LzY}`?KGd(w zZe4H8qVwRR+G7j9|4+(}MW|*stQI|b#D3L7PKXvKLl37L^ z{y#x`1&XFs{j2u zdX6a|F_2TSoa2P~|5qOb!rOl)+<*7(lfOn__&MpNpQkx8TrZuRt0;1gvA3#r?QHRx zZ=Fsn1SAPLEA@M43W+>^6(1Dovy-u69y`Co+A#0iPd=4ws%i`q zyuUBZ9m?W&Px>%Z43=JbHaYAXc#lzIJNXp$PNLae7?g4Z{0Z$ zxyUd#M6C_`dG@s3p>pBruheFq1KOy85}Sb4q9e015=1761SM diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/eva_emergency.rsi/bottom.png b/Resources/Textures/Clothing/OuterClothing/Suits/eva_emergency.rsi/bottom.png deleted file mode 100644 index 6caf9b938680613703eaea2ae199d7329299ec42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 893 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|T?Z zr;B4q#hkaZ?E7vxh#cGB`Dl*9rQjB6?~;8Cy|G7J^&EtY8amY4Z?e5*^>ChC#J${r zSG-`Vhl$(jPNk*%t-&)4ll31+rhHyvFu%p%vHg4V`RQqU>-?vrc2-~0&SS{4WZuEJ z<0;Prwg=OU8>Abe&oST?{JQHsx1Lht&#D>Ud%8Vl#6;XUvfb!_NP>s3U5kUm)o)hp zi#FW4=k-8y`~GjKx6jc=BzSe)=yiz0dPeb2ghx>MKwsYm#FcopS^efxc+s!gy`>;m#^Si>9 ze4&n9jv0@m*D^+Pvh*+hRbI{Y!nv4(SMdI+hHrne*?Bn*h;j?2*Q|ct;BRktt$3X+ zJM*e<{3{h7abLcZFiAyKP?3X);Xv8$wclUn26-*Xy!AW2QN`1XVTO-d`r~{vX@(75 z`6&*QR1PGTsxI1m+%vM*T}kNl(@RqhdUSgve0}yel1;Sw*Z195nNT+=kgq3|ilpPSN*MTErGJYgw3rSsv3MyV3AJ zwEX}51;m6oQtXuHH-uKntbN2BsxM#`f4N(6)8Sp4UT*YLoPMAt*6bdK_PVm)nv#1( z^U6#9Y&d*gKXlTjSosEN$pWRkW^MZ=YP)=1m^i$z39mh%_`{dSAkon9;UdPW=YO}~ zO>hleSSZZwQwdZO!+a~%aQc@i`y=?-0`<<$2w}6_KVhYD6w7tyXMfg*#`}o#{?Jl- zApW2-?(VYX%Wr#L*n2}cI`!{_(t^tRJ#Mq-?F!E^mSKvavUp+VQP5) zyObeT%RgR(l|kY3CP%F!=L{JwPNyEa@>5}npI+CZz$puwR@5>)sJ!=J?)Aqjb}ZlF zliyKT7O|60X6|*xn)~nfYCM{hwpp@kQAQ8TTy_KLUN^QQg^NGDxx!hxKu5Zc_r>Jr Z@+o}vC9HFneFx?z22WQ%mvv4FO#pa}f~f!i diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/eva_syndicate.rsi/bottom.png b/Resources/Textures/Clothing/OuterClothing/Suits/eva_syndicate.rsi/bottom.png deleted file mode 100644 index 5948e24e5c5cb11e06d09533f5045533a88cff54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 922 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|T>< zr;B4q#hkZMhW@u5Bx>80UBxnwL})JT6?i$xl>0Ah=rq36g!ZNNZBv)Nk)5@W`&Iu5 zDaEN=tXx6IPpE8CIvUgdW1al5jqjW0uJ5Q8>iRhM-QMbb?}dKOoe=a$HMu#O!F&$m z9i|-*c^-%z;7w=P&X8xpyo0siu;c;V2I+GQd5m`o*b2BGv>7+Rlm=>69XRa8y8LtH z#lx#M`o<-2N!MvJ`>;;QJhc3nn$_>m3uz9`@vzcEW?o7qY&A|2M6CFRSv4#XXqE=6u_IiPVqLZy66)@y=cR zM(DuYTG^sc(UKn){A*x0U2*HT#?n9DkGC5=IQ+W&$H(W(|NYleTl)6>d%ZO*1)sSu z=M*fzIw|!2@v_aF3_og%7vFxdH&WtJk%?A~LUr%iE_J`(13CpiC zF>o@3-jBbPFV@!ayW{ic;$U946PGt=Z9nUu=-8Q-xZ?jLrYohK6-yfH-fg>m?T#B; zOrKkn!!4Hd#Ew<(mv0kgUFBGK>HMnq+@VZn2KSi%i62?|VFk|=!6O>VHrC7y^=c}K z)|C%tN(HFI{rSy6RGfgLuU9<3A=IYt$V2ARxCPR#TUKi*%PzAJbQ0#V;a~pwXR|`f zoa7U>I*BO^GgsIMGRf!Xf82Y~LA>Me$)iqI()XqPAFT{nn86<;?NoYHb0f>9!-wun zU-U&&zNUKW&F`=O$!=ICny|>#_324br-_*ibN}2n{~D7Rew}fH8ne&WCo?BRGu_pQ z(lMWONYDBH=SjaEH6<$Ks@STmqNNX5oU$=V+`=w#z07mD^QC|*b(15Rv?eVx42iN? zCvZGCX==+cHmz0uO1{#aXTr1?86A#2T&}htrE9|x7YotMSt8qJpIx$S>Ffn3`4#6L zTV`A874r4(r*p>zG~|SRD_&h!;8ZF-z9nUv+v98v#*kY1%?33gT%A)jK7F|{N8sX; iliy1H_GQ@CGfv4o_4L7|(s{tl#^CAd=d#Wzp$PzC#+CyB diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/fire.rsi/bottom.png b/Resources/Textures/Clothing/OuterClothing/Suits/fire.rsi/bottom.png deleted file mode 100644 index a197cde57bb1403765e0e5db8fb6b413499573db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 975 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|RrT zr;B4q#hkaZ?6Yq>NF0+FEw1R|mFp6_tE6;7Oe1B@!s7P2R;TGgzgTy%eiGf4^6t*U z3pd+znw(AuSv*#}lw=cms-z{MG{fKa^rn*ZHTy2y;crr%Tl2p7{NIU-zwcS3@nKG- zqi%y#I>T0mtT~KVm{t_B1#mAoCh34zu<8m^PRF7XPgs|!w-~Iue5yf@<;J7mb_@y} zO`oD>En{dnnv@tjezK-khnoh~Yt`_C^Js!)rhPtl1YHdn~)*{qG$X z^OZQ5433?$XGrK#9fQGlpp+_ zo>}?!>h9z}f6TPc-><9bJ(|R*c;ukFL+l@|-$%BaIq=q-ekr|V^7alx?XS?l%K{DN zGktnqZH;1?-L(2st(em6A3Ymy{gi7{Y*KKLIUaWT!l?!m-@=lT7M;@vBo6=mTN`O6 z!}syShlJp{rmNbozcy_+uk~!g)w1k)YRkt{{AOE%T&(0KCS#<*4A4YHS?Y? z<$V2hS5LmxA4YCwx5a`>rZ8-{nDIBptMg(;ip(7$f3MD`MLPw9YxSmkduTrVz3=L; zgMD6;af)y35Fw~v^cJ*a}K-=TDE;&@8aKzUkDDId~(U@1VFehj#^2sqLSy6@TmY2Ts5Co>T z@{Ogl7;;`3UA>agAmFrgi7i9xs*w47EWOtsi+WCKD2}@>={76M-Qg&UgYhA?0QZ~{ fpQpP7_cMH}Ua9$g17{R4hcbA&`njxgN@xNA{k*zs diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/rad.rsi/bottom.png b/Resources/Textures/Clothing/OuterClothing/Suits/rad.rsi/bottom.png deleted file mode 100644 index 3124c036881f3812649c162ef9e3057d8a575d1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1098 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|WCP zPZ!6KiaBp*8G1+uN*wu&9CwrRX7AT;E^QUvB|58*@9IUdGpiJ0 zm#i!)UZD`Heh%}xX-=hJs*4AeyjUE#k+5)2-;tg+hDNt zW@{3gZSviPkE@RD3e-rOa5Y=D_S(FZKOWi-&Uh`{6XII0U-158+=CsLgG7I;ANUlt zrqxx-e%qzXL8kBAt-O{$b~j7dtJAl5=eOiZ2W0Etl*V8Fdg;%@t&g$;y^@W8ns6QM zIV*Aaws?Ev<9qe5n4il$UAoH52BdoVP~^Z|N+T*~?aXDnB~X zmvi9%skQ&jSMV$lbLcf{h+;53#gN5#MT2<-YrtZhg1$?3HSE^2w=G}#bA4)Q{>@)k zt#?0uT6pr%lxLM4n#sBAJ0^Vnv_sn6d-c4=ZEPo=q)y@vp7qwxVD)vIr<+txCkvJD zY1KR{ceYdI`soio$7W7tIwJh!04JyEf%$uQ_UyehqxGVUfq_cax81i-eq-M;(Xi2X z!M_=I>;)tDUc1)fz?||47`+SuaYCUt|HZwxxVb^$)U~@a&Z@`Tp0j<=wxNB$y?jDK z#*USSN&j7DC>~>+EIi$zfpej@!s_b=v)4bm=1YYhr#Xf#9YTra( zT>JX4dqvRp%c|W=9d|h`&nbEoq%C4>_Iyujc-w3i?L%@;mYuO=Pu2;U?j8JKNsE~K z->VTf=R7!ecZI^~%bp=^>sNDreWI?e_xQiSCLM3KD-1U_$saKBUG98j{vX~)8IvU1 z9%jyQXlXmSZTGa>EXO1)o^R9dQ2(itzMoZ2c#%$}{eOnJuBSEFzWn`l8U6JKN`d>+cg;IBm0$6$xlqd)!Tzl%LJcl&|$jw_KL~O8JnJ*Ws-aI zo{_;WQaj;S>8|$&HeQ$>ldXCEKpJUdVrQXU40|?(GZ=#djO; z-;nff(MkHy^zZc~o**`v`7wvKFvO-8&d$5T%22ZF@8;x_C+5j#B)+_7E3?jegGKv6 z38!;{TcVSnPLE=G_UG$$%jXZ~JoYXuP57@eV=vEw*F5d7`3~j%+mPL~&iG6m+a<%L zBL6LR?mAy|uKHFh=c0O{j_B9ho7dY)9jU+g?|qMEDfcu(2j+(FrShz|k3D~O{m1%* z+ZFNOt6Th-1g%#p&fL9Y&$5%}m~^u%_q+*ZU{F2ox;3iX>7VgC;~O^L_M52v`Y`#) z#mC|oCI2^0_}_By*}~1NHr07ae%-%uZ^rSR-hI;B^K=~KIJ-}(*GBX)4yJ}{MYrE%g59tndVJJ#=)vd*iliuq;ksq%Hr zx;yNbO;ysJqUKEWPPp)3a=`hPEq|7!exGeH;f(k}$IgOtItIW*x>Lb;FEffAe#56)kpNDv Date: Mon, 19 Feb 2024 21:07:36 -0500 Subject: [PATCH 47/73] APGLv3 --- .../DeltaV/Lamiae/ClientLamiaVisuals.cs | 6 ++++++ .../Lamiae/LamiaSegmentVisualsComponent.cs | 6 ++++++ Content.Server/DeltaV/Lamiae/LamiaSystem.cs | 6 ++++++ Content.Shared/DeltaV/Lamiae/LamiaComponent.cs | 6 ++++++ .../DeltaV/Lamiae/LamiaSegmentComponent.cs | 6 ++++++ .../DeltaV/Lamiae/LamiaSegmentVisuals.cs | 6 ++++++ .../DeltaV/Lamiae/SharedLamiaeSystem.cs | 6 ++++++ .../Mobs/Customization/Markings/lamia.yml | 4 ++++ .../Customization/Markings/lamiasegment.yml | 17 ++++------------- .../DeltaV/Entities/Mobs/Player/lamia.yml | 4 ++++ .../DeltaV/Entities/Mobs/Species/lamia.yml | 4 ++++ .../Entities/Objects/Specific/Species/lamia.yml | 4 ++++ Resources/Prototypes/DeltaV/Species/lamia.yml | 4 ++++ 13 files changed, 66 insertions(+), 13 deletions(-) diff --git a/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs b/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs index 00a9f798f71..8b9f3b4c472 100644 --- a/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs +++ b/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs @@ -1,3 +1,9 @@ +/* +* Delta-V - This file is licensed under AGPLv3 +* Copyright (c) 2024 Delta-V Contributors +* See AGPLv3.txt for details. +*/ + using Robust.Client.GameObjects; using System.Numerics; using Content.Shared.DeltaV.Lamiae; diff --git a/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs b/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs index b74529e2873..d2d519e2c82 100644 --- a/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs +++ b/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs @@ -1,3 +1,9 @@ +/* +* Delta-V - This file is licensed under AGPLv3 +* Copyright (c) 2024 Delta-V Contributors +* See AGPLv3.txt for details. +*/ + namespace Content.Client.DeltaV.Lamiae; [RegisterComponent] diff --git a/Content.Server/DeltaV/Lamiae/LamiaSystem.cs b/Content.Server/DeltaV/Lamiae/LamiaSystem.cs index ee4a763773f..a8bdd58b661 100644 --- a/Content.Server/DeltaV/Lamiae/LamiaSystem.cs +++ b/Content.Server/DeltaV/Lamiae/LamiaSystem.cs @@ -1,3 +1,9 @@ +/* +* Delta-V - This file is licensed under AGPLv3 +* Copyright (c) 2024 Delta-V Contributors +* See AGPLv3.txt for details. +*/ + using Robust.Shared.Physics; using Content.Shared.Damage; using Content.Shared.Explosion; diff --git a/Content.Shared/DeltaV/Lamiae/LamiaComponent.cs b/Content.Shared/DeltaV/Lamiae/LamiaComponent.cs index 4aadc196046..95540958ccb 100644 --- a/Content.Shared/DeltaV/Lamiae/LamiaComponent.cs +++ b/Content.Shared/DeltaV/Lamiae/LamiaComponent.cs @@ -1,3 +1,9 @@ +/* +* Delta-V - This file is licensed under AGPLv3 +* Copyright (c) 2024 Delta-V Contributors +* See AGPLv3.txt for details. +*/ + namespace Content.Shared.DeltaV.Lamiae { ///

diff --git a/Content.Shared/DeltaV/Lamiae/LamiaSegmentComponent.cs b/Content.Shared/DeltaV/Lamiae/LamiaSegmentComponent.cs index 9e54c1340bc..82de76ca1a9 100644 --- a/Content.Shared/DeltaV/Lamiae/LamiaSegmentComponent.cs +++ b/Content.Shared/DeltaV/Lamiae/LamiaSegmentComponent.cs @@ -1,3 +1,9 @@ +/* +* Delta-V - This file is licensed under AGPLv3 +* Copyright (c) 2024 Delta-V Contributors +* See AGPLv3.txt for details. +*/ + using Robust.Shared.GameStates; namespace Content.Shared.DeltaV.Lamiae diff --git a/Content.Shared/DeltaV/Lamiae/LamiaSegmentVisuals.cs b/Content.Shared/DeltaV/Lamiae/LamiaSegmentVisuals.cs index 7de06db4e32..2d73dd746ea 100644 --- a/Content.Shared/DeltaV/Lamiae/LamiaSegmentVisuals.cs +++ b/Content.Shared/DeltaV/Lamiae/LamiaSegmentVisuals.cs @@ -1,3 +1,9 @@ +/* +* Delta-V - This file is licensed under AGPLv3 +* Copyright (c) 2024 Delta-V Contributors +* See AGPLv3.txt for details. +*/ + using Robust.Shared.Serialization; namespace Content.Shared.DeltaV.Lamiae diff --git a/Content.Shared/DeltaV/Lamiae/SharedLamiaeSystem.cs b/Content.Shared/DeltaV/Lamiae/SharedLamiaeSystem.cs index bea990d37cb..de66e5d5301 100644 --- a/Content.Shared/DeltaV/Lamiae/SharedLamiaeSystem.cs +++ b/Content.Shared/DeltaV/Lamiae/SharedLamiaeSystem.cs @@ -1,3 +1,9 @@ +/* +* Delta-V - This file is licensed under AGPLv3 +* Copyright (c) 2024 Delta-V Contributors +* See AGPLv3.txt for details. +*/ + namespace Content.Shared.DeltaV.Lamiae; public sealed class SegmentSpawnedEvent : EntityEventArgs diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamia.yml index 16f88a0c5ea..113cb7e29f4 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamia.yml @@ -1,3 +1,7 @@ +# Delta-V - This file is licensed under AGPLv3 +# Copyright (c) 2024 Delta-V Contributors +# See AGPLv3.txt for details. + - type: marking id: LamiaBottom bodyPart: Tail diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamiasegment.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamiasegment.yml index c6271da70c5..9d9a0d9c801 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamiasegment.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamiasegment.yml @@ -1,18 +1,9 @@ -- type: marking - id: LamiaBottom-LamiaSegment - bodyPart: Tail - markingCategory: Tail - speciesRestriction: [LamiaSegment] - sprites: - - sprite: Nyanotrasen/Mobs/Customization/lamia_tails.rsi - state: body3tone1 - - sprite: Nyanotrasen/Mobs/Customization/lamia_tails.rsi - state: body3tone2 - - sprite: Nyanotrasen/Mobs/Customization/lamia_tails.rsi - state: body3tone3 +# Delta-V - This file is licensed under AGPLv3 +# Copyright (c) 2024 Delta-V Contributors +# See AGPLv3.txt for details. - type: marking - id: LamiaBottom-LamiaSegmentEnd + id: LamiaBottom-LamiaSegment bodyPart: Tail markingCategory: Tail speciesRestriction: [LamiaSegment] diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/lamia.yml index 41a8f746b1e..ca6fe618f5e 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/lamia.yml @@ -1,3 +1,7 @@ +# Delta-V - This file is licensed under AGPLv3 +# Copyright (c) 2024 Delta-V Contributors +# See AGPLv3.txt for details. + - type: entity save: false name: Urist McNoodle diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml index 992c3d7e7b1..19155e83934 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml @@ -1,3 +1,7 @@ +# Delta-V - This file is licensed under AGPLv3 +# Copyright (c) 2024 Delta-V Contributors +# See AGPLv3.txt for details. + - type: entity save: false name: Lamia diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml index f050fa78d64..27e72b568fd 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml @@ -1,3 +1,7 @@ +# Delta-V - This file is licensed under AGPLv3 +# Copyright (c) 2024 Delta-V Contributors +# See AGPLv3.txt for details. + - type: entity id: LamiaInitialSegment noSpawn: true diff --git a/Resources/Prototypes/DeltaV/Species/lamia.yml b/Resources/Prototypes/DeltaV/Species/lamia.yml index 4ebbf140348..14885b30ff9 100644 --- a/Resources/Prototypes/DeltaV/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Species/lamia.yml @@ -1,3 +1,7 @@ +# Delta-V - This file is licensed under AGPLv3 +# Copyright (c) 2024 Delta-V Contributors +# See AGPLv3.txt for details. + - type: species id: Lamia name: Lamia From 238cb53ba879df9254242a73ed8e00dad254f6a7 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 19 Feb 2024 21:11:06 -0500 Subject: [PATCH 48/73] Update lamia.yml --- Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml index 19155e83934..8d1d29689ac 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml @@ -166,7 +166,6 @@ - type: MeleeWeapon #This damage is most likely final soundHit: path: /Audio/Items/hypospray.ogg #this sound is not final, but is a pretty good placeholder so we might keep it - range: 0.8 animation: WeaponArcBite damage: types: @@ -199,7 +198,7 @@ shape: !type:PhysShapeCircle radius: 0.35 - density: 400 #Density is not final, adjust accordingly if the number of tail segments is reduced or increased + density: 1000 #Density is not final, adjust accordingly if the number of tail segments is reduced or increased restitution: 0.0 mask: - MobMask From 214c9344b2d13588e9c92f84070a45a8a85a196a Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 19 Feb 2024 21:30:11 -0500 Subject: [PATCH 49/73] send it --- .../DeltaV/Entities/Mobs/Player/lamia.yml | 1 - .../DeltaV/Entities/Mobs/Species/lamia.yml | 17 ++--------------- .../lamia_inventory_template.yml | 3 --- .../OuterClothing/base_clothingouter.yml | 1 + .../Clothing/OuterClothing/softsuits.yml | 6 ++++++ 5 files changed, 9 insertions(+), 19 deletions(-) diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/lamia.yml index ca6fe618f5e..1f5397e5dc3 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/lamia.yml @@ -16,7 +16,6 @@ interactSuccessSound: /Audio/Effects/thudswoosh.ogg messagePerceivedByOthers: hugging-success-generic-others - type: Mind - showExamineInfo: true - type: Input context: "human" - type: MobMover diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml index 8d1d29689ac..8c3645c7008 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml @@ -43,9 +43,9 @@ interactFailureString: petting-failure-lamia interactSuccessSpawn: EffectHearts interactSuccessSound: - path: /Audio/Mobs/Animals/purr.ogg #placeholder sound + path: /Audio/Mobs/Animals/lizard_happy.ogg #placeholder sound interactFailureSound: - path: /Audio/Mobs/Animals/hiss.ogg #placeholder sound + path: /Audio/Mobs/Animals/snake_hiss.ogg #placeholder sound - type: Icon sprite: Mobs/Species/Human/parts.rsi state: full @@ -114,9 +114,6 @@ - map: [ "pocket1" ] - map: [ "pocket2" ] - map: [ "enum.HumanoidVisualLayers.HeadTop" ] - - type: Body - template: LamiaTemplate - preset: LamiaPreset - type: Damageable damageContainer: Biological damageModifierSet: Scale #TODO: make a new damage modifier set @@ -148,12 +145,6 @@ 100: 0.7 120: 0.6 140: 0.5 - - type: Appearance - visuals: - - type: RotationVisualizer - - type: BuckleVisualizer - - type: CreamPiedVisualizer - state: creampie_human - type: FireVisuals sprite: Mobs/Effects/onfire.rsi normalState: Generic_mob_burning @@ -172,7 +163,6 @@ Piercing: 1 Poison: 2 Asphyxiation: 2 - ignoreResistances: true #We're basically going for a biological hypospray, but ideally I only want the piercing to ignore resistances - type: SolutionContainerManager solutions: melee: @@ -216,9 +206,6 @@ - type: StandingState - type: Fingerprint - type: Perishable - - type: FootstepModifier - footstepSoundCollection: - collection: FootstepLamia - type: Bloodstream bloodMaxVolume: 60000 bloodlossDamage: diff --git a/Resources/Prototypes/DeltaV/InventoryTemplates/lamia_inventory_template.yml b/Resources/Prototypes/DeltaV/InventoryTemplates/lamia_inventory_template.yml index ce477b46f43..546d0746b7a 100644 --- a/Resources/Prototypes/DeltaV/InventoryTemplates/lamia_inventory_template.yml +++ b/Resources/Prototypes/DeltaV/InventoryTemplates/lamia_inventory_template.yml @@ -19,9 +19,6 @@ uiWindowPos: 1,2 strippingWindowPos: 1,2 displayName: Suit - whitelist: - tags: - - AllowLamiaHardsuit - name: gloves slotTexture: gloves slotFlags: GLOVES diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index fb7a34e9ee6..da9d756c997 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -114,6 +114,7 @@ size: Huge - type: Tag tags: + - AllowLamiaHardsuit #DeltaV: Used by Lamia to render snek hardsuits - HidesHarpyWings #DeltaV: Used by harpies to help render their hardsuit sprites - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml index 58faf268470..ce074a71f38 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml @@ -14,6 +14,8 @@ - SuitEVA - MonkeyWearable - WhitelistChameleon + - AllowLamiaHardsuit #DeltaV: Used by Lamia to render snek hardsuits + - HidesHarpyWings #DeltaV: Used by harpies to help render their hardsuit sprites #Syndicate EVA - type: entity @@ -31,6 +33,8 @@ - SuitEVA - MonkeyWearable - WhitelistChameleon + - AllowLamiaHardsuit #DeltaV: Used by Lamia to render snek hardsuits + - HidesHarpyWings #DeltaV: Used by harpies to help render their hardsuit sprites #Emergency EVA - type: entity @@ -72,6 +76,8 @@ - SuitEVA - MonkeyWearable - WhitelistChameleon + - AllowLamiaHardsuit #DeltaV: Used by Lamia to render snek hardsuits + - HidesHarpyWings #DeltaV: Used by harpies to help render their hardsuit sprites #NTSRA Voidsuit / Ancient Voidsuit - type: entity From 221991fb2b9a88c4bb9421d57c4ab784b25c77ff Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 19 Feb 2024 21:53:38 -0500 Subject: [PATCH 50/73] More small fixes --- Content.Server/DeltaV/Lamiae/LamiaSystem.cs | 3 ++- Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml | 4 ++-- .../DeltaV/Entities/Objects/Specific/Species/lamia.yml | 1 - 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Content.Server/DeltaV/Lamiae/LamiaSystem.cs b/Content.Server/DeltaV/Lamiae/LamiaSystem.cs index a8bdd58b661..16cb9dd628c 100644 --- a/Content.Server/DeltaV/Lamiae/LamiaSystem.cs +++ b/Content.Server/DeltaV/Lamiae/LamiaSystem.cs @@ -206,7 +206,7 @@ public void SpawnSegments(EntityUid uid, LamiaComponent component) private EntityUid AddSegment(EntityUid uid, EntityUid lamia, LamiaComponent lamiaComponent, int segmentNumber) { - EnsureComp(uid, out var segmentComponent); + LamiaSegmentComponent segmentComponent = new(); segmentComponent.MaxSegments = lamiaComponent.NumberOfSegments; segmentComponent.BulletPassover = lamiaComponent.BulletPassover; segmentComponent.Lamia = lamia; @@ -238,6 +238,7 @@ private EntityUid AddSegment(EntityUid uid, EntityUid lamia, LamiaComponent lami segmentComponent.Owner = segment; segmentComponent.SegmentNumber = segmentNumber; + EntityManager.AddComponent(segment, segmentComponent, true); _segments.Enqueue((segmentComponent, lamia)); lamiaComponent.Segments.Add(segmentComponent.Owner); diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml index 8c3645c7008..e47bdb1e482 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml @@ -43,9 +43,9 @@ interactFailureString: petting-failure-lamia interactSuccessSpawn: EffectHearts interactSuccessSound: - path: /Audio/Mobs/Animals/lizard_happy.ogg #placeholder sound + path: /Audio/Animals/lizard_happy.ogg #placeholder sound interactFailureSound: - path: /Audio/Mobs/Animals/snake_hiss.ogg #placeholder sound + path: /Audio/Animals/snake_hiss.ogg #placeholder sound - type: Icon sprite: Mobs/Species/Human/parts.rsi state: full diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml index 27e72b568fd..e3c9b514ad6 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml @@ -32,7 +32,6 @@ - type: Tag tags: - HideContextMenu - - type: Pullable - type: entity id: LamiaSegment From 389b01a2af89438cd4a63fc08aa2b7f730cc07e6 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 19 Feb 2024 22:06:27 -0500 Subject: [PATCH 51/73] guh --- .../Mobs/Customization/Markings/lamia.yml | 8 +++++--- .../Mobs/Customization/Markings/lamiasegment.yml | 8 +++++--- .../Lamia}/lamia_tails.rsi/body3tone1.png | Bin .../Lamia}/lamia_tails.rsi/body3tone2.png | Bin .../Lamia}/lamia_tails.rsi/body3tone3.png | Bin .../Lamia}/lamia_tails.rsi/bottom3tone1.png | Bin .../Lamia}/lamia_tails.rsi/bottom3tone2.png | Bin .../Lamia}/lamia_tails.rsi/bottom3tone3.png | Bin .../Lamia}/lamia_tails.rsi/meta.json | 7 +++++++ .../Lamia}/lamia_tails.rsi/tip3tone1.png | Bin .../Lamia}/lamia_tails.rsi/tip3tone2.png | Bin .../Lamia}/lamia_tails.rsi/tip3tone3.png | Bin .../Lamia/lamia_tails.rsi/underscales.png | Bin 0 -> 621 bytes .../Lamia/lamia_tails.rsi/underscalessegment.png | Bin 0 -> 546 bytes 14 files changed, 17 insertions(+), 6 deletions(-) rename Resources/Textures/{Nyanotrasen/Mobs/Customization => DeltaV/Mobs/Customization/Lamia}/lamia_tails.rsi/body3tone1.png (100%) rename Resources/Textures/{Nyanotrasen/Mobs/Customization => DeltaV/Mobs/Customization/Lamia}/lamia_tails.rsi/body3tone2.png (100%) rename Resources/Textures/{Nyanotrasen/Mobs/Customization => DeltaV/Mobs/Customization/Lamia}/lamia_tails.rsi/body3tone3.png (100%) rename Resources/Textures/{Nyanotrasen/Mobs/Customization => DeltaV/Mobs/Customization/Lamia}/lamia_tails.rsi/bottom3tone1.png (100%) rename Resources/Textures/{Nyanotrasen/Mobs/Customization => DeltaV/Mobs/Customization/Lamia}/lamia_tails.rsi/bottom3tone2.png (100%) rename Resources/Textures/{Nyanotrasen/Mobs/Customization => DeltaV/Mobs/Customization/Lamia}/lamia_tails.rsi/bottom3tone3.png (100%) rename Resources/Textures/{Nyanotrasen/Mobs/Customization => DeltaV/Mobs/Customization/Lamia}/lamia_tails.rsi/meta.json (84%) rename Resources/Textures/{Nyanotrasen/Mobs/Customization => DeltaV/Mobs/Customization/Lamia}/lamia_tails.rsi/tip3tone1.png (100%) rename Resources/Textures/{Nyanotrasen/Mobs/Customization => DeltaV/Mobs/Customization/Lamia}/lamia_tails.rsi/tip3tone2.png (100%) rename Resources/Textures/{Nyanotrasen/Mobs/Customization => DeltaV/Mobs/Customization/Lamia}/lamia_tails.rsi/tip3tone3.png (100%) create mode 100644 Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/underscales.png create mode 100644 Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/underscalessegment.png diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamia.yml index 113cb7e29f4..159c53d1e9a 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamia.yml @@ -8,9 +8,11 @@ markingCategory: Tail speciesRestriction: [Lamia] sprites: - - sprite: Nyanotrasen/Mobs/Customization/lamia_tails.rsi + - sprite: DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi state: bottom3tone1 - - sprite: Nyanotrasen/Mobs/Customization/lamia_tails.rsi + - sprite: DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi state: bottom3tone2 - - sprite: Nyanotrasen/Mobs/Customization/lamia_tails.rsi + - sprite: DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi state: bottom3tone3 + - sprite: DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi + state: underscales diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamiasegment.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamiasegment.yml index 9d9a0d9c801..e1482b0d45d 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamiasegment.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamiasegment.yml @@ -8,9 +8,11 @@ markingCategory: Tail speciesRestriction: [LamiaSegment] sprites: - - sprite: Nyanotrasen/Mobs/Customization/lamia_tails.rsi + - sprite: DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi state: body3tone1 - - sprite: Nyanotrasen/Mobs/Customization/lamia_tails.rsi + - sprite: DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi state: body3tone2 - - sprite: Nyanotrasen/Mobs/Customization/lamia_tails.rsi + - sprite: DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi state: body3tone3 + - sprite: DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi + state: underscalessegment diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/body3tone1.png b/Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/body3tone1.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/body3tone1.png rename to Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/body3tone1.png diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/body3tone2.png b/Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/body3tone2.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/body3tone2.png rename to Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/body3tone2.png diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/body3tone3.png b/Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/body3tone3.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/body3tone3.png rename to Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/body3tone3.png diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/bottom3tone1.png b/Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/bottom3tone1.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/bottom3tone1.png rename to Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/bottom3tone1.png diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/bottom3tone2.png b/Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/bottom3tone2.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/bottom3tone2.png rename to Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/bottom3tone2.png diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/bottom3tone3.png b/Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/bottom3tone3.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/bottom3tone3.png rename to Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/bottom3tone3.png diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/meta.json similarity index 84% rename from Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/meta.json rename to Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/meta.json index 5374b72d74e..159776f43a8 100644 --- a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/meta.json +++ b/Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/meta.json @@ -7,6 +7,10 @@ "y": 32 }, "states": [ + { + "name": "underscales", + "directions": 4 + }, { "name": "bottom3tone1", "directions": 4 @@ -36,6 +40,9 @@ }, { "name": "tip3tone3" + }, + { + "name": "underscalessegment" } ] } diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/tip3tone1.png b/Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/tip3tone1.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/tip3tone1.png rename to Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/tip3tone1.png diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/tip3tone2.png b/Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/tip3tone2.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/tip3tone2.png rename to Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/tip3tone2.png diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/tip3tone3.png b/Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/tip3tone3.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Mobs/Customization/lamia_tails.rsi/tip3tone3.png rename to Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/tip3tone3.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/underscales.png b/Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/underscales.png new file mode 100644 index 0000000000000000000000000000000000000000..edc457a79b7e3bbb117a90a32d9016829319a14e GIT binary patch literal 621 zcmV-z0+RiSP)EX>4Tx04R}tkv&MmKpe$iTct%>1lvKxAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRx%k-{RDAVPqQIx48bLV{L}6cZWRPkQ)=9KT2|nOqex zax9<*6_Voz|AXJ%n#IWpHz}M1dS7h&V+0890jVfq16NwdUuyz0pQJZB zTKov;-v%zOJDR))TFiG>?GT@Au4+FX^000000Ki>5B8z(O@855&wNR~WugIcO%Itll2_3+; zZL{~0Mgk&>BtQcGCjsHnwXW-T6xLcVIRXIy0001PXZSWZ<92vv&(OQTUd9{2%$~ys zknu`1v!?`%7LWi5kboKcIDOAU`4Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmO>As1<@2>O_pVIHeg443h@VW71o2dc`y)?7ytkO006k*?p;k4hw|3z{f&rd kYN(~YD(Bp_di%+21E}9Y{jC`qM*si-07*qoM6N<$f=uM|RsaA1 literal 0 HcmV?d00001 From c01fdd3cd2f7eb64500704c1aa803e7c27052542 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 19 Feb 2024 22:53:21 -0500 Subject: [PATCH 52/73] more --- .../Mobs/Customization/Markings/lamia.yml | 2 - .../Customization/Markings/lamiasegment.yml | 2 - .../Objects/Specific/Species/lamia.yml | 20 ------- Resources/Prototypes/DeltaV/Species/lamia.yml | 22 -------- .../equipped-OUTERCLOTHING-lamia.png | Bin 0 -> 1769 bytes .../ERTSuits/ertjanitor.rsi/meta.json | 53 ++++++++++-------- .../ERTSuits/ertjanitor.rsi/segment.png | Bin 0 -> 372 bytes .../Lamia/lamia_tails.rsi/bottom3tone1.png | Bin 692 -> 763 bytes .../Lamia/lamia_tails.rsi/bottom3tone2.png | Bin 779 -> 869 bytes .../Lamia/lamia_tails.rsi/bottom3tone3.png | Bin 871 -> 1083 bytes .../Lamia/lamia_tails.rsi/meta.json | 7 --- .../Lamia/lamia_tails.rsi/underscales.png | Bin 621 -> 0 bytes .../lamia_tails.rsi/underscalessegment.png | Bin 546 -> 0 bytes 13 files changed, 30 insertions(+), 76 deletions(-) create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertjanitor.rsi/equipped-OUTERCLOTHING-lamia.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertjanitor.rsi/segment.png delete mode 100644 Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/underscales.png delete mode 100644 Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/underscalessegment.png diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamia.yml index 159c53d1e9a..65af873fe6e 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamia.yml @@ -14,5 +14,3 @@ state: bottom3tone2 - sprite: DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi state: bottom3tone3 - - sprite: DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi - state: underscales diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamiasegment.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamiasegment.yml index e1482b0d45d..432b2ee8416 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamiasegment.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/lamiasegment.yml @@ -14,5 +14,3 @@ state: body3tone2 - sprite: DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi state: body3tone3 - - sprite: DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi - state: underscalessegment diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml index e3c9b514ad6..f88c640c3bb 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml @@ -55,23 +55,3 @@ - DoorBumpOpener - type: HumanoidAppearance species: LamiaSegment - -- type: entity - id: LamiaSegmentEnd - parent: LamiaSegment - name: lamia tail tip - noSpawn: true - description: The end of a lamia's tail. - components: - - type: Sprite - sprite: Nyanotrasen/Mobs/Species/lamia.rsi - layers: - - map: [ "enum.HumanoidVisualLayers.Tail" ] - - map: [ "enum.LamiaSegmentVisualLayers.Armor" ] - sprite: Clothing/OuterClothing/Hardsuits/basic.rsi - state: segment - visible: false - - type: LamiaSegment - segmentId: tip - - type: HumanoidAppearance - species: LamiaSegmentEnd diff --git a/Resources/Prototypes/DeltaV/Species/lamia.yml b/Resources/Prototypes/DeltaV/Species/lamia.yml index 14885b30ff9..a6cfbf90fe1 100644 --- a/Resources/Prototypes/DeltaV/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Species/lamia.yml @@ -29,17 +29,6 @@ sexes: - Female -- type: species - id: LamiaSegmentEnd - name: LamiaSegmentEnd - roundStart: false - prototype: LamiaSegmentEnd - dollPrototype: MobLamiaDummy - sprites: MobLamiaSegmentEndSprites - markingLimits: MobLamiaSegmentEndMarkingLimits - skinColoration: HumanToned - sexes: - - Female - type: markingPoints id: MobLamiaMarkingLimits @@ -59,12 +48,6 @@ points: 1 required: false -- type: markingPoints - id: MobLamiaSegmentEndMarkingLimits - points: - Tail: - points: 1 - required: false - type: speciesBaseSprites id: MobLamiaSprites @@ -83,8 +66,3 @@ id: MobLamiaSegmentSprites sprites: Tail: MobHumanoidAnyMarking - -- type: speciesBaseSprites - id: MobLamiaSegmentEndSprites - sprites: - Tail: MobHumanoidAnyMarking diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertjanitor.rsi/equipped-OUTERCLOTHING-lamia.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertjanitor.rsi/equipped-OUTERCLOTHING-lamia.png new file mode 100644 index 0000000000000000000000000000000000000000..a61d875e727a139fae9d80069cab1645a26097ad GIT binary patch literal 1769 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D27XCIK~#8N?OI)E z990y)8&Q*u(PrCbZ9Wf-@Oh9~4#0QN~UlobqgP^`h z9whh^l=MMFd?^0Z#7#@{v$PVDZZ>AqB)Ex6cAW2K&gAxHcjn&NnZ%m;;Bx2w?0n~Z zbMBpG&SfD&ga{ELM2HYO6%nhxp^!`_4eQdz#KeRrUuvvc2`3JJYJglefch|Qbp-H_e6Q8jQKP|GE znHkp9)WrKqeYDY!am*u8{DRC6fE!Me4PNF&O8g}J z(9n>5?Ump0-3bM0ec{HUqUgVyy>72N0?iYDXANni62BM~1bX_q{7QSk@%DZ@oQNFj zZ8AG%uRH3;Jk0kKGC!U!);Sflz4AM%L+{>?2A|_Z;*+ifC=XFyIQ|LyqW?$s)yT7+ zBfyDYi~@1(>+(AeLQN2X9IqR!IkAm(M>R-klM>t2E&-A6yYGLnMk?d6M<3DRcQvl7 ztIGg+UteG3(EUeTch%9~h9lkG-3E*p7#Q&EJVEB))wtUlVXU}nuxRZD#kGZbZGL3~ zLB2ncW($QsSYvFD)w==ezijRcFv9Bg6(m3+eV7&IrrGq&9BXOb%g4Y^0`Lw+C~blS zkbt}#;5^2Ig6zBu^kZBlN=0Z1P>GySNu2*Ov;+VuJ>?*uz6g2%#7DK$gK>hE0NJq- zJJjWZevEGgz$Zd(>p)9@`Na~iYipyM3P9sQ0r!Wq;Dg|?UG=<18~tARwFGEv*qB}{ z7VSb1$AiF4r3LP6T{Oy8EN;|jqaWkC(6V@Gah}(r(*U(;JP6S1Eq8T_w~3Q#>JRKS zNH-q6m}R^7nD6^5Q+7cc{o=eJP|k*Gxjh-XuQg??6ql_QGefX}U7Z>a%yAj}(+?V} z#U(TRmpONB^mcZ6?B^}x5AlD(wug;jX#I25MkM0wVzBS68vvmIR=r~p3SiYc7NG!E zy z_jwxnKqAf4V-N+!ni4otsgz+lzxK-MuUX=r6u0GC{Riyc=v&qdb!a^~`c6-Y2qYl@ zBrH@@Q8IKQz;qn-Z1XGVs}s=EY~4Mo=Vua!UfH91`Fz=H0lX&nJNJ3DJ8Cnwi# zt*f_s)m)zGxDqHzYhXX%K4VM7+Wr^Cm?`$^IbeO1;qBYuwTx78>j$)xeRJd z2iJ~1{J5PEy)=5B*FZz8mDhi-6nO1skLxBVI*-#BZHFG<1Z1bZ zo!}?{sYa=1r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000-Ln`9l-rDHb93XP6aE3%=g37hIJEP@~ zF3kMJ_DkfKjoP|jTyL%!96H3tymQ`UnaS4_?no`Y^{@UUr|rX{_vPPE{cKe4rrFT!=3Jes{O<8E3UEiCsYm$$3w!7yt z@ya_j&eqd)wr#4C+9muU(CV1o%+_`0QEyPceyh)R)wM!m4~@_6*s7@9 a^g#9sgUqg$b9whcPV;p2b6Mw<&;$UOM3=z; delta 259 zcmey(x`lPaF2?%93=DjS8IR|$NMT@LxZ&yI7*Y}U_JS>6lY>B8;>?e?^T8?IH~N{*aXoy+bTxa9}4h^ygC#zO`+lF59xw)Ipt zOx1b5YSpFZ)ARPdU;lK`?rq(LGgbW8?;Zn`(E{MX4Rf@$Q=1e~l(dtG=A{GVhbAW{7{<5-((meW4o9UI6P? zK%-*AFa(*nR@Zf$rm1XIN;2j5uzCP|(!A&y595rQ5-(_qeW4n!@CtmYmY8BMOk3TQ z-^2O~oOt3lQS@6~20<%LlO^;D@VM{$L-V;Dmn{zf00000000000DF{W`J+OkSNfH< z>$)!$ZhH7T`aFNnA8p$X(=*iJWUMS&aJUOFd>>U%ox+p;d+avc1gh@Uqm>Qr}3OmPTX g;|M(#xUMMr168ez=mo_~=l}o!07*qoM6N<$f+Xq4O8@`> delta 347 zcmV-h0i^!r28#x;x&eQ~000id0mpBsWB>pGFG)l}RCr$P*}-vxFc3gdNF#257D5Ts z0C#TCL9S4NXDEUaNDK6%cr|EdM`Pj0v2m3AciHt~(5{UxkO2Sy00000z;8ATgW1wx z9^-9`$&rDVWx0FsB+0Nbeg0A^9{- z9};i5`5fIC^FEH_vaV}Z6osw1+&!1?`#zV&CE70>z^y0I_2IuKki6@*}vs=eyxe4?DY{kb{Bmy*>`(;&wYM2e?7mC tYsVf!E*84rLl^pny*`fa1ppG2WnVLKPdYMWB7gt@002ovPDHLkV1g1tp56ce diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/bottom3tone3.png b/Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi/bottom3tone3.png index b3f6dee64750bdd4305577e16ebec43be9b6e94f..2871eb45d882791c78d99e2718f4fbf75de55811 100644 GIT binary patch delta 654 zcmV;90&)H42D=Ebx&eQ|000ib0l1NC?EnA*Ur9tkRCr$Pn!k%0K@`VV3lY1dO(0jv zVHr{x(ul=jkt$W{G}qhQUl0iX2bVUfQdwxB2sV}}CD;WLQUsDtL_Ih2oqHpX&8<6Y zb|f6%53KLUjDFwS+1+Bth!8>uA%qY@2qA-G8(nw1j)UF#!nC*;KY7MM&X zzgDZ&gHESY>h*tmaktyuf7iu>!62?ytG`>V)-EKdYRB@m=aV;)R%NNaPG`h*sgvC6Y^d#3U;8TE21Yon-lyUXJht--oZ}pbS! zB)O-=ar_J`tydif@^%6tgb+dqA%qY@2qB~}`u)D!p1u<^9&~pYWNBp8m?ZCO@iPdx zBD59%0&!q2lwPt1G=GNJmt5OgZYQ>0uYWS;Eqvi>u~@v)JI0~NszH3ab1d#bGOvI* zj$eqI{Lz0ab^Juay{Zlgw!j5w>KZJlQP-*Kzl(!s$$a@qsZ{!k#`KP?-lKP%V)Zrp ze*q44a`rpOu&xgoIu5pGi%CR5RCr$P+R<%;Fc1b{pihj@r!GgM0ep8cwmn#&@ob|&m58C=D=4lt*ZZ%qI0iD&c@~?Ndf=>000000002+ zSJibrOi>zB)W|pn83J%=bY)qlZrla0aTb?Gw`SK}!6(41?TvqjvqI~%x~}_>7VYM# z&L#tC9)T0bC82dH=Egqq(2^bjziu<;jW6aE;=-3~YHrtU;)gUR;DO_k&^nbY%fv;y z`L=CUH$-y-J~=K4ty9VKyyu}MJpz8+X3Wt(k0*T5nJ%qPbKsJwOrK}kX?NG@MR{8Q0000000000000}Q zs_OcAy!)xFP5hF3^Kj?6+As{SJQVGHGc^4|<}WfAKT&iW`prWo5!1c-__=8vt4wc3 z+%fSR#wPW1|K4OSQX?|=zdfy;Yh5wl-YQzQTD>KLXz6w~y! ioixWO4*&pHN%93vRsC_y@1auw0000EX>4Tx04R}tkv&MmKpe$iTct%>1lvKxAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRx%k-{RDAVPqQIx48bLV{L}6cZWRPkQ)=9KT2|nOqex zax9<*6_Voz|AXJ%n#IWpHz}M1dS7h&V+0890jVfq16NwdUuyz0pQJZB zTKov;-v%zOJDR))TFiG>?GT@Au4+FX^000000Ki>5B8z(O@855&wNR~WugIcO%Itll2_3+; zZL{~0Mgk&>BtQcGCjsHnwXW-T6xLcVIRXIy0001PXZSWZ<92vv&(OQTUd9{2%$~ys zknu`1v!?`%7LWi5kboKcIDOAU`4Tx04UFukxeK>Q5?m828~3DSx6RdffXerONN>hH4SP83-7%#V`|=;>AjJS zrLvu}@Uii=u(4)qVXKt#QL?nMA~w?Vzi-q`YLr{I`|I3$PWPS*frG4RxpnWNE@v*(5#zoek>ZDqU!j#rADnceJYFpjppRCYeJ1CJZk2hg7A{?@LD0S zct<#7uINeOQ{i4mE+~Ajbfd&Ciqk#^RA$JTjg1S3gtc@98x?G>IF|5`a97f@B|i`^ zaZ>TRVk^69{@hc&uxZ(zn^C&VP9jV)O%x4-RWf8L&?l=cic3uP!&UqpzCS81LtGh5 zaZHfILihcsKlt6Pn;IM_B{hYi{>k&+x*@m)Uq#RRJoLP;BdC3Z3%l&k9l*%D=*6INv!Rv{9Qv%wqp>d(q+s{77cQ7kmO>As1<@2>O_pVIHeg443h@VW71o2dc`y)?7ytkO006k*?p;k4hw|3z{f&rd kYN(~YD(Bp_di%+21E}9Y{jC`qM*si-07*qoM6N<$f=uM|RsaA1 From a8ad70d5d99c5a5c441bf66693d666faea68be49 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 19 Feb 2024 23:19:54 -0500 Subject: [PATCH 53/73] A bunch of placeholders needed to pass tests --- .../Entities/Objects/Specific/Species/lamia.yml | 2 ++ .../Hardsuits/ERTSuits/ertengineer.rsi/meta.json | 7 +++++-- .../ERTSuits/ertengineer.rsi/segment.png | Bin 0 -> 372 bytes .../Hardsuits/ERTSuits/ertleader.rsi/meta.json | 7 +++++-- .../Hardsuits/ERTSuits/ertleader.rsi/segment.png | Bin 0 -> 372 bytes .../Hardsuits/ERTSuits/ertmedical.rsi/meta.json | 7 +++++-- .../Hardsuits/ERTSuits/ertmedical.rsi/segment.png | Bin 0 -> 372 bytes .../Hardsuits/ERTSuits/ertsecurity.rsi/meta.json | 7 +++++-- .../ERTSuits/ertsecurity.rsi/segment.png | Bin 0 -> 372 bytes .../Hardsuits/brigmedic.rsi/meta.json | 7 +++++-- .../Hardsuits/brigmedic.rsi/segment.png | Bin 0 -> 372 bytes .../OuterClothing/Hardsuits/cburn.rsi/meta.json | 7 +++++-- .../OuterClothing/Hardsuits/cburn.rsi/segment.png | Bin 0 -> 372 bytes .../OuterClothing/Hardsuits/clown.rsi/meta.json | 3 +++ .../OuterClothing/Hardsuits/clown.rsi/segment.png | Bin 0 -> 372 bytes .../Hardsuits/deathsquad.rsi/meta.json | 7 +++++-- .../Hardsuits/deathsquad.rsi/segment.png | Bin 0 -> 372 bytes .../Hardsuits/lingspacesuit.rsi/meta.json | 9 ++++++--- .../Hardsuits/lingspacesuit.rsi/segment.png | Bin 0 -> 372 bytes .../OuterClothing/Hardsuits/maxim.rsi/meta.json | 9 ++++++--- .../OuterClothing/Hardsuits/maxim.rsi/segment.png | Bin 0 -> 372 bytes .../OuterClothing/Hardsuits/mime.rsi/meta.json | 3 +++ .../OuterClothing/Hardsuits/mime.rsi/segment.png | Bin 0 -> 372 bytes .../Hardsuits/piratecaptain.rsi/meta.json | 3 +++ .../Hardsuits/piratecaptain.rsi/segment.png | Bin 0 -> 372 bytes .../Hardsuits/pirateeva.rsi/meta.json | 3 +++ .../Hardsuits/pirateeva.rsi/segment.png | Bin 0 -> 372 bytes .../Hardsuits/santahardsuit.rsi/meta.json | 7 +++++-- .../Hardsuits/santahardsuit.rsi/segment.png | Bin 0 -> 372 bytes .../Hardsuits/security-red.rsi/meta.json | 7 +++++-- .../Hardsuits/security-red.rsi/segment.png | Bin 0 -> 372 bytes .../Hardsuits/security-warden.rsi/meta.json | 7 +++++-- .../Hardsuits/security-warden.rsi/segment.png | Bin 0 -> 372 bytes .../Hardsuits/security.rsi/meta.json | 7 +++++-- .../Hardsuits/security.rsi/segment.png | Bin 0 -> 372 bytes .../OuterClothing/Hardsuits/wizard.rsi/meta.json | 7 +++++-- .../Hardsuits/wizard.rsi/segment.png | Bin 0 -> 372 bytes .../Suits/ancient_voidsuit.rsi/meta.json | 7 +++++-- .../Suits/ancient_voidsuit.rsi/segment.png | Bin 0 -> 372 bytes 39 files changed, 91 insertions(+), 32 deletions(-) create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertengineer.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertleader.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertmedical.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertsecurity.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/brigmedic.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/cburn.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/clown.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/deathsquad.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/lingspacesuit.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/maxim.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/mime.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/piratecaptain.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/pirateeva.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/santahardsuit.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/security-red.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/security-warden.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/security.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/wizard.rsi/segment.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/ancient_voidsuit.rsi/segment.png diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml index f88c640c3bb..a76973e0f09 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml @@ -4,6 +4,7 @@ - type: entity id: LamiaInitialSegment + save: false noSpawn: true components: - type: Damageable @@ -35,6 +36,7 @@ - type: entity id: LamiaSegment + save: false parent: LamiaInitialSegment name: lamia segment noSpawn: true diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertengineer.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertengineer.rsi/meta.json index 4fbd43a08b5..a3e0090b8fc 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertengineer.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertengineer.rsi/meta.json @@ -19,8 +19,11 @@ "directions": 4 }, { - "name": "inhand-right", - "directions": 4 + "name": "inhand-right", + "directions": 4 + }, + { + "name": "segment" } ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertengineer.rsi/segment.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertengineer.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..c97ab674f25fbabfbafb91deae76af681f51a629 GIT binary patch literal 372 zcmV-)0gL{LP)r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000r!GkAb40-=22!zlO@L(JW zo$5bL3+mLmOYOSUp;o|T(QVS{bf1359TIKZa!Ye=n%x3e01IFNEPw^D02aUk0C%PV zagzS`i4>2!?d1D}$)_|<(smU_GGG<9iu-E@FB zN!t%c0#H9cT|D=FX0ohC3Iv`r`ufhoC?W97M7^pD#-zSRelY9;=_~SVH(KwZ@1?2c z0RX7ZpGY4Ti{(Y1i5Zok$TOt-6QZ?7Yu&G<>vU~63xEK4Jy(75A;{3T3L`NGKo7A$ zS S1V1tW0000 Date: Wed, 6 Mar 2024 17:25:29 -0500 Subject: [PATCH 54/73] 1984 the onhitself subscription --- Content.Server/DeltaV/Lamiae/LamiaSystem.cs | 11 ++--------- Content.Shared/DeltaV/Lamiae/LamiaComponent.cs | 2 +- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/Content.Server/DeltaV/Lamiae/LamiaSystem.cs b/Content.Server/DeltaV/Lamiae/LamiaSystem.cs index 16cb9dd628c..4795aa50161 100644 --- a/Content.Server/DeltaV/Lamiae/LamiaSystem.cs +++ b/Content.Server/DeltaV/Lamiae/LamiaSystem.cs @@ -89,7 +89,6 @@ public override void Initialize() SubscribeLocalEvent(OnSegmentStorageInsertAttempt); SubscribeLocalEvent(OnDidEquipEvent); SubscribeLocalEvent(OnDidUnequipEvent); - SubscribeLocalEvent(OnHitSelf); SubscribeLocalEvent(TailCantStand); SubscribeLocalEvent(OnSnekBoom); } @@ -170,6 +169,8 @@ private void OnRemovedFromContainer(EntityUid uid, LamiaComponent component, Ent private void HandleSegmentDamage(EntityUid uid, LamiaSegmentComponent component, DamageModifyEvent args) { + if (args.Origin == component.Lamia) + args.Damage *= 0; args.Damage = args.Damage / component.DamageModifyFactor; } private void HandleDamageTransfer(EntityUid uid, LamiaSegmentComponent component, DamageChangedEvent args) @@ -178,14 +179,6 @@ private void HandleDamageTransfer(EntityUid uid, LamiaSegmentComponent component _damageableSystem.TryChangeDamage(component.Lamia, args.DamageDelta); } - private void OnHitSelf(EntityUid uid, LamiaSegmentComponent component, ref BeforeDamageChangedEvent args) - { - if (args.Origin == component.Lamia) - { - args.Cancelled = true; - } - } - private void TailCantStand(EntityUid uid, LamiaSegmentComponent component, StandAttemptEvent args) { if (component.BulletPassover == true) diff --git a/Content.Shared/DeltaV/Lamiae/LamiaComponent.cs b/Content.Shared/DeltaV/Lamiae/LamiaComponent.cs index 95540958ccb..163c31df594 100644 --- a/Content.Shared/DeltaV/Lamiae/LamiaComponent.cs +++ b/Content.Shared/DeltaV/Lamiae/LamiaComponent.cs @@ -21,7 +21,7 @@ public sealed partial class LamiaComponent : Component /// A clamped variable that represents the number of segments to be spawned /// [DataField("numberOfSegments")] - public int NumberOfSegments = 30; + public int NumberOfSegments = 18; /// /// If UseTaperSystem is true, this constant represents the rate at which a segmented entity will taper towards the tip. Tapering is on a logarithmic scale, and will asymptotically approach 0. From 85c83e485c678d073f4e26aa38352f6be279e68b Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 10 Mar 2024 20:34:55 -0400 Subject: [PATCH 55/73] Update LamiaSystem.cs --- Content.Server/DeltaV/Lamiae/LamiaSystem.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/DeltaV/Lamiae/LamiaSystem.cs b/Content.Server/DeltaV/Lamiae/LamiaSystem.cs index 4795aa50161..7aaaaf1d123 100644 --- a/Content.Server/DeltaV/Lamiae/LamiaSystem.cs +++ b/Content.Server/DeltaV/Lamiae/LamiaSystem.cs @@ -94,7 +94,7 @@ public override void Initialize() } /// - /// Handles transfering marking selections to the tail segments. Every tail marking must be repeated 2 times in order for this script to work. + /// Handles transferring marking selections to the tail segments. Every tail marking must be repeated 2 times in order for this script to work. /// /// /// @@ -160,7 +160,7 @@ private void OnRemovedFromContainer(EntityUid uid, LamiaComponent component, Ent if (component.Segments.Count != 0) { foreach (var segment in component.Segments) - QueueDel(segment); + QueueDel(segment); component.Segments.Clear(); } From 6187158b6a3cd500ada89f861e93dd69dd1e7829 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 27 Mar 2024 20:18:13 -0400 Subject: [PATCH 56/73] guh --- Content.Server/DeltaV/Lamiae/LamiaSystem.cs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Content.Server/DeltaV/Lamiae/LamiaSystem.cs b/Content.Server/DeltaV/Lamiae/LamiaSystem.cs index 7aaaaf1d123..29ddfe23809 100644 --- a/Content.Server/DeltaV/Lamiae/LamiaSystem.cs +++ b/Content.Server/DeltaV/Lamiae/LamiaSystem.cs @@ -61,7 +61,7 @@ public override void Update(float frameTime) if (segment.segment.SegmentNumber == 1) { Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates; - var revoluteJoint = _jointSystem.CreateWeldJoint(attachedUid, segmentUid, id: ("Segment" + segment.segment.SegmentNumber + segment.segment.Lamia)); + var revoluteJoint = _jointSystem.CreateWeldJoint(attachedUid, segmentUid, id: "Segment" + segment.segment.SegmentNumber + segment.segment.Lamia); revoluteJoint.CollideConnected = false; } if (segment.segment.SegmentNumber < segment.segment.MaxSegments) @@ -144,7 +144,7 @@ private void OnShutdown(EntityUid uid, LamiaComponent component, ComponentShutdo private void OnJointRemoved(EntityUid uid, LamiaComponent component, JointRemovedEvent args) { - if (!component.Segments.Contains(args.OtherBody.Owner)) + if (!component.Segments.Contains(args.OtherEntity)) return; if (HasComp(uid)) return; @@ -199,7 +199,7 @@ public void SpawnSegments(EntityUid uid, LamiaComponent component) private EntityUid AddSegment(EntityUid uid, EntityUid lamia, LamiaComponent lamiaComponent, int segmentNumber) { - LamiaSegmentComponent segmentComponent = new(); + EnsureComp(uid, out var segmentComponent); segmentComponent.MaxSegments = lamiaComponent.NumberOfSegments; segmentComponent.BulletPassover = lamiaComponent.BulletPassover; segmentComponent.Lamia = lamia; @@ -219,7 +219,8 @@ private EntityUid AddSegment(EntityUid uid, EntityUid lamia, LamiaComponent lami { segmentComponent.OffsetSwitching = lamiaComponent.StaticOffset * MathF.Pow(lamiaComponent.OffsetConstant, segmentNumber - taperConstant); segmentComponent.ScaleFactor = lamiaComponent.StaticScale * MathF.Pow(1f / lamiaComponent.OffsetConstant, segmentNumber - taperConstant); - } else + } + else { segmentComponent.OffsetSwitching = lamiaComponent.StaticOffset; segmentComponent.ScaleFactor = lamiaComponent.StaticScale; @@ -229,12 +230,10 @@ private EntityUid AddSegment(EntityUid uid, EntityUid lamia, LamiaComponent lami segmentComponent.OffsetSwitching *= -1; } - segmentComponent.Owner = segment; segmentComponent.SegmentNumber = segmentNumber; - EntityManager.AddComponent(segment, segmentComponent, true); _segments.Enqueue((segmentComponent, lamia)); - lamiaComponent.Segments.Add(segmentComponent.Owner); + lamiaComponent.Segments.Add(uid); return segment; } From 5357f2ff2ca24b32a3d4c0d52391f0557797e507 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 31 Mar 2024 20:07:02 -0400 Subject: [PATCH 57/73] Snekstation14 --- Content.Server/DeltaV/Lamiae/LamiaSystem.cs | 78 +++++++++++-------- Content.Server/Teleportation/PortalSystem.cs | 16 ---- .../Weapons/Ranged/Systems/GunSystem.cs | 8 +- .../DeltaV/Lamiae/LamiaComponent.cs | 1 + .../DeltaV/Lamiae/LamiaSegmentComponent.cs | 4 +- .../Components/PortalExemptComponent.cs | 8 ++ .../Systems/SharedPortalSystem.cs | 11 +-- .../Weapons/Melee/SharedMeleeWeaponSystem.cs | 2 +- .../Ranged/Events/HitScanAfterRayCastEvent.cs | 17 ++++ .../DeltaV/Entities/Mobs/Species/lamia.yml | 6 +- 10 files changed, 87 insertions(+), 64 deletions(-) create mode 100644 Content.Shared/Teleportation/Components/PortalExemptComponent.cs create mode 100644 Content.Shared/Weapons/Ranged/Events/HitScanAfterRayCastEvent.cs diff --git a/Content.Server/DeltaV/Lamiae/LamiaSystem.cs b/Content.Server/DeltaV/Lamiae/LamiaSystem.cs index 29ddfe23809..5a413e7bb29 100644 --- a/Content.Server/DeltaV/Lamiae/LamiaSystem.cs +++ b/Content.Server/DeltaV/Lamiae/LamiaSystem.cs @@ -1,9 +1,3 @@ -/* -* Delta-V - This file is licensed under AGPLv3 -* Copyright (c) 2024 Delta-V Contributors -* See AGPLv3.txt for details. -*/ - using Robust.Shared.Physics; using Content.Shared.Damage; using Content.Shared.Explosion; @@ -14,7 +8,6 @@ using Content.Shared.Inventory.Events; using Content.Shared.Tag; using Content.Shared.Teleportation.Components; -using Content.Shared.Standing; using Content.Shared.Storage.Components; using Robust.Shared.Containers; using Robust.Shared.Map; @@ -22,6 +15,10 @@ using Robust.Shared.Physics.Components; using System.Numerics; using Content.Shared.DeltaV.Lamiae; +using Robust.Shared.Physics.Events; +using Content.Shared.Projectiles; +using Content.Shared.Weapons.Ranged.Events; +using System.Linq; namespace Content.Server.DeltaV.Lamiae { @@ -32,7 +29,6 @@ public sealed partial class LamiaSystem : EntitySystem [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly TagSystem _tagSystem = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly StandingStateSystem _standing = default!; [ValidatePrototypeId] private const string LamiaHardsuitTag = "AllowLamiaHardsuit"; @@ -64,7 +60,7 @@ public override void Update(float frameTime) var revoluteJoint = _jointSystem.CreateWeldJoint(attachedUid, segmentUid, id: "Segment" + segment.segment.SegmentNumber + segment.segment.Lamia); revoluteJoint.CollideConnected = false; } - if (segment.segment.SegmentNumber < segment.segment.MaxSegments) + if (segment.segment.SegmentNumber <= segment.segment.MaxSegments) Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0, segment.segment.OffsetSwitching)); else Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0, segment.segment.OffsetSwitching)); @@ -82,6 +78,7 @@ public override void Initialize() SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnJointRemoved); SubscribeLocalEvent(OnRemovedFromContainer); + SubscribeLocalEvent(OnShootHitscan); SubscribeLocalEvent(OnSegmentSpawned); SubscribeLocalEvent(HandleDamageTransfer); SubscribeLocalEvent(HandleSegmentDamage); @@ -89,8 +86,8 @@ public override void Initialize() SubscribeLocalEvent(OnSegmentStorageInsertAttempt); SubscribeLocalEvent(OnDidEquipEvent); SubscribeLocalEvent(OnDidUnequipEvent); - SubscribeLocalEvent(TailCantStand); SubscribeLocalEvent(OnSnekBoom); + SubscribeLocalEvent(PreventShootSelf); } /// @@ -104,8 +101,6 @@ public override void Initialize() private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, SegmentSpawnedEvent args) { component.Lamia = args.Lamia; - if (component.BulletPassover == true) - _standing.Down(uid, false); if (!TryComp(uid, out var species)) return; if (!TryComp(args.Lamia, out var humanoid)) return; @@ -127,7 +122,7 @@ private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, Se private void OnInit(EntityUid uid, LamiaComponent component, ComponentInit args) { - Math.Clamp(component.NumberOfSegments, 2, 30); + Math.Clamp(component.NumberOfSegments, 2, 18); Math.Clamp(component.TaperOffset, 1, component.NumberOfSegments - 1); SpawnSegments(uid, component); } @@ -147,8 +142,6 @@ private void OnJointRemoved(EntityUid uid, LamiaComponent component, JointRemove if (!component.Segments.Contains(args.OtherEntity)) return; - if (HasComp(uid)) return; - foreach (var segment in component.Segments) QueueDel(segment); @@ -179,17 +172,11 @@ private void HandleDamageTransfer(EntityUid uid, LamiaSegmentComponent component _damageableSystem.TryChangeDamage(component.Lamia, args.DamageDelta); } - private void TailCantStand(EntityUid uid, LamiaSegmentComponent component, StandAttemptEvent args) - { - if (component.BulletPassover == true) - args.Cancel(); - } - public void SpawnSegments(EntityUid uid, LamiaComponent component) { int i = 1; var addTo = uid; - while (i < component.NumberOfSegments + 1) + while (i <= component.NumberOfSegments + 1) { var segment = AddSegment(addTo, uid, component, i); addTo = segment; @@ -197,24 +184,22 @@ public void SpawnSegments(EntityUid uid, LamiaComponent component) } } - private EntityUid AddSegment(EntityUid uid, EntityUid lamia, LamiaComponent lamiaComponent, int segmentNumber) + private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, LamiaComponent lamiaComponent, int segmentNumber) { - EnsureComp(uid, out var segmentComponent); - segmentComponent.MaxSegments = lamiaComponent.NumberOfSegments; - segmentComponent.BulletPassover = lamiaComponent.BulletPassover; - segmentComponent.Lamia = lamia; - segmentComponent.AttachedToUid = uid; + LamiaSegmentComponent segmentComponent = new(); + segmentComponent.Lamia = parentuid; + segmentComponent.AttachedToUid = segmentuid; segmentComponent.DamageModifierConstant = lamiaComponent.NumberOfSegments * lamiaComponent.DamageModifierOffset; - float taperConstant = lamiaComponent.NumberOfSegments - lamiaComponent.TaperOffset; float damageModifyCoefficient = segmentComponent.DamageModifierConstant / lamiaComponent.NumberOfSegments; segmentComponent.DamageModifyFactor = segmentComponent.DamageModifierConstant * damageModifyCoefficient; segmentComponent.ExplosiveModifyFactor = 1 / segmentComponent.DamageModifyFactor / (lamiaComponent.NumberOfSegments * lamiaComponent.ExplosiveModifierOffset); + float taperConstant = lamiaComponent.NumberOfSegments - lamiaComponent.TaperOffset; EntityUid segment; if (segmentNumber == 1) - segment = EntityManager.SpawnEntity(lamiaComponent.InitialSegmentId, Transform(uid).Coordinates); + segment = EntityManager.SpawnEntity(lamiaComponent.InitialSegmentId, Transform(segmentuid).Coordinates); else - segment = EntityManager.SpawnEntity(lamiaComponent.SegmentId, Transform(uid).Coordinates); + segment = EntityManager.SpawnEntity(lamiaComponent.SegmentId, Transform(segmentuid).Coordinates); if (segmentNumber >= taperConstant && lamiaComponent.UseTaperSystem == true) { segmentComponent.OffsetSwitching = lamiaComponent.StaticOffset * MathF.Pow(lamiaComponent.OffsetConstant, segmentNumber - taperConstant); @@ -230,10 +215,12 @@ private EntityUid AddSegment(EntityUid uid, EntityUid lamia, LamiaComponent lami segmentComponent.OffsetSwitching *= -1; } + segmentComponent.Owner = segment; segmentComponent.SegmentNumber = segmentNumber; - - _segments.Enqueue((segmentComponent, lamia)); - lamiaComponent.Segments.Add(uid); + EntityManager.AddComponent(segment, segmentComponent, true); + EnsureComp(segment); + _segments.Enqueue((segmentComponent, parentuid)); + lamiaComponent.Segments.Add(segment); return segment; } @@ -278,5 +265,28 @@ private void OnDidUnequipEvent(EntityUid equipee, LamiaComponent component, DidU } } } + + private void PreventShootSelf(EntityUid uid, LamiaSegmentComponent component, ref PreventCollideEvent args) + { + if (!TryComp(args.OtherEntity, out var projectileComponent)) return; + + if (projectileComponent.Shooter == component.Lamia) + { + args.Cancelled = true; + } + } + + private void OnShootHitscan(EntityUid uid, LamiaComponent component, ref HitScanAfterRayCastEvent args) + { + if (args.RayCastResults == null) return; + + var entityList = new List(); + foreach (var entity in args.RayCastResults) + { + if (!component.Segments.Contains(entity.HitEntity)) + entityList.Add(entity); + } + args.RayCastResults = entityList; + } } } diff --git a/Content.Server/Teleportation/PortalSystem.cs b/Content.Server/Teleportation/PortalSystem.cs index a328573fc9c..27fec274351 100644 --- a/Content.Server/Teleportation/PortalSystem.cs +++ b/Content.Server/Teleportation/PortalSystem.cs @@ -1,9 +1,7 @@ -using Content.Server.DeltaV.Lamiae; //DeltaV using Content.Shared.Administration.Logs; using Content.Shared.Database; using Content.Shared.Ghost; using Content.Shared.Mind.Components; -using Content.Shared.DeltaV.Lamiae; //DeltaV using Content.Shared.Teleportation.Systems; using Robust.Shared.Map; @@ -12,7 +10,6 @@ namespace Content.Server.Teleportation; public sealed class PortalSystem : SharedPortalSystem { [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; - [Dependency] private readonly LamiaSystem _lamia = default!; //DeltaV // TODO Move to shared protected override void LogTeleport(EntityUid portal, EntityUid subject, EntityCoordinates source, @@ -20,18 +17,5 @@ protected override void LogTeleport(EntityUid portal, EntityUid subject, EntityC { if (HasComp(subject) && !HasComp(subject)) _adminLogger.Add(LogType.Teleport, LogImpact.Low, $"{ToPrettyString(subject):player} teleported via {ToPrettyString(portal)} from {source} to {target}"); - - //Start DeltaV Code, stops Lamia from crashing because they can't take their tail through a portal - if (TryComp(subject, out var lamia)) - { - foreach (var segment in lamia.Segments) - { - QueueDel(segment); - } - lamia.Segments.Clear(); - _lamia.SpawnSegments(subject, lamia); - } - //End DeltaV Code } - } diff --git a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs index b8f8f122111..067c114b259 100644 --- a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs +++ b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs @@ -203,7 +203,13 @@ public override void Shoot(EntityUid gunUid, GunComponent gun, List<(EntityUid? if (!rayCastResults.Any()) break; - var result = rayCastResults[0]; + var raycastEvent = new HitScanAfterRayCastEvent(rayCastResults); + RaiseLocalEvent(lastUser, ref raycastEvent); + + if (raycastEvent.RayCastResults == null) + break; + + var result = raycastEvent.RayCastResults[0]; var hit = result.HitEntity; lastHit = hit; diff --git a/Content.Shared/DeltaV/Lamiae/LamiaComponent.cs b/Content.Shared/DeltaV/Lamiae/LamiaComponent.cs index 163c31df594..bc70724404a 100644 --- a/Content.Shared/DeltaV/Lamiae/LamiaComponent.cs +++ b/Content.Shared/DeltaV/Lamiae/LamiaComponent.cs @@ -15,6 +15,7 @@ public sealed partial class LamiaComponent : Component /// /// A list of each UID attached to the Lamia, in order of spawn /// + [DataField("segments")] public List Segments = new(); /// diff --git a/Content.Shared/DeltaV/Lamiae/LamiaSegmentComponent.cs b/Content.Shared/DeltaV/Lamiae/LamiaSegmentComponent.cs index 82de76ca1a9..37d21ae6f6b 100644 --- a/Content.Shared/DeltaV/Lamiae/LamiaSegmentComponent.cs +++ b/Content.Shared/DeltaV/Lamiae/LamiaSegmentComponent.cs @@ -15,15 +15,17 @@ namespace Content.Shared.DeltaV.Lamiae [NetworkedComponent] public sealed partial class LamiaSegmentComponent : Component { + [DataField("AttachedToUid")] public EntityUid AttachedToUid = default!; public float DamageModifyFactor = default!; public float OffsetSwitching = default!; public float ScaleFactor = default!; + [DataField("DamageModifierCoefficient")] public float DamageModifierCoefficient = default!; public float ExplosiveModifyFactor = default!; public float OffsetConstant = default!; + [DataField("Lamia")] public EntityUid Lamia = default!; - public bool BulletPassover = default!; public int MaxSegments = default!; public int SegmentNumber = default!; public float DamageModifierConstant = default!; diff --git a/Content.Shared/Teleportation/Components/PortalExemptComponent.cs b/Content.Shared/Teleportation/Components/PortalExemptComponent.cs new file mode 100644 index 00000000000..28043808e09 --- /dev/null +++ b/Content.Shared/Teleportation/Components/PortalExemptComponent.cs @@ -0,0 +1,8 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Teleportation.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class PortalExemptComponent : Component +{ +} diff --git a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs index 247ac93c219..6d6d971bd94 100644 --- a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs +++ b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs @@ -1,6 +1,5 @@ using System.Linq; using Content.Shared.Ghost; -using Content.Shared.DeltaV.Lamiae; //DeltaV using Content.Shared.Popups; using Content.Shared.Projectiles; using Content.Shared.Pulling; @@ -84,6 +83,9 @@ private bool ShouldCollide(string ourId, string otherId, Fixture our, Fixture ot private void OnCollide(EntityUid uid, PortalComponent component, ref StartCollideEvent args) { + if (HasComp(args.OtherEntity)) + return; + if (!ShouldCollide(args.OurFixtureId, args.OtherFixtureId, args.OurFixture, args.OtherFixture)) return; @@ -105,13 +107,6 @@ private void OnCollide(EntityUid uid, PortalComponent component, ref StartCollid _pulling.TryStopPull(subjectPulling); } - //Start DeltaV Code: Prevent Lamia Segments from entering portals - if (HasComp(subject)) - { - return; - } - //End DeltaV Code - // if they came from another portal, just return and wait for them to exit the portal if (HasComp(subject)) { diff --git a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs index 6a5127f2c95..c9160ffe692 100644 --- a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs +++ b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs @@ -566,7 +566,7 @@ private bool DoHeavyAttack(EntityUid user, HeavyAttackEvent ev, EntityUid meleeU Audio.PlayPredicted(component.SwingSound, meleeUid, user); return true; } - + // Naughty input if (entities.Count > MaxTargets) { diff --git a/Content.Shared/Weapons/Ranged/Events/HitScanAfterRayCastEvent.cs b/Content.Shared/Weapons/Ranged/Events/HitScanAfterRayCastEvent.cs new file mode 100644 index 00000000000..99bfd1eabc0 --- /dev/null +++ b/Content.Shared/Weapons/Ranged/Events/HitScanAfterRayCastEvent.cs @@ -0,0 +1,17 @@ +using Robust.Shared.Physics; + +namespace Content.Shared.Weapons.Ranged.Events; + +/// +/// Raised after an entity fires a hitscan weapon, but before the list is truncated to the first target. Necessary for Entities that need to prevent friendly fire +/// +[ByRefEvent] +public struct HitScanAfterRayCastEvent +{ + public List? RayCastResults; + + public HitScanAfterRayCastEvent(List? rayCastResults) + { + RayCastResults = rayCastResults; + } +} diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml index e47bdb1e482..d7cb856e299 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml @@ -138,13 +138,13 @@ 0: Alive 200: Critical #these values aren't final' 300: Dead #these values aren't final' - - type: SlowOnDamage + - type: SlowOnDamage speedModifierThresholds: #these values aren't final, adjust accordingly with thresholds above' 60: 0.9 80: 0.8 100: 0.7 120: 0.6 - 140: 0.5 + 140: 0.5 - type: FireVisuals sprite: Mobs/Effects/onfire.rsi normalState: Generic_mob_burning @@ -195,7 +195,7 @@ layer: - MobLayer - type: Lamia - numberOfSegments: 30 + numberOfSegments: 18 - type: Speech speechSounds: Alto - type: Vocal From 48ae4d70965e0afed16f7a3c6c534be9ef4d6c6c Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 16 Jun 2024 22:27:39 -0400 Subject: [PATCH 58/73] Fuck its lets go, no more procrastinating on sneks --- .../DeltaV/Lamiae/ClientLamiaVisuals.cs | 18 +- .../Lamiae/LamiaSegmentVisualsComponent.cs | 2 +- .../SegmentSpawnedEvent.cs} | 9 +- .../SegmentedEntityComponent.cs} | 4 +- .../SegmentedEntitySegmentComponent.cs} | 4 +- .../SegmentedEntitySegmentVisuals.cs} | 4 +- .../SegmentedEntity/SegmentedEntitySystem.cs | 204 +++++++++--------- .../DeltaV/Entities/Mobs/Species/lamia.yml | 2 +- .../Objects/Specific/Species/lamia.yml | 4 +- 9 files changed, 120 insertions(+), 131 deletions(-) rename Content.Shared/{DeltaV/Lamiae/SharedLamiaeSystem.cs => SegmentedEntity/SegmentSpawnedEvent.cs} (52%) rename Content.Shared/{DeltaV/Lamiae/LamiaComponent.cs => SegmentedEntity/SegmentedEntityComponent.cs} (96%) rename Content.Shared/{DeltaV/Lamiae/LamiaSegmentComponent.cs => SegmentedEntity/SegmentedEntitySegmentComponent.cs} (89%) rename Content.Shared/{DeltaV/Lamiae/LamiaSegmentVisuals.cs => SegmentedEntity/SegmentedEntitySegmentVisuals.cs} (73%) rename Content.Server/DeltaV/Lamiae/LamiaSystem.cs => Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs (63%) diff --git a/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs b/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs index 8b9f3b4c472..046f6a7a3c3 100644 --- a/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs +++ b/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs @@ -6,37 +6,37 @@ using Robust.Client.GameObjects; using System.Numerics; -using Content.Shared.DeltaV.Lamiae; +using Content.Shared.SegmentedEntity; namespace Content.Client.DeltaV.Lamiae; -public sealed class ClientLamiaVisualSystem : VisualizerSystem +public sealed class ClientLamiaVisualSystem : VisualizerSystem { public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnAppearanceChange); + SubscribeLocalEvent(OnAppearanceChange); } - private void OnAppearanceChange(EntityUid uid, LamiaSegmentComponent component, ref AppearanceChangeEvent args) + private void OnAppearanceChange(EntityUid uid, SegmentedEntitySegmentComponent component, ref AppearanceChangeEvent args) { if (args.Sprite == null) return; if (AppearanceSystem.TryGetData(uid, ScaleVisuals.Scale, out var scale) && TryComp(uid, out var sprite)) { - sprite.Scale = (new Vector2(scale, scale)); + sprite.Scale = new Vector2(scale, scale); } - if (AppearanceSystem.TryGetData(uid, LamiaSegmentVisualLayers.Armor, out var worn) - && AppearanceSystem.TryGetData(uid, LamiaSegmentVisualLayers.ArmorRsi, out var path)) + if (AppearanceSystem.TryGetData(uid, SegmentedEntitySegmentVisualLayers.Armor, out var worn) + && AppearanceSystem.TryGetData(uid, SegmentedEntitySegmentVisualLayers.ArmorRsi, out var path)) { var valid = !string.IsNullOrWhiteSpace(path); if (valid) { - args.Sprite.LayerSetRSI(LamiaSegmentVisualLayers.Armor, path); + args.Sprite.LayerSetRSI(SegmentedEntitySegmentVisualLayers.Armor, path); } - args.Sprite.LayerSetVisible(LamiaSegmentVisualLayers.Armor, worn); + args.Sprite.LayerSetVisible(SegmentedEntitySegmentVisualLayers.Armor, worn); } } } diff --git a/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs b/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs index d2d519e2c82..e2c1139f234 100644 --- a/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs +++ b/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs @@ -7,5 +7,5 @@ namespace Content.Client.DeltaV.Lamiae; [RegisterComponent] -public sealed partial class LamiaSegmentVisualsComponent : Component +public sealed partial class SegmentedEntitySegmentVisualsComponent : Component {} diff --git a/Content.Shared/DeltaV/Lamiae/SharedLamiaeSystem.cs b/Content.Shared/SegmentedEntity/SegmentSpawnedEvent.cs similarity index 52% rename from Content.Shared/DeltaV/Lamiae/SharedLamiaeSystem.cs rename to Content.Shared/SegmentedEntity/SegmentSpawnedEvent.cs index de66e5d5301..6b0e0407a32 100644 --- a/Content.Shared/DeltaV/Lamiae/SharedLamiaeSystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentSpawnedEvent.cs @@ -1,11 +1,4 @@ -/* -* Delta-V - This file is licensed under AGPLv3 -* Copyright (c) 2024 Delta-V Contributors -* See AGPLv3.txt for details. -*/ - -namespace Content.Shared.DeltaV.Lamiae; - +namespace Content.Shared.SegmentedEntity; public sealed class SegmentSpawnedEvent : EntityEventArgs { public EntityUid Lamia = default!; diff --git a/Content.Shared/DeltaV/Lamiae/LamiaComponent.cs b/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs similarity index 96% rename from Content.Shared/DeltaV/Lamiae/LamiaComponent.cs rename to Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs index bc70724404a..ee217771d49 100644 --- a/Content.Shared/DeltaV/Lamiae/LamiaComponent.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs @@ -4,13 +4,13 @@ * See AGPLv3.txt for details. */ -namespace Content.Shared.DeltaV.Lamiae +namespace Content.Shared.SegmentedEntity { /// /// Controls initialization of any Multi-segmented entity /// [RegisterComponent] - public sealed partial class LamiaComponent : Component + public sealed partial class SegmentedEntityComponent : Component { /// /// A list of each UID attached to the Lamia, in order of spawn diff --git a/Content.Shared/DeltaV/Lamiae/LamiaSegmentComponent.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySegmentComponent.cs similarity index 89% rename from Content.Shared/DeltaV/Lamiae/LamiaSegmentComponent.cs rename to Content.Shared/SegmentedEntity/SegmentedEntitySegmentComponent.cs index 37d21ae6f6b..b29e282e9e3 100644 --- a/Content.Shared/DeltaV/Lamiae/LamiaSegmentComponent.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySegmentComponent.cs @@ -6,14 +6,14 @@ using Robust.Shared.GameStates; -namespace Content.Shared.DeltaV.Lamiae +namespace Content.Shared.SegmentedEntity { /// /// Lamia segment /// [RegisterComponent] [NetworkedComponent] - public sealed partial class LamiaSegmentComponent : Component + public sealed partial class SegmentedEntitySegmentComponent : Component { [DataField("AttachedToUid")] public EntityUid AttachedToUid = default!; diff --git a/Content.Shared/DeltaV/Lamiae/LamiaSegmentVisuals.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs similarity index 73% rename from Content.Shared/DeltaV/Lamiae/LamiaSegmentVisuals.cs rename to Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs index 2d73dd746ea..f1e6a202115 100644 --- a/Content.Shared/DeltaV/Lamiae/LamiaSegmentVisuals.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs @@ -6,10 +6,10 @@ using Robust.Shared.Serialization; -namespace Content.Shared.DeltaV.Lamiae +namespace Content.Shared.SegmentedEntity { [Serializable, NetSerializable] - public enum LamiaSegmentVisualLayers + public enum SegmentedEntitySegmentVisualLayers { Tail, Armor, diff --git a/Content.Server/DeltaV/Lamiae/LamiaSystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs similarity index 63% rename from Content.Server/DeltaV/Lamiae/LamiaSystem.cs rename to Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index 5a413e7bb29..8d70fad7c21 100644 --- a/Content.Server/DeltaV/Lamiae/LamiaSystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -1,39 +1,54 @@ using Robust.Shared.Physics; using Content.Shared.Damage; using Content.Shared.Explosion; -using Content.Shared.Clothing.Components; using Content.Shared.Humanoid; using Content.Shared.Humanoid.Markings; -using Content.Server.Humanoid; +using Content.Shared.Clothing.Components; using Content.Shared.Inventory.Events; using Content.Shared.Tag; -using Content.Shared.Teleportation.Components; using Content.Shared.Storage.Components; +using Robust.Shared.Physics.Events; +using Content.Shared.Projectiles; +using Content.Shared.Weapons.Ranged.Events; +using Content.Shared.Teleportation.Components; using Robust.Shared.Containers; using Robust.Shared.Map; using Robust.Shared.Physics.Systems; using Robust.Shared.Physics.Components; using System.Numerics; -using Content.Shared.DeltaV.Lamiae; -using Robust.Shared.Physics.Events; -using Content.Shared.Projectiles; -using Content.Shared.Weapons.Ranged.Events; -using System.Linq; -namespace Content.Server.DeltaV.Lamiae +namespace Content.Shared.SegmentedEntity { public sealed partial class LamiaSystem : EntitySystem { - [Dependency] private readonly SharedJointSystem _jointSystem = default!; - [Dependency] private readonly HumanoidAppearanceSystem _humanoid = default!; - [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly TagSystem _tagSystem = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + [Dependency] private readonly SharedHumanoidAppearanceSystem _humanoid = default!; + [Dependency] private readonly SharedJointSystem _jointSystem = default!; + + Queue<(SegmentedEntitySegmentComponent segment, EntityUid lamia)> _segments = new(); [ValidatePrototypeId] private const string LamiaHardsuitTag = "AllowLamiaHardsuit"; - - Queue<(LamiaSegmentComponent segment, EntityUid lamia)> _segments = new(); + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnShootHitscan); + SubscribeLocalEvent(OnLamiaStorageInsertAttempt); + SubscribeLocalEvent(OnSegmentStorageInsertAttempt); + SubscribeLocalEvent(OnDidEquipEvent); + SubscribeLocalEvent(OnDidUnequipEvent); + SubscribeLocalEvent(OnSnekBoom); + SubscribeLocalEvent(PreventShootSelf); + SubscribeLocalEvent(HandleDamageTransfer); + SubscribeLocalEvent(HandleSegmentDamage); + SubscribeLocalEvent(OnSegmentSpawned); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnJointRemoved); + SubscribeLocalEvent(OnRemovedFromContainer); + } public override void Update(float frameTime) { base.Update(frameTime); @@ -71,63 +86,14 @@ public override void Update(float frameTime) } _segments.Clear(); } - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent(OnJointRemoved); - SubscribeLocalEvent(OnRemovedFromContainer); - SubscribeLocalEvent(OnShootHitscan); - SubscribeLocalEvent(OnSegmentSpawned); - SubscribeLocalEvent(HandleDamageTransfer); - SubscribeLocalEvent(HandleSegmentDamage); - SubscribeLocalEvent(OnLamiaStorageInsertAttempt); - SubscribeLocalEvent(OnSegmentStorageInsertAttempt); - SubscribeLocalEvent(OnDidEquipEvent); - SubscribeLocalEvent(OnDidUnequipEvent); - SubscribeLocalEvent(OnSnekBoom); - SubscribeLocalEvent(PreventShootSelf); - } - - /// - /// Handles transferring marking selections to the tail segments. Every tail marking must be repeated 2 times in order for this script to work. - /// - /// - /// - /// - // TODO: Please for the love of god don't make me write a test to validate that every marking also has its matching segment states. - // Future contributors will just find out when their game crashes because they didn't make a marking-segment. - private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, SegmentSpawnedEvent args) - { - component.Lamia = args.Lamia; - - if (!TryComp(uid, out var species)) return; - if (!TryComp(args.Lamia, out var humanoid)) return; - if (!TryComp(uid, out var appearance)) return; - - _appearance.SetData(uid, ScaleVisuals.Scale, component.ScaleFactor, appearance); - - if (humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings)) - { - foreach (var markings in tailMarkings) - { - var segmentId = species.Species; - var markingId = markings.MarkingId; - string segmentmarking = $"{markingId}-{segmentId}"; - _humanoid.AddMarking(uid, segmentmarking, markings.MarkingColors); - } - } - } - - private void OnInit(EntityUid uid, LamiaComponent component, ComponentInit args) + private void OnInit(EntityUid uid, SegmentedEntityComponent component, ComponentInit args) { Math.Clamp(component.NumberOfSegments, 2, 18); Math.Clamp(component.TaperOffset, 1, component.NumberOfSegments - 1); SpawnSegments(uid, component); } - private void OnShutdown(EntityUid uid, LamiaComponent component, ComponentShutdown args) + private void OnShutdown(EntityUid uid, SegmentedEntityComponent component, ComponentShutdown args) { foreach (var segment in component.Segments) { @@ -137,7 +103,7 @@ private void OnShutdown(EntityUid uid, LamiaComponent component, ComponentShutdo component.Segments.Clear(); } - private void OnJointRemoved(EntityUid uid, LamiaComponent component, JointRemovedEvent args) + private void OnJointRemoved(EntityUid uid, SegmentedEntityComponent component, JointRemovedEvent args) { if (!component.Segments.Contains(args.OtherEntity)) return; @@ -148,7 +114,7 @@ private void OnJointRemoved(EntityUid uid, LamiaComponent component, JointRemove component.Segments.Clear(); } - private void OnRemovedFromContainer(EntityUid uid, LamiaComponent component, EntGotRemovedFromContainerMessage args) + private void OnRemovedFromContainer(EntityUid uid, SegmentedEntityComponent component, EntGotRemovedFromContainerMessage args) { if (component.Segments.Count != 0) { @@ -160,19 +126,7 @@ private void OnRemovedFromContainer(EntityUid uid, LamiaComponent component, Ent SpawnSegments(uid, component); } - private void HandleSegmentDamage(EntityUid uid, LamiaSegmentComponent component, DamageModifyEvent args) - { - if (args.Origin == component.Lamia) - args.Damage *= 0; - args.Damage = args.Damage / component.DamageModifyFactor; - } - private void HandleDamageTransfer(EntityUid uid, LamiaSegmentComponent component, DamageChangedEvent args) - { - if (args.DamageDelta == null) return; - _damageableSystem.TryChangeDamage(component.Lamia, args.DamageDelta); - } - - public void SpawnSegments(EntityUid uid, LamiaComponent component) + public void SpawnSegments(EntityUid uid, SegmentedEntityComponent component) { int i = 1; var addTo = uid; @@ -184,31 +138,31 @@ public void SpawnSegments(EntityUid uid, LamiaComponent component) } } - private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, LamiaComponent lamiaComponent, int segmentNumber) + private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, SegmentedEntityComponent segmentedComponent, int segmentNumber) { - LamiaSegmentComponent segmentComponent = new(); + SegmentedEntitySegmentComponent segmentComponent = new(); segmentComponent.Lamia = parentuid; segmentComponent.AttachedToUid = segmentuid; - segmentComponent.DamageModifierConstant = lamiaComponent.NumberOfSegments * lamiaComponent.DamageModifierOffset; - float damageModifyCoefficient = segmentComponent.DamageModifierConstant / lamiaComponent.NumberOfSegments; + segmentComponent.DamageModifierConstant = segmentedComponent.NumberOfSegments * segmentedComponent.DamageModifierOffset; + float damageModifyCoefficient = segmentComponent.DamageModifierConstant / segmentedComponent.NumberOfSegments; segmentComponent.DamageModifyFactor = segmentComponent.DamageModifierConstant * damageModifyCoefficient; - segmentComponent.ExplosiveModifyFactor = 1 / segmentComponent.DamageModifyFactor / (lamiaComponent.NumberOfSegments * lamiaComponent.ExplosiveModifierOffset); + segmentComponent.ExplosiveModifyFactor = 1 / segmentComponent.DamageModifyFactor / (segmentedComponent.NumberOfSegments * segmentedComponent.ExplosiveModifierOffset); - float taperConstant = lamiaComponent.NumberOfSegments - lamiaComponent.TaperOffset; + float taperConstant = segmentedComponent.NumberOfSegments - segmentedComponent.TaperOffset; EntityUid segment; if (segmentNumber == 1) - segment = EntityManager.SpawnEntity(lamiaComponent.InitialSegmentId, Transform(segmentuid).Coordinates); + segment = EntityManager.SpawnEntity(segmentedComponent.InitialSegmentId, Transform(segmentuid).Coordinates); else - segment = EntityManager.SpawnEntity(lamiaComponent.SegmentId, Transform(segmentuid).Coordinates); - if (segmentNumber >= taperConstant && lamiaComponent.UseTaperSystem == true) + segment = EntityManager.SpawnEntity(segmentedComponent.SegmentId, Transform(segmentuid).Coordinates); + if (segmentNumber >= taperConstant && segmentedComponent.UseTaperSystem == true) { - segmentComponent.OffsetSwitching = lamiaComponent.StaticOffset * MathF.Pow(lamiaComponent.OffsetConstant, segmentNumber - taperConstant); - segmentComponent.ScaleFactor = lamiaComponent.StaticScale * MathF.Pow(1f / lamiaComponent.OffsetConstant, segmentNumber - taperConstant); + segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset * MathF.Pow(segmentedComponent.OffsetConstant, segmentNumber - taperConstant); + segmentComponent.ScaleFactor = segmentedComponent.StaticScale * MathF.Pow(1f / segmentedComponent.OffsetConstant, segmentNumber - taperConstant); } else { - segmentComponent.OffsetSwitching = lamiaComponent.StaticOffset; - segmentComponent.ScaleFactor = lamiaComponent.StaticScale; + segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset; + segmentComponent.ScaleFactor = segmentedComponent.StaticScale; } if (segmentNumber % 2 != 0) { @@ -220,21 +174,63 @@ private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, LamiaCom EntityManager.AddComponent(segment, segmentComponent, true); EnsureComp(segment); _segments.Enqueue((segmentComponent, parentuid)); - lamiaComponent.Segments.Add(segment); + segmentedComponent.Segments.Add(segment); return segment; } - private void OnLamiaStorageInsertAttempt(EntityUid uid, LamiaComponent comp, ref InsertIntoEntityStorageAttemptEvent args) + /// + /// Handles transferring marking selections to the tail segments. Every tail marking must be repeated 2 times in order for this script to work. + /// + /// + /// + /// + // TODO: Please for the love of god don't make me write a test to validate that every marking also has its matching segment states. + // Future contributors will just find out when their game crashes because they didn't make a marking-segment. + private void OnSegmentSpawned(EntityUid uid, SegmentedEntitySegmentComponent component, SegmentSpawnedEvent args) + { + component.Lamia = args.Lamia; + + if (!TryComp(uid, out var species)) return; + if (!TryComp(args.Lamia, out var humanoid)) return; + if (!TryComp(uid, out var appearance)) return; + + _appearance.SetData(uid, ScaleVisuals.Scale, component.ScaleFactor, appearance); + + if (humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings)) + { + foreach (var markings in tailMarkings) + { + var segmentId = species.Species; + var markingId = markings.MarkingId; + string segmentmarking = $"{markingId}-{segmentId}"; + _humanoid.AddMarking(uid, segmentmarking, markings.MarkingColors); + } + } + } + + private void HandleSegmentDamage(EntityUid uid, SegmentedEntitySegmentComponent component, DamageModifyEvent args) + { + if (args.Origin == component.Lamia) + args.Damage *= 0; + args.Damage = args.Damage / component.DamageModifyFactor; + } + private void HandleDamageTransfer(EntityUid uid, SegmentedEntitySegmentComponent component, DamageChangedEvent args) + { + if (args.DamageDelta == null) return; + _damageableSystem.TryChangeDamage(component.Lamia, args.DamageDelta); + } + + private void OnLamiaStorageInsertAttempt(EntityUid uid, SegmentedEntityComponent comp, ref InsertIntoEntityStorageAttemptEvent args) { args.Cancelled = true; } - private void OnSegmentStorageInsertAttempt(EntityUid uid, LamiaSegmentComponent comp, ref InsertIntoEntityStorageAttemptEvent args) + private void OnSegmentStorageInsertAttempt(EntityUid uid, SegmentedEntitySegmentComponent comp, ref InsertIntoEntityStorageAttemptEvent args) { args.Cancelled = true; } - private void OnDidEquipEvent(EntityUid equipee, LamiaComponent component, DidEquipEvent args) + private void OnDidEquipEvent(EntityUid equipee, SegmentedEntityComponent component, DidEquipEvent args) { if (!TryComp(args.Equipment, out var clothing)) return; if (args.Slot == "outerClothing" && _tagSystem.HasTag(args.Equipment, LamiaHardsuitTag)) @@ -242,31 +238,31 @@ private void OnDidEquipEvent(EntityUid equipee, LamiaComponent component, DidEqu foreach (var uid in component.Segments) { if (!TryComp(uid, out var appearance)) return; - _appearance.SetData(uid, LamiaSegmentVisualLayers.Armor, true, appearance); + _appearance.SetData(uid, SegmentedEntitySegmentVisualLayers.Armor, true, appearance); if (clothing.RsiPath == null) return; - _appearance.SetData(uid, LamiaSegmentVisualLayers.ArmorRsi, clothing.RsiPath, appearance); + _appearance.SetData(uid, SegmentedEntitySegmentVisualLayers.ArmorRsi, clothing.RsiPath, appearance); } } } - private void OnSnekBoom(EntityUid uid, LamiaSegmentComponent component, ref GetExplosionResistanceEvent args) + private void OnSnekBoom(EntityUid uid, SegmentedEntitySegmentComponent component, ref GetExplosionResistanceEvent args) { args.DamageCoefficient = component.ExplosiveModifyFactor; } - private void OnDidUnequipEvent(EntityUid equipee, LamiaComponent component, DidUnequipEvent args) + private void OnDidUnequipEvent(EntityUid equipee, SegmentedEntityComponent component, DidUnequipEvent args) { if (args.Slot == "outerClothing" && _tagSystem.HasTag(args.Equipment, LamiaHardsuitTag)) { foreach (var uid in component.Segments) { if (!TryComp(uid, out var appearance)) return; - _appearance.SetData(uid, LamiaSegmentVisualLayers.Armor, false, appearance); + _appearance.SetData(uid, SegmentedEntitySegmentVisualLayers.Armor, false, appearance); } } } - private void PreventShootSelf(EntityUid uid, LamiaSegmentComponent component, ref PreventCollideEvent args) + private void PreventShootSelf(EntityUid uid, SegmentedEntitySegmentComponent component, ref PreventCollideEvent args) { if (!TryComp(args.OtherEntity, out var projectileComponent)) return; @@ -276,7 +272,7 @@ private void PreventShootSelf(EntityUid uid, LamiaSegmentComponent component, re } } - private void OnShootHitscan(EntityUid uid, LamiaComponent component, ref HitScanAfterRayCastEvent args) + private void OnShootHitscan(EntityUid uid, SegmentedEntityComponent component, ref HitScanAfterRayCastEvent args) { if (args.RayCastResults == null) return; diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml index d7cb856e299..9b97a240020 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml @@ -194,7 +194,7 @@ - MobMask layer: - MobLayer - - type: Lamia + - type: SegmentedEntity numberOfSegments: 18 - type: Speech speechSounds: Alto diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml index a76973e0f09..173993127f9 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml @@ -29,7 +29,7 @@ - MobLayer - type: Transform anchored: false - - type: LamiaSegmentVisuals + - type: SegmentedEntitySegmentVisuals - type: Tag tags: - HideContextMenu @@ -47,7 +47,7 @@ drawdepth: SmallMobs layers: - map: [ "enum.HumanoidVisualLayers.Tail" ] - - map: [ "enum.LamiaSegmentVisualLayers.Armor" ] + - map: [ "enum.SegmentedEntitySegmentVisualLayers.Armor" ] sprite: Clothing/OuterClothing/Hardsuits/basic.rsi state: segment visible: false From c94767740db838e1c7bb065a5b234d8e390f1b48 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 17 Jun 2024 16:39:48 -0400 Subject: [PATCH 59/73] Update SegmentedEntitySystem.cs --- .../SegmentedEntity/SegmentedEntitySystem.cs | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index 8d70fad7c21..9e393642b30 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -140,13 +140,6 @@ public void SpawnSegments(EntityUid uid, SegmentedEntityComponent component) private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, SegmentedEntityComponent segmentedComponent, int segmentNumber) { - SegmentedEntitySegmentComponent segmentComponent = new(); - segmentComponent.Lamia = parentuid; - segmentComponent.AttachedToUid = segmentuid; - segmentComponent.DamageModifierConstant = segmentedComponent.NumberOfSegments * segmentedComponent.DamageModifierOffset; - float damageModifyCoefficient = segmentComponent.DamageModifierConstant / segmentedComponent.NumberOfSegments; - segmentComponent.DamageModifyFactor = segmentComponent.DamageModifierConstant * damageModifyCoefficient; - segmentComponent.ExplosiveModifyFactor = 1 / segmentComponent.DamageModifyFactor / (segmentedComponent.NumberOfSegments * segmentedComponent.ExplosiveModifierOffset); float taperConstant = segmentedComponent.NumberOfSegments - segmentedComponent.TaperOffset; EntityUid segment; @@ -154,6 +147,18 @@ private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, Segmente segment = EntityManager.SpawnEntity(segmentedComponent.InitialSegmentId, Transform(segmentuid).Coordinates); else segment = EntityManager.SpawnEntity(segmentedComponent.SegmentId, Transform(segmentuid).Coordinates); + + if (EnsureComp(segment, out var segmentComponent)) + { + segmentComponent.Lamia = parentuid; + segmentComponent.AttachedToUid = segmentuid; + segmentComponent.DamageModifierConstant = segmentedComponent.NumberOfSegments * segmentedComponent.DamageModifierOffset; + float damageModifyCoefficient = segmentComponent.DamageModifierConstant / segmentedComponent.NumberOfSegments; + segmentComponent.DamageModifyFactor = segmentComponent.DamageModifierConstant * damageModifyCoefficient; + segmentComponent.ExplosiveModifyFactor = 1 / segmentComponent.DamageModifyFactor / (segmentedComponent.NumberOfSegments * segmentedComponent.ExplosiveModifierOffset); + } + + if (segmentNumber >= taperConstant && segmentedComponent.UseTaperSystem == true) { segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset * MathF.Pow(segmentedComponent.OffsetConstant, segmentNumber - taperConstant); @@ -168,10 +173,7 @@ private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, Segmente { segmentComponent.OffsetSwitching *= -1; } - - segmentComponent.Owner = segment; segmentComponent.SegmentNumber = segmentNumber; - EntityManager.AddComponent(segment, segmentComponent, true); EnsureComp(segment); _segments.Enqueue((segmentComponent, parentuid)); segmentedComponent.Segments.Add(segment); From 202ab2883af6c1329986fafab38631007f66d429 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 24 Jun 2024 16:25:47 -0400 Subject: [PATCH 60/73] Update SegmentedEntitySystem.cs --- .../SegmentedEntity/SegmentedEntitySystem.cs | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index 9e393642b30..af9274c2a45 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -16,6 +16,7 @@ using Robust.Shared.Physics.Systems; using Robust.Shared.Physics.Components; using System.Numerics; +using System.Net; namespace Content.Shared.SegmentedEntity { @@ -148,16 +149,16 @@ private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, Segmente else segment = EntityManager.SpawnEntity(segmentedComponent.SegmentId, Transform(segmentuid).Coordinates); - if (EnsureComp(segment, out var segmentComponent)) - { - segmentComponent.Lamia = parentuid; - segmentComponent.AttachedToUid = segmentuid; - segmentComponent.DamageModifierConstant = segmentedComponent.NumberOfSegments * segmentedComponent.DamageModifierOffset; - float damageModifyCoefficient = segmentComponent.DamageModifierConstant / segmentedComponent.NumberOfSegments; - segmentComponent.DamageModifyFactor = segmentComponent.DamageModifierConstant * damageModifyCoefficient; - segmentComponent.ExplosiveModifyFactor = 1 / segmentComponent.DamageModifyFactor / (segmentedComponent.NumberOfSegments * segmentedComponent.ExplosiveModifierOffset); - } + var segmentComponent = EnsureComp(segment); + segmentComponent.Lamia = parentuid; + segmentComponent.AttachedToUid = segmentuid; + segmentComponent.DamageModifierConstant = segmentedComponent.NumberOfSegments * segmentedComponent.DamageModifierOffset; + float damageModifyCoefficient = segmentComponent.DamageModifierConstant / segmentedComponent.NumberOfSegments; + segmentComponent.DamageModifyFactor = segmentComponent.DamageModifierConstant * damageModifyCoefficient; + segmentComponent.ExplosiveModifyFactor = 1 / segmentComponent.DamageModifyFactor / (segmentedComponent.NumberOfSegments * segmentedComponent.ExplosiveModifierOffset); + segmentComponent.SegmentNumber = segmentNumber; + segmentComponent.Owner = segment; if (segmentNumber >= taperConstant && segmentedComponent.UseTaperSystem == true) { @@ -173,7 +174,7 @@ private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, Segmente { segmentComponent.OffsetSwitching *= -1; } - segmentComponent.SegmentNumber = segmentNumber; + EnsureComp(segment); _segments.Enqueue((segmentComponent, parentuid)); segmentedComponent.Segments.Add(segment); From 84edee0ff742c6a9646de24d80221f7a72fe7457 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 24 Jun 2024 16:39:27 -0400 Subject: [PATCH 61/73] Implement shoot over segment --- .../SegmentedEntity/SegmentedEntitySystem.cs | 11 ----------- .../Entities/Objects/Specific/Species/lamia.yml | 2 ++ 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index af9274c2a45..a820c87c2a3 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -41,7 +41,6 @@ public override void Initialize() SubscribeLocalEvent(OnDidEquipEvent); SubscribeLocalEvent(OnDidUnequipEvent); SubscribeLocalEvent(OnSnekBoom); - SubscribeLocalEvent(PreventShootSelf); SubscribeLocalEvent(HandleDamageTransfer); SubscribeLocalEvent(HandleSegmentDamage); SubscribeLocalEvent(OnSegmentSpawned); @@ -265,16 +264,6 @@ private void OnDidUnequipEvent(EntityUid equipee, SegmentedEntityComponent compo } } - private void PreventShootSelf(EntityUid uid, SegmentedEntitySegmentComponent component, ref PreventCollideEvent args) - { - if (!TryComp(args.OtherEntity, out var projectileComponent)) return; - - if (projectileComponent.Shooter == component.Lamia) - { - args.Cancelled = true; - } - } - private void OnShootHitscan(EntityUid uid, SegmentedEntityComponent component, ref HitScanAfterRayCastEvent args) { if (args.RayCastResults == null) return; diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml index 173993127f9..0383143c269 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml @@ -33,6 +33,8 @@ - type: Tag tags: - HideContextMenu + - type: RequireProjectileTarget + active: True - type: entity id: LamiaSegment From 9b135eec80a41c26793e09e10a3e532166b80253 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 19 Jul 2024 14:46:32 -0400 Subject: [PATCH 62/73] Prove I am still working on this --- .../SegmentedEntity/SegmentedEntitySystem.cs | 102 ++++++++++++++---- .../DeltaV/Entities/Mobs/Species/lamia.yml | 1 + 2 files changed, 81 insertions(+), 22 deletions(-) diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index a820c87c2a3..c751391adf4 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -17,6 +17,8 @@ using Robust.Shared.Physics.Components; using System.Numerics; using System.Net; +using Robust.Shared.Network; +using System.Net.WebSockets; namespace Content.Shared.SegmentedEntity { @@ -27,6 +29,7 @@ public sealed partial class LamiaSystem : EntitySystem [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly SharedHumanoidAppearanceSystem _humanoid = default!; [Dependency] private readonly SharedJointSystem _jointSystem = default!; + [Dependency] private readonly INetManager _net = default!; Queue<(SegmentedEntitySegmentComponent segment, EntityUid lamia)> _segments = new(); @@ -35,19 +38,23 @@ public sealed partial class LamiaSystem : EntitySystem public override void Initialize() { base.Initialize(); + //Parent subscriptions SubscribeLocalEvent(OnShootHitscan); SubscribeLocalEvent(OnLamiaStorageInsertAttempt); - SubscribeLocalEvent(OnSegmentStorageInsertAttempt); SubscribeLocalEvent(OnDidEquipEvent); SubscribeLocalEvent(OnDidUnequipEvent); - SubscribeLocalEvent(OnSnekBoom); - SubscribeLocalEvent(HandleDamageTransfer); - SubscribeLocalEvent(HandleSegmentDamage); - SubscribeLocalEvent(OnSegmentSpawned); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnJointRemoved); SubscribeLocalEvent(OnRemovedFromContainer); + SubscribeLocalEvent(OnParentChanged); + + //Child subscriptions + SubscribeLocalEvent(OnSegmentStorageInsertAttempt); + SubscribeLocalEvent(OnSnekBoom); + SubscribeLocalEvent(HandleDamageTransfer); + SubscribeLocalEvent(HandleSegmentDamage); + SubscribeLocalEvent(OnSegmentSpawned); } public override void Update(float frameTime) { @@ -88,6 +95,7 @@ public override void Update(float frameTime) } private void OnInit(EntityUid uid, SegmentedEntityComponent component, ComponentInit args) { + EnsureComp(uid); //Temporary, remove when Portal handling is added Math.Clamp(component.NumberOfSegments, 2, 18); Math.Clamp(component.TaperOffset, 1, component.NumberOfSegments - 1); SpawnSegments(uid, component); @@ -95,6 +103,9 @@ private void OnInit(EntityUid uid, SegmentedEntityComponent component, Component private void OnShutdown(EntityUid uid, SegmentedEntityComponent component, ComponentShutdown args) { + if (_net.IsClient) + return; + foreach (var segment in component.Segments) { QueueDel(segment); @@ -103,42 +114,65 @@ private void OnShutdown(EntityUid uid, SegmentedEntityComponent component, Compo component.Segments.Clear(); } + private void SegmentSelfTest(EntityUid uid, SegmentedEntityComponent component) + { + + } + private void OnJointRemoved(EntityUid uid, SegmentedEntityComponent component, JointRemovedEvent args) { if (!component.Segments.Contains(args.OtherEntity)) return; + RespawnSegments(uid, component); + } + + private void OnRemovedFromContainer(EntityUid uid, SegmentedEntityComponent component, EntGotRemovedFromContainerMessage args) + { + RespawnSegments(uid, component); + } + + private void DeleteSegments(SegmentedEntityComponent component) + { + if (_net.IsClient) + return; //Client is not allowed to predict QueueDel, it'll throw an error(but won't crash in Release build) + foreach (var segment in component.Segments) QueueDel(segment); component.Segments.Clear(); } - private void OnRemovedFromContainer(EntityUid uid, SegmentedEntityComponent component, EntGotRemovedFromContainerMessage args) + /// + /// Public call for a SegmentedEntity to reset their tail completely. + /// + /// + /// + public void RespawnSegments(EntityUid uid, SegmentedEntityComponent component) { - if (component.Segments.Count != 0) - { - foreach (var segment in component.Segments) - QueueDel(segment); - component.Segments.Clear(); - } - + DeleteSegments(component); SpawnSegments(uid, component); } - public void SpawnSegments(EntityUid uid, SegmentedEntityComponent component) + private void SpawnSegments(EntityUid uid, SegmentedEntityComponent component) { + if (_net.IsClient) + return; //Client is not allowed to spawn entities. It won't throw an error, but it'll make fake client entities. + + //Segmented Entities are potentially not humanoids, they could for instance be a giant space worm. + var humanoidFactor = TryComp(uid, out var humanoid) ? (humanoid.Height + humanoid.Width) / 2 : 1; + int i = 1; var addTo = uid; while (i <= component.NumberOfSegments + 1) { - var segment = AddSegment(addTo, uid, component, i); + var segment = AddSegment(addTo, uid, component, i, humanoidFactor); addTo = segment; i++; } } - private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, SegmentedEntityComponent segmentedComponent, int segmentNumber) + private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, SegmentedEntityComponent segmentedComponent, int segmentNumber, float humanoidFactor) { float taperConstant = segmentedComponent.NumberOfSegments - segmentedComponent.TaperOffset; @@ -159,22 +193,38 @@ private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, Segmente segmentComponent.SegmentNumber = segmentNumber; segmentComponent.Owner = segment; - if (segmentNumber >= taperConstant && segmentedComponent.UseTaperSystem == true) + if (segmentedComponent.UseTaperSystem == true) { - segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset * MathF.Pow(segmentedComponent.OffsetConstant, segmentNumber - taperConstant); - segmentComponent.ScaleFactor = segmentedComponent.StaticScale * MathF.Pow(1f / segmentedComponent.OffsetConstant, segmentNumber - taperConstant); + if (segmentNumber >= taperConstant) + { + segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset + * humanoidFactor + * MathF.Pow(segmentedComponent.OffsetConstant, segmentNumber - taperConstant); + + segmentComponent.ScaleFactor = segmentedComponent.StaticScale + * humanoidFactor + * MathF.Pow(1f / segmentedComponent.OffsetConstant, segmentNumber - taperConstant); + } + if (segmentNumber < taperConstant) + { + segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset * humanoidFactor; + segmentComponent.ScaleFactor = segmentedComponent.StaticScale * humanoidFactor; + } } else { - segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset; - segmentComponent.ScaleFactor = segmentedComponent.StaticScale; + segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset * humanoidFactor; + segmentComponent.ScaleFactor = segmentedComponent.StaticScale * humanoidFactor; } + + // We invert the Y axis offset on every odd numbered tail so that the segmented entity spawns in a neat pile + // Rather than stretching across 5 to 10 vertical tiles, and potentially getting trapped in a wall if (segmentNumber % 2 != 0) { segmentComponent.OffsetSwitching *= -1; } - EnsureComp(segment); + EnsureComp(segment); //Not temporary, segments must never be allowed to go through portals for physics limitation reasons _segments.Enqueue((segmentComponent, parentuid)); segmentedComponent.Segments.Add(segment); return segment; @@ -276,5 +326,13 @@ private void OnShootHitscan(EntityUid uid, SegmentedEntityComponent component, r } args.RayCastResults = entityList; } + + private void OnParentChanged(EntityUid uid, SegmentedEntityComponent component, ref EntParentChangedMessage args) + { + if (Transform(uid).MapID != args.OldMapId) + return; + + RespawnSegments(uid, component); + } } } diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml index 9b97a240020..eb8d0f03f0d 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml @@ -214,6 +214,7 @@ bloodlossHealDamage: types: Bloodloss: -1 + - type: PortalExempt - type: entity save: false From 41eeba0457aae320ebc6ab93601389075025df4f Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 21 Jul 2024 17:52:42 -0400 Subject: [PATCH 63/73] Fix mistakes from merge conflicts --- .../Clothing/OuterClothing/Hardsuits/basic.rsi/meta.json | 1 + .../Clothing/OuterClothing/Hardsuits/rd.rsi/meta.json | 4 ++++ .../Clothing/OuterClothing/Suits/bombsuit.rsi/meta.json | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/meta.json index 925de1c4a7f..1fd6139e1d8 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/meta.json @@ -1,3 +1,4 @@ +{ "version": 1, "license": "CC-BY-SA-3.0", "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a. Further modifications and derivate works (inhand-left and inhand-right) under same license, derivative monkey made by brainfood1183 (github) for ss14, harpy by VMSolidus, lamia & segment by @noctyrnal", diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/meta.json index ad76d93153f..45b83db7176 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/meta.json @@ -6,6 +6,10 @@ "x": 32, "y": 32 }, + "states": [ + { + "name": "icon" + }, { "name": "equipped-OUTERCLOTHING", "directions": 4 diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/bombsuit.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Suits/bombsuit.rsi/meta.json index 16d4a62e0b2..906a91a7ec2 100644 --- a/Resources/Textures/Clothing/OuterClothing/Suits/bombsuit.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Suits/bombsuit.rsi/meta.json @@ -6,6 +6,10 @@ "x": 32, "y": 32 }, + "states": [ + { + "name": "icon" + }, { "name": "equipped-OUTERCLOTHING", "directions": 4 From c630d637fd905a918446b6551d8d8f50669adf40 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 21 Jul 2024 22:33:38 -0400 Subject: [PATCH 64/73] Lamia are *technically* "Playable" again. --- .../Systems/ShuttleSystem.FasterThanLight.cs | 5 +- .../SegmentedEntity/SegmentedEntitySystem.cs | 73 +++++++++++-------- .../Structures/Piping/Disposal/units.yml | 3 + 3 files changed, 48 insertions(+), 33 deletions(-) diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs index 51288691039..2ac779cc941 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs @@ -9,6 +9,7 @@ using Content.Shared.Ghost; using Content.Shared.Maps; using Content.Shared.Parallax; +using Content.Shared.SegmentedEntity; using Content.Shared.Shuttles.Components; using Content.Shared.Shuttles.Systems; using Content.Shared.StatusEffect; @@ -601,7 +602,9 @@ private void KnockOverKids(TransformComponent xform, ref ValueList to var childEnumerator = xform.ChildEnumerator; while (childEnumerator.MoveNext(out var child)) { - if (!_buckleQuery.TryGetComponent(child, out var buckle) || buckle.Buckled) + if (!_buckleQuery.TryGetComponent(child, out var buckle) || buckle.Buckled + || HasComp(child) + || HasComp(child)) continue; toKnock.Add(child); diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index c751391adf4..497dd31d595 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -7,18 +7,13 @@ using Content.Shared.Inventory.Events; using Content.Shared.Tag; using Content.Shared.Storage.Components; -using Robust.Shared.Physics.Events; -using Content.Shared.Projectiles; using Content.Shared.Weapons.Ranged.Events; using Content.Shared.Teleportation.Components; -using Robust.Shared.Containers; using Robust.Shared.Map; using Robust.Shared.Physics.Systems; using Robust.Shared.Physics.Components; using System.Numerics; -using System.Net; using Robust.Shared.Network; -using System.Net.WebSockets; namespace Content.Shared.SegmentedEntity { @@ -46,8 +41,8 @@ public override void Initialize() SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnJointRemoved); - SubscribeLocalEvent(OnRemovedFromContainer); SubscribeLocalEvent(OnParentChanged); + SubscribeLocalEvent(OnStoreSnekAttempt); //Child subscriptions SubscribeLocalEvent(OnSegmentStorageInsertAttempt); @@ -58,6 +53,7 @@ public override void Initialize() } public override void Update(float frameTime) { + //I HATE THIS, SO MUCH. I AM FORCED TO DEAL WITH THIS MONSTROSITY. PLEASE. SEND HELP. base.Update(frameTime); foreach (var segment in _segments) { @@ -73,6 +69,10 @@ public override void Update(float frameTime) EnsureComp(segmentUid); EnsureComp(attachedUid); // Hello I hate tests + // This is currently HERE and not somewhere more sane like OnInit because HumanoidAppearanceComponent is for whatever + // ungodly reason not initialized when ComponentStartup is called. Kill me. + var humanoidFactor = TryComp(segment.segment.Lamia, out var humanoid) ? (humanoid.Height + humanoid.Width) / 2 : 1; + var ev = new SegmentSpawnedEvent(segment.lamia); RaiseLocalEvent(segmentUid, ev, false); @@ -83,9 +83,9 @@ public override void Update(float frameTime) revoluteJoint.CollideConnected = false; } if (segment.segment.SegmentNumber <= segment.segment.MaxSegments) - Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0, segment.segment.OffsetSwitching)); + Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0, segment.segment.OffsetSwitching * humanoidFactor)); else - Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0, segment.segment.OffsetSwitching)); + Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0, segment.segment.OffsetSwitching * humanoidFactor)); var joint = _jointSystem.CreateDistanceJoint(attachedUid, segmentUid, id: ("Segment" + segment.segment.SegmentNumber + segment.segment.Lamia)); joint.CollideConnected = false; @@ -114,22 +114,37 @@ private void OnShutdown(EntityUid uid, SegmentedEntityComponent component, Compo component.Segments.Clear(); } - private void SegmentSelfTest(EntityUid uid, SegmentedEntityComponent component) + /// + /// TODO: Full Self-Test function that intelligently checks the status of where everything is, and calls whatever + /// functions are appropriate + /// + /// + /// + public void SegmentSelfTest(EntityUid uid, SegmentedEntityComponent component) { } - private void OnJointRemoved(EntityUid uid, SegmentedEntityComponent component, JointRemovedEvent args) + /// + /// TODO: Function that ensures clothing visuals, to be called anytime the tail is reset + /// + /// + /// + private void EnsureSnekSock(EntityUid uid, SegmentedEntityComponent segment) { - if (!component.Segments.Contains(args.OtherEntity)) - return; - RespawnSegments(uid, component); + } + public void OnStoreSnekAttempt(EntityUid uid, SegmentedEntityComponent comp, ref StoreMobInItemContainerAttemptEvent args) + { + args.Cancelled = true; } - private void OnRemovedFromContainer(EntityUid uid, SegmentedEntityComponent component, EntGotRemovedFromContainerMessage args) + private void OnJointRemoved(EntityUid uid, SegmentedEntityComponent component, JointRemovedEvent args) { - RespawnSegments(uid, component); + if (!component.Segments.Contains(args.OtherEntity)) + return; + + DeleteSegments(component); } private void DeleteSegments(SegmentedEntityComponent component) @@ -159,22 +174,18 @@ private void SpawnSegments(EntityUid uid, SegmentedEntityComponent component) if (_net.IsClient) return; //Client is not allowed to spawn entities. It won't throw an error, but it'll make fake client entities. - //Segmented Entities are potentially not humanoids, they could for instance be a giant space worm. - var humanoidFactor = TryComp(uid, out var humanoid) ? (humanoid.Height + humanoid.Width) / 2 : 1; - int i = 1; var addTo = uid; while (i <= component.NumberOfSegments + 1) { - var segment = AddSegment(addTo, uid, component, i, humanoidFactor); + var segment = AddSegment(addTo, uid, component, i); addTo = segment; i++; } } - private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, SegmentedEntityComponent segmentedComponent, int segmentNumber, float humanoidFactor) + private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, SegmentedEntityComponent segmentedComponent, int segmentNumber) { - float taperConstant = segmentedComponent.NumberOfSegments - segmentedComponent.TaperOffset; EntityUid segment; if (segmentNumber == 1) @@ -198,23 +209,21 @@ private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, Segmente if (segmentNumber >= taperConstant) { segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset - * humanoidFactor * MathF.Pow(segmentedComponent.OffsetConstant, segmentNumber - taperConstant); segmentComponent.ScaleFactor = segmentedComponent.StaticScale - * humanoidFactor * MathF.Pow(1f / segmentedComponent.OffsetConstant, segmentNumber - taperConstant); } if (segmentNumber < taperConstant) { - segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset * humanoidFactor; - segmentComponent.ScaleFactor = segmentedComponent.StaticScale * humanoidFactor; + segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset; + segmentComponent.ScaleFactor = segmentedComponent.StaticScale; } } else { - segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset * humanoidFactor; - segmentComponent.ScaleFactor = segmentedComponent.StaticScale * humanoidFactor; + segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset; + segmentComponent.ScaleFactor = segmentedComponent.StaticScale; } // We invert the Y axis offset on every odd numbered tail so that the segmented entity spawns in a neat pile @@ -245,8 +254,9 @@ private void OnSegmentSpawned(EntityUid uid, SegmentedEntitySegmentComponent com if (!TryComp(uid, out var species)) return; if (!TryComp(args.Lamia, out var humanoid)) return; if (!TryComp(uid, out var appearance)) return; + var humanoidFactor = (humanoid.Height + humanoid.Width) / 2; - _appearance.SetData(uid, ScaleVisuals.Scale, component.ScaleFactor, appearance); + _appearance.SetData(uid, ScaleVisuals.Scale, component.ScaleFactor * humanoidFactor, appearance); if (humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings)) { @@ -329,10 +339,9 @@ private void OnShootHitscan(EntityUid uid, SegmentedEntityComponent component, r private void OnParentChanged(EntityUid uid, SegmentedEntityComponent component, ref EntParentChangedMessage args) { - if (Transform(uid).MapID != args.OldMapId) - return; - - RespawnSegments(uid, component); + //If the change was NOT to a different map + if (args.OldMapId == args.Transform.MapID) + RespawnSegments(uid, component); } } } diff --git a/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml b/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml index 75ec98c402a..6d88a1015bb 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml @@ -77,6 +77,9 @@ graph: DisposalMachine node: disposal_unit - type: DisposalUnit + blacklist: + components: + - SegmentedEntity - type: UserInterface interfaces: - key: enum.DisposalUnitUiKey.Key From 933fc2a9cffd759b6c29b23905bcc1ae92e9927c Mon Sep 17 00:00:00 2001 From: Rane <60792108+Elijahrane@users.noreply.github.com> Date: Mon, 5 Aug 2024 13:15:50 -0400 Subject: [PATCH 65/73] Make Lamiae Out of Tris Instead of Sprites (#673) # Description The old sprite-based rendering approach was very limiting, here I've changed to using an overlay and just constructing the lamia bodies out of triangles. I'm about happy with it although it's lacking the clothing feature we added earlier just waiting on art. Networking and perf should be fine. I don't know how much of the other stuff you want me to clean up. A lot of unrelated code can probably get just deleted. # TODO - [ ] New base + clothes sprites that look good - [ ] Support for clothes based texture change (should take 5 mins) https://github.com/user-attachments/assets/c5022e54-cb3d-4f53-b65c-83863b21df29 # Changelog :cl: Rane - add: Lamiae should now be rendered much better. --- .../DeltaV/Lamiae/ClientLamiaVisuals.cs | 42 ---- .../Lamiae/LamiaSegmentVisualsComponent.cs | 11 -- Content.Client/DeltaV/Lamiae/SnakeOverlay.cs | 184 ++++++++++++++++++ .../DeltaV/Lamiae/SnakeOverlaySystem.cs | 32 +++ .../SegmentedEntityComponent.cs | 32 ++- .../SegmentedEntitySegmentVisuals.cs | 18 -- .../SegmentedEntity/SegmentedEntitySystem.cs | 62 +----- .../DeltaV/Entities/Mobs/Species/lamia.yml | 2 + .../Objects/Specific/Species/lamia.yml | 14 +- Resources/Prototypes/DeltaV/Species/lamia.yml | 25 --- .../Mobs/Species/lamia.rsi/meta.json | 3 + .../Mobs/Species/lamia.rsi/segment.png | Bin 0 -> 4418 bytes 12 files changed, 260 insertions(+), 165 deletions(-) delete mode 100644 Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs delete mode 100644 Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs create mode 100644 Content.Client/DeltaV/Lamiae/SnakeOverlay.cs create mode 100644 Content.Client/DeltaV/Lamiae/SnakeOverlaySystem.cs delete mode 100644 Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/segment.png diff --git a/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs b/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs deleted file mode 100644 index 046f6a7a3c3..00000000000 --- a/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs +++ /dev/null @@ -1,42 +0,0 @@ -/* -* Delta-V - This file is licensed under AGPLv3 -* Copyright (c) 2024 Delta-V Contributors -* See AGPLv3.txt for details. -*/ - -using Robust.Client.GameObjects; -using System.Numerics; -using Content.Shared.SegmentedEntity; - -namespace Content.Client.DeltaV.Lamiae; - -public sealed class ClientLamiaVisualSystem : VisualizerSystem -{ - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnAppearanceChange); - } - private void OnAppearanceChange(EntityUid uid, SegmentedEntitySegmentComponent component, ref AppearanceChangeEvent args) - { - if (args.Sprite == null) return; - - if (AppearanceSystem.TryGetData(uid, ScaleVisuals.Scale, out var scale) && TryComp(uid, out var sprite)) - { - sprite.Scale = new Vector2(scale, scale); - } - - if (AppearanceSystem.TryGetData(uid, SegmentedEntitySegmentVisualLayers.Armor, out var worn) - && AppearanceSystem.TryGetData(uid, SegmentedEntitySegmentVisualLayers.ArmorRsi, out var path)) - { - var valid = !string.IsNullOrWhiteSpace(path); - if (valid) - { - args.Sprite.LayerSetRSI(SegmentedEntitySegmentVisualLayers.Armor, path); - } - args.Sprite.LayerSetVisible(SegmentedEntitySegmentVisualLayers.Armor, worn); - } - } -} diff --git a/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs b/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs deleted file mode 100644 index e2c1139f234..00000000000 --- a/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -/* -* Delta-V - This file is licensed under AGPLv3 -* Copyright (c) 2024 Delta-V Contributors -* See AGPLv3.txt for details. -*/ - -namespace Content.Client.DeltaV.Lamiae; - -[RegisterComponent] -public sealed partial class SegmentedEntitySegmentVisualsComponent : Component -{} diff --git a/Content.Client/DeltaV/Lamiae/SnakeOverlay.cs b/Content.Client/DeltaV/Lamiae/SnakeOverlay.cs new file mode 100644 index 00000000000..a8ed98c3369 --- /dev/null +++ b/Content.Client/DeltaV/Lamiae/SnakeOverlay.cs @@ -0,0 +1,184 @@ +/* +* This file is licensed under AGPLv3 +* Copyright (c) 2024 Rane +* See AGPLv3.txt for details. +*/ + +using Content.Shared.SegmentedEntity; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Markings; +using Content.Client.Resources; +using Robust.Client.ResourceManagement; +using Robust.Client.Graphics; +using Robust.Shared.Enums; +using System.Numerics; +using System.Linq; + + +namespace Content.Client.DeltaV.Lamiae; + +/// +/// This draws lamia segments directly from polygons instead of sprites. This is a very novel approach as of the time this is being written (August 2024) but it wouldn't surprise me +/// if there's a better way to do this at some point. Currently we have a very heavy restriction on the tools we can make, forcing me to make several helpers that may be redundant later. +/// This will be overcommented because I know you haven't seen code like this before and you might want to copy it. +/// This is an expansion on some techniques I discovered in (https://github.com/Elijahrane/Delta-v/blob/49d76c437740eab79fc622ab50d628b926e6ddcb/Content.Client/DeltaV/Arcade/S3D/Renderer/S3DRenderer.cs) +/// +public sealed class SnakeOverlay : Overlay +{ + private readonly IResourceCache _resourceCache; + private readonly IEntityManager _entManager; + private readonly SharedTransformSystem _transform; + private readonly SharedHumanoidAppearanceSystem _humanoid = default!; + + // Look through these carefully. WorldSpace is useful for debugging. Note that this defaults to "screen space" which breaks when you try and get the world handle. + public override OverlaySpace Space => OverlaySpace.WorldSpaceEntities; + + // Overlays are strange and you need this pattern where you define readonly deps above, and then make a constructor with this pattern. Anything that creates this overlay will then + // have to provide all the deps. + public SnakeOverlay(IEntityManager entManager, IResourceCache resourceCache) + { + _resourceCache = resourceCache; + // we get ent manager from SnakeOverlaySystem turning this on and passing it + _entManager = entManager; + // with ent manager we can fetch our other entity systems + _transform = _entManager.EntitySysManager.GetEntitySystem(); + _humanoid = _entManager.EntitySysManager.GetEntitySystem(); + + // draw at drawdepth 3 + ZIndex = 3; + } + + // This step occurs each frame. For some overlays you may want to conisder limiting how often they update, but for player entities that move around fast we'll just do it every frame. + protected override void Draw(in OverlayDrawArgs args) + { + // load the handle, the "pen" we draw with + var handle = args.WorldHandle; + + // Get all lamiae the client knows of and their transform in a way we can enumerate over + var enumerator = _entManager.AllEntityQueryEnumerator(); + + // I go over the collection above, pulling out an EntityUid and the two components I need for each. + while (enumerator.MoveNext(out var uid, out var lamia, out var xform)) + { + // Skip ones that are off-map. "Map" in this context means interconnected stuff you can travel between by moving, rather than needing e.g. FTL to load a new map. + if (xform.MapID != args.MapId) + continue; + + // Skip ones where they are not loaded properly, uninitialized, or w/e + if (lamia.Segments.Count < lamia.NumberOfSegments) + { + _entManager.Dirty(uid, lamia); // pls give me an update... + continue; + } + + // By the way, there's a hack to mitigate overdraw somewhat. Check out whatever is going on with the variable called "bounds" in DoAfterOverlay. + // I won't do it here because (1) it's ugly and (2) theoretically these entities can be fucking huge and you'll see the tail end of them when they are way off screen. + // On a PVS level I think segmented entities should be all-or-nothing when it comes to PVS range, that is you either load all of their segments or none. + + // Color.White is drawing without modifying color. For clothed tails, we should use White. For skin, we should use the color of the marking. + // TODO: Better way to cache this + if (_entManager.TryGetComponent(uid, out var humanoid)) + { + if (humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings)) + { + var col = tailMarkings.First().MarkingColors.First(); + DrawLamia(handle, lamia, col); + } + } + else + { + DrawLamia(handle, lamia, Color.White); + } + } + } + + // This is where we do the actual drawing. + private void DrawLamia(DrawingHandleWorld handle, SegmentedEntityComponent lamia, Color color) + { + // We're going to store all our verticies in here and then draw them + List verts = new List(); + + // Radius of the initial segment + float radius = lamia.InitialRadius; + + // We're storing the left and right verticies of the last segment so we can start drawing from there without gaps + Vector2? lastPtCW = null; + Vector2? lastPtCCW = null; + + var tex = _resourceCache.GetTexture(lamia.TexturePath); + + int i = 1; + // do each segment except the last one normally + while (i < lamia.Segments.Count - 1) + { + // get centerpoints of last segment and this one + var origin = _transform.GetWorldPosition(_entManager.GetEntity(lamia.Segments[i - 1])); + var destination = _transform.GetWorldPosition(_entManager.GetEntity(lamia.Segments[i])); + + // get direction between the two points and normalize it + var connectorVec = destination - origin; + connectorVec = connectorVec.Normalized(); + + //get one rotated 90 degrees clockwise + var offsetVecCW = new Vector2(connectorVec.Y, 0 - connectorVec.X); + + //and counterclockwise + var offsetVecCCW = new Vector2(0 - connectorVec.Y, connectorVec.X); + + /// tri 1: line across first segment and corner of second + if (lastPtCW == null) + { + verts.Add(new DrawVertexUV2D(origin + offsetVecCW * radius, Vector2.Zero)); + } + else + { + verts.Add(new DrawVertexUV2D((Vector2) lastPtCW, Vector2.Zero)); + } + + if (lastPtCCW == null) + { + verts.Add(new DrawVertexUV2D(origin + offsetVecCCW * radius, new Vector2(1, 0))); + } + else + { + verts.Add(new DrawVertexUV2D((Vector2) lastPtCCW, new Vector2(1, 0))); + } + + verts.Add(new DrawVertexUV2D(destination + offsetVecCW * radius, new Vector2(0, 1))); + + // tri 2: line across second segment and corner of first + if (lastPtCCW == null) + { + verts.Add(new DrawVertexUV2D(origin + offsetVecCCW * radius, new Vector2(1, 0))); + } + else + { + verts.Add(new DrawVertexUV2D((Vector2) lastPtCCW, new Vector2(1, 0))); + } + + lastPtCW = destination + offsetVecCW * radius; + verts.Add(new DrawVertexUV2D((Vector2) lastPtCW, new Vector2(0, 1))); + lastPtCCW = destination + offsetVecCCW * radius; + verts.Add(new DrawVertexUV2D((Vector2) lastPtCCW, new Vector2(1, 1))); + + // slim down a bit for next segment + radius *= lamia.SlimFactor; + + i++; + } + + // draw tail (1 tri) + if (lastPtCW != null && lastPtCCW != null) + { + verts.Add(new DrawVertexUV2D((Vector2) lastPtCW, new Vector2(0, 0))); + verts.Add(new DrawVertexUV2D((Vector2) lastPtCCW, new Vector2(1, 0))); + + var destination = _transform.GetWorldPosition(_entManager.GetEntity(lamia.Segments.Last())); + + verts.Add(new DrawVertexUV2D(destination, new Vector2(0.5f, 1f))); + } + + // Draw all of the triangles we just pit in at once + handle.DrawPrimitives(DrawPrimitiveTopology.TriangleList, texture: tex, verts.ToArray().AsSpan(), color); + } +} \ No newline at end of file diff --git a/Content.Client/DeltaV/Lamiae/SnakeOverlaySystem.cs b/Content.Client/DeltaV/Lamiae/SnakeOverlaySystem.cs new file mode 100644 index 00000000000..6be1a18dc14 --- /dev/null +++ b/Content.Client/DeltaV/Lamiae/SnakeOverlaySystem.cs @@ -0,0 +1,32 @@ +/* +* This file is licensed under AGPLv3 +* Copyright (c) 2024 Rane +* See AGPLv3.txt for details. +*/ + +using Robust.Client.Graphics; +using Robust.Client.ResourceManagement; + +namespace Content.Client.DeltaV.Lamiae; + +/// +/// This system turns on our always-on overlay. I have no opinion on this design pattern or the existence of this file. +/// It also fetches the deps it needs. +/// +public sealed class SnakeOverlaySystem : EntitySystem +{ + [Dependency] private readonly IOverlayManager _overlay = default!; + [Dependency] private readonly IResourceCache _resourceCache = default!; + + public override void Initialize() + { + base.Initialize(); + _overlay.AddOverlay(new SnakeOverlay(EntityManager, _resourceCache)); + } + + public override void Shutdown() + { + base.Shutdown(); + _overlay.RemoveOverlay(); + } +} \ No newline at end of file diff --git a/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs b/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs index ee217771d49..83f2450539f 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs @@ -4,19 +4,25 @@ * See AGPLv3.txt for details. */ +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; + namespace Content.Shared.SegmentedEntity { /// /// Controls initialization of any Multi-segmented entity /// - [RegisterComponent] + [RegisterComponent, NetworkedComponent] + [AutoGenerateComponentState] public sealed partial class SegmentedEntityComponent : Component { /// /// A list of each UID attached to the Lamia, in order of spawn /// [DataField("segments")] - public List Segments = new(); + [AutoNetworkedField] + public List Segments = new(); /// /// A clamped variable that represents the number of segments to be spawned @@ -24,6 +30,18 @@ public sealed partial class SegmentedEntityComponent : Component [DataField("numberOfSegments")] public int NumberOfSegments = 18; + /// + /// How wide the initial segment should be. + /// + [DataField("initialRadius")] + public float InitialRadius = 0.3f; + + /// + /// Texture of the segment. + /// + [DataField("texturePath", required: true)] + public string TexturePath; + /// /// If UseTaperSystem is true, this constant represents the rate at which a segmented entity will taper towards the tip. Tapering is on a logarithmic scale, and will asymptotically approach 0. /// @@ -39,11 +57,17 @@ public sealed partial class SegmentedEntityComponent : Component /// /// Represents the segment prototype to be spawned /// - [DataField("SegmentId")] + [DataField("segmentId")] public string SegmentId = "LamiaSegment"; /// - /// Toggles the tapering system on and off. When false, segmented entities will have a constant width. + /// How much to slim each successive segment. + /// + [DataField("slimFactor")] + public float SlimFactor = 0.93f; + + /// + /// Set to 1f for constant width /// [DataField("useTaperSystem")] public bool UseTaperSystem = true; diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs deleted file mode 100644 index f1e6a202115..00000000000 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs +++ /dev/null @@ -1,18 +0,0 @@ -/* -* Delta-V - This file is licensed under AGPLv3 -* Copyright (c) 2024 Delta-V Contributors -* See AGPLv3.txt for details. -*/ - -using Robust.Shared.Serialization; - -namespace Content.Shared.SegmentedEntity -{ - [Serializable, NetSerializable] - public enum SegmentedEntitySegmentVisualLayers - { - Tail, - Armor, - ArmorRsi, - } -} diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index 497dd31d595..3ff7002fcfa 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -2,7 +2,6 @@ using Content.Shared.Damage; using Content.Shared.Explosion; using Content.Shared.Humanoid; -using Content.Shared.Humanoid.Markings; using Content.Shared.Clothing.Components; using Content.Shared.Inventory.Events; using Content.Shared.Tag; @@ -14,15 +13,14 @@ using Robust.Shared.Physics.Components; using System.Numerics; using Robust.Shared.Network; +using Robust.Shared.GameStates; namespace Content.Shared.SegmentedEntity { public sealed partial class LamiaSystem : EntitySystem { [Dependency] private readonly TagSystem _tagSystem = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; - [Dependency] private readonly SharedHumanoidAppearanceSystem _humanoid = default!; [Dependency] private readonly SharedJointSystem _jointSystem = default!; [Dependency] private readonly INetManager _net = default!; @@ -49,7 +47,6 @@ public override void Initialize() SubscribeLocalEvent(OnSnekBoom); SubscribeLocalEvent(HandleDamageTransfer); SubscribeLocalEvent(HandleSegmentDamage); - SubscribeLocalEvent(OnSegmentSpawned); } public override void Update(float frameTime) { @@ -108,7 +105,7 @@ private void OnShutdown(EntityUid uid, SegmentedEntityComponent component, Compo foreach (var segment in component.Segments) { - QueueDel(segment); + QueueDel(GetEntity(segment)); } component.Segments.Clear(); @@ -141,7 +138,7 @@ public void OnStoreSnekAttempt(EntityUid uid, SegmentedEntityComponent comp, ref private void OnJointRemoved(EntityUid uid, SegmentedEntityComponent component, JointRemovedEvent args) { - if (!component.Segments.Contains(args.OtherEntity)) + if (!component.Segments.Contains(GetNetEntity(args.OtherEntity))) return; DeleteSegments(component); @@ -153,7 +150,7 @@ private void DeleteSegments(SegmentedEntityComponent component) return; //Client is not allowed to predict QueueDel, it'll throw an error(but won't crash in Release build) foreach (var segment in component.Segments) - QueueDel(segment); + QueueDel(GetEntity(segment)); component.Segments.Clear(); } @@ -182,6 +179,8 @@ private void SpawnSegments(EntityUid uid, SegmentedEntityComponent component) addTo = segment; i++; } + + Dirty(uid, component); } private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, SegmentedEntityComponent segmentedComponent, int segmentNumber) @@ -235,41 +234,10 @@ private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, Segmente EnsureComp(segment); //Not temporary, segments must never be allowed to go through portals for physics limitation reasons _segments.Enqueue((segmentComponent, parentuid)); - segmentedComponent.Segments.Add(segment); + segmentedComponent.Segments.Add(GetNetEntity(segment)); return segment; } - /// - /// Handles transferring marking selections to the tail segments. Every tail marking must be repeated 2 times in order for this script to work. - /// - /// - /// - /// - // TODO: Please for the love of god don't make me write a test to validate that every marking also has its matching segment states. - // Future contributors will just find out when their game crashes because they didn't make a marking-segment. - private void OnSegmentSpawned(EntityUid uid, SegmentedEntitySegmentComponent component, SegmentSpawnedEvent args) - { - component.Lamia = args.Lamia; - - if (!TryComp(uid, out var species)) return; - if (!TryComp(args.Lamia, out var humanoid)) return; - if (!TryComp(uid, out var appearance)) return; - var humanoidFactor = (humanoid.Height + humanoid.Width) / 2; - - _appearance.SetData(uid, ScaleVisuals.Scale, component.ScaleFactor * humanoidFactor, appearance); - - if (humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings)) - { - foreach (var markings in tailMarkings) - { - var segmentId = species.Species; - var markingId = markings.MarkingId; - string segmentmarking = $"{markingId}-{segmentId}"; - _humanoid.AddMarking(uid, segmentmarking, markings.MarkingColors); - } - } - } - private void HandleSegmentDamage(EntityUid uid, SegmentedEntitySegmentComponent component, DamageModifyEvent args) { if (args.Origin == component.Lamia) @@ -297,13 +265,7 @@ private void OnDidEquipEvent(EntityUid equipee, SegmentedEntityComponent compone if (!TryComp(args.Equipment, out var clothing)) return; if (args.Slot == "outerClothing" && _tagSystem.HasTag(args.Equipment, LamiaHardsuitTag)) { - foreach (var uid in component.Segments) - { - if (!TryComp(uid, out var appearance)) return; - _appearance.SetData(uid, SegmentedEntitySegmentVisualLayers.Armor, true, appearance); - if (clothing.RsiPath == null) return; - _appearance.SetData(uid, SegmentedEntitySegmentVisualLayers.ArmorRsi, clothing.RsiPath, appearance); - } + // TODO: Switch segment sprite } } @@ -316,11 +278,7 @@ private void OnDidUnequipEvent(EntityUid equipee, SegmentedEntityComponent compo { if (args.Slot == "outerClothing" && _tagSystem.HasTag(args.Equipment, LamiaHardsuitTag)) { - foreach (var uid in component.Segments) - { - if (!TryComp(uid, out var appearance)) return; - _appearance.SetData(uid, SegmentedEntitySegmentVisualLayers.Armor, false, appearance); - } + // TODO: Revert to default segment sprite } } @@ -331,7 +289,7 @@ private void OnShootHitscan(EntityUid uid, SegmentedEntityComponent component, r var entityList = new List(); foreach (var entity in args.RayCastResults) { - if (!component.Segments.Contains(entity.HitEntity)) + if (!component.Segments.Contains(GetNetEntity(entity.HitEntity))) entityList.Add(entity); } args.RayCastResults = entityList; diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml index eb8d0f03f0d..49951d78421 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml @@ -61,6 +61,7 @@ noRot: true drawdepth: Mobs scale: 1, 1 + offset: 0, 0.4 layers: #TODO: manually fix these layers - map: [ "enum.HumanoidVisualLayers.Chest" ] color: "#e8b59b" @@ -196,6 +197,7 @@ - MobLayer - type: SegmentedEntity numberOfSegments: 18 + texturePath: /Textures/Nyanotrasen/Mobs/Species/lamia.rsi/segment.png - type: Speech speechSounds: Alto - type: Vocal diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml index 0383143c269..f5fad8c21cb 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml @@ -9,7 +9,6 @@ components: - type: Damageable - type: StandingState - - type: Appearance - type: Clickable - type: InteractionOutline - type: PsionicInsulation #Not a brain, target the lamia instead @@ -29,7 +28,6 @@ - MobLayer - type: Transform anchored: false - - type: SegmentedEntitySegmentVisuals - type: Tag tags: - HideContextMenu @@ -45,17 +43,7 @@ description: A tail segment, hopefully attached to a lamia. components: - type: Sprite - sprite: Nyanotrasen/Mobs/Species/lamia.rsi - drawdepth: SmallMobs - layers: - - map: [ "enum.HumanoidVisualLayers.Tail" ] - - map: [ "enum.SegmentedEntitySegmentVisualLayers.Armor" ] - sprite: Clothing/OuterClothing/Hardsuits/basic.rsi - state: segment - visible: false - - type: Clickable - type: Tag tags: + - HideContextMenu - DoorBumpOpener - - type: HumanoidAppearance - species: LamiaSegment diff --git a/Resources/Prototypes/DeltaV/Species/lamia.yml b/Resources/Prototypes/DeltaV/Species/lamia.yml index a6cfbf90fe1..ed2ff0448ac 100644 --- a/Resources/Prototypes/DeltaV/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Species/lamia.yml @@ -17,19 +17,6 @@ sexes: - Female -- type: species - id: LamiaSegment - name: LamiaSegment - roundStart: false - prototype: LamiaSegment - dollPrototype: MobLamiaDummy - sprites: MobLamiaSegmentSprites - markingLimits: MobLamiaSegmentMarkingLimits - skinColoration: HumanToned - sexes: - - Female - - - type: markingPoints id: MobLamiaMarkingLimits points: @@ -41,13 +28,6 @@ required: true defaultMarkings: [ LamiaBottom ] -- type: markingPoints - id: MobLamiaSegmentMarkingLimits - points: - Tail: - points: 1 - required: false - - type: speciesBaseSprites id: MobLamiaSprites @@ -61,8 +41,3 @@ LHand: MobHumanLHand RHand: MobHumanRHand Tail: MobHumanoidAnyMarking - -- type: speciesBaseSprites - id: MobLamiaSegmentSprites - sprites: - Tail: MobHumanoidAnyMarking diff --git a/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json index ebfd0e2dc7b..01a2143a397 100644 --- a/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json +++ b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json @@ -10,6 +10,9 @@ { "name": "placeholder" }, + { + "name": "segment" + }, { "name": "bottom", "directions": 4 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/segment.png b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..09fa419f4594c8c4194b2aa2347ce7ca993f6ab2 GIT binary patch literal 4418 zcmeHKe^3EbHu~^5u-P^n4ZZDktxZ}qOryLMPY$|)Z?_lMAdAG+M zr1%2?!RD&Y#6%)VY82ZP!L(||iinjYgsQ=@LNze~87I{mD;*lGm1^Ja0YaOZ4l~Vv z+|1s-{l3rl^SxOPwi@4jP0t{k zpX>N%x&7vEVq(IKAGt2o7Z#j!=?bsfG(U~i4pUz*?ccDnAvA5(`tz>XuN@XyL!zbr4HVtn zT-}U@OVQrwwY%cQOA=?q*8WZT)cLe^_tU?IJ$nBa2Ud3~_OI>wdHVTP#L1&vTYuw@ zpVTZcd48#$`?FMb!#m!Lfitt~*57;lWW_ssOSwIw!UF8GrF(j}b@_8lgVLzW?q3I8 zS%7bf%e{bV!(VP1YU;Q8flOW)H*g#cLzaGizF_8E^7CnB!Ql&!fNc#&k1swYzP94E zZ$5tUqZ%z+!kTWML*{(79<8ZNt4|1BRrLvdusZr7yL;lksX91x-P0F#uq5VeQ_Ew|tdaXPtSg5({lpU2eEPwug|9)_GYxH_i2a_9H3GJPzpzc9x6bB$FPAD|ET7xU{WJ-+!*FgDkXc>ohFs!BQf1&xsgC+!~ zJcD(^@yi5LU`6GE&4I7LruPV1zg!SD=e7rtC!k?j9rMI%;RX zr4&e|*$m4^Eg@741LqIcl^Q3N5)i-4b1we`A#XO!hsH3@U`!3W9X@UDGG)WY z{bkU!fJ@EibPgMTDo2FFB4AK2%N3*iVR7B|$R9w^VS_$7FTdm7K2zj5G+g)I%_r+D z?H2})6xN;gZ}j&@zrANCA)lKPbnc6Sy_=H35u5;uH4xZpwgW7_e3;)f~KLw!3#{}p>!j}K(m zR$a_^@G6qjQ(c=|y>GLqtNPOR6X9q4e`-x^oS`-E^IsQ Date: Wed, 2 Oct 2024 21:25:57 -0400 Subject: [PATCH 66/73] Update lamia.yml --- Resources/Prototypes/DeltaV/Entities/Mobs/Player/lamia.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/lamia.yml index 1f5397e5dc3..5913b31dd1f 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/lamia.yml @@ -36,4 +36,3 @@ - type: NpcFactionMember factions: - NanoTrasen - - type: PotentialPsionic From 98e13041b751cc6f5ad5214758d0d5ecff9b5c35 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 29 Oct 2024 00:54:27 -0400 Subject: [PATCH 67/73] Revert "Make Lamiae Out of Tris Instead of Sprites (#673)" This reverts commit 933fc2a9cffd759b6c29b23905bcc1ae92e9927c. --- .../DeltaV/Lamiae/ClientLamiaVisuals.cs | 42 ++++ .../Lamiae/LamiaSegmentVisualsComponent.cs | 11 ++ Content.Client/DeltaV/Lamiae/SnakeOverlay.cs | 184 ------------------ .../DeltaV/Lamiae/SnakeOverlaySystem.cs | 32 --- .../SegmentedEntityComponent.cs | 32 +-- .../SegmentedEntitySegmentVisuals.cs | 18 ++ .../SegmentedEntity/SegmentedEntitySystem.cs | 62 +++++- .../DeltaV/Entities/Mobs/Species/lamia.yml | 2 - .../Objects/Specific/Species/lamia.yml | 14 +- Resources/Prototypes/DeltaV/Species/lamia.yml | 25 +++ .../Mobs/Species/lamia.rsi/meta.json | 3 - .../Mobs/Species/lamia.rsi/segment.png | Bin 4418 -> 0 bytes 12 files changed, 165 insertions(+), 260 deletions(-) create mode 100644 Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs create mode 100644 Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs delete mode 100644 Content.Client/DeltaV/Lamiae/SnakeOverlay.cs delete mode 100644 Content.Client/DeltaV/Lamiae/SnakeOverlaySystem.cs create mode 100644 Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs delete mode 100644 Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/segment.png diff --git a/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs b/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs new file mode 100644 index 00000000000..046f6a7a3c3 --- /dev/null +++ b/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs @@ -0,0 +1,42 @@ +/* +* Delta-V - This file is licensed under AGPLv3 +* Copyright (c) 2024 Delta-V Contributors +* See AGPLv3.txt for details. +*/ + +using Robust.Client.GameObjects; +using System.Numerics; +using Content.Shared.SegmentedEntity; + +namespace Content.Client.DeltaV.Lamiae; + +public sealed class ClientLamiaVisualSystem : VisualizerSystem +{ + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAppearanceChange); + } + private void OnAppearanceChange(EntityUid uid, SegmentedEntitySegmentComponent component, ref AppearanceChangeEvent args) + { + if (args.Sprite == null) return; + + if (AppearanceSystem.TryGetData(uid, ScaleVisuals.Scale, out var scale) && TryComp(uid, out var sprite)) + { + sprite.Scale = new Vector2(scale, scale); + } + + if (AppearanceSystem.TryGetData(uid, SegmentedEntitySegmentVisualLayers.Armor, out var worn) + && AppearanceSystem.TryGetData(uid, SegmentedEntitySegmentVisualLayers.ArmorRsi, out var path)) + { + var valid = !string.IsNullOrWhiteSpace(path); + if (valid) + { + args.Sprite.LayerSetRSI(SegmentedEntitySegmentVisualLayers.Armor, path); + } + args.Sprite.LayerSetVisible(SegmentedEntitySegmentVisualLayers.Armor, worn); + } + } +} diff --git a/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs b/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs new file mode 100644 index 00000000000..e2c1139f234 --- /dev/null +++ b/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs @@ -0,0 +1,11 @@ +/* +* Delta-V - This file is licensed under AGPLv3 +* Copyright (c) 2024 Delta-V Contributors +* See AGPLv3.txt for details. +*/ + +namespace Content.Client.DeltaV.Lamiae; + +[RegisterComponent] +public sealed partial class SegmentedEntitySegmentVisualsComponent : Component +{} diff --git a/Content.Client/DeltaV/Lamiae/SnakeOverlay.cs b/Content.Client/DeltaV/Lamiae/SnakeOverlay.cs deleted file mode 100644 index a8ed98c3369..00000000000 --- a/Content.Client/DeltaV/Lamiae/SnakeOverlay.cs +++ /dev/null @@ -1,184 +0,0 @@ -/* -* This file is licensed under AGPLv3 -* Copyright (c) 2024 Rane -* See AGPLv3.txt for details. -*/ - -using Content.Shared.SegmentedEntity; -using Content.Shared.Humanoid; -using Content.Shared.Humanoid.Markings; -using Content.Client.Resources; -using Robust.Client.ResourceManagement; -using Robust.Client.Graphics; -using Robust.Shared.Enums; -using System.Numerics; -using System.Linq; - - -namespace Content.Client.DeltaV.Lamiae; - -/// -/// This draws lamia segments directly from polygons instead of sprites. This is a very novel approach as of the time this is being written (August 2024) but it wouldn't surprise me -/// if there's a better way to do this at some point. Currently we have a very heavy restriction on the tools we can make, forcing me to make several helpers that may be redundant later. -/// This will be overcommented because I know you haven't seen code like this before and you might want to copy it. -/// This is an expansion on some techniques I discovered in (https://github.com/Elijahrane/Delta-v/blob/49d76c437740eab79fc622ab50d628b926e6ddcb/Content.Client/DeltaV/Arcade/S3D/Renderer/S3DRenderer.cs) -/// -public sealed class SnakeOverlay : Overlay -{ - private readonly IResourceCache _resourceCache; - private readonly IEntityManager _entManager; - private readonly SharedTransformSystem _transform; - private readonly SharedHumanoidAppearanceSystem _humanoid = default!; - - // Look through these carefully. WorldSpace is useful for debugging. Note that this defaults to "screen space" which breaks when you try and get the world handle. - public override OverlaySpace Space => OverlaySpace.WorldSpaceEntities; - - // Overlays are strange and you need this pattern where you define readonly deps above, and then make a constructor with this pattern. Anything that creates this overlay will then - // have to provide all the deps. - public SnakeOverlay(IEntityManager entManager, IResourceCache resourceCache) - { - _resourceCache = resourceCache; - // we get ent manager from SnakeOverlaySystem turning this on and passing it - _entManager = entManager; - // with ent manager we can fetch our other entity systems - _transform = _entManager.EntitySysManager.GetEntitySystem(); - _humanoid = _entManager.EntitySysManager.GetEntitySystem(); - - // draw at drawdepth 3 - ZIndex = 3; - } - - // This step occurs each frame. For some overlays you may want to conisder limiting how often they update, but for player entities that move around fast we'll just do it every frame. - protected override void Draw(in OverlayDrawArgs args) - { - // load the handle, the "pen" we draw with - var handle = args.WorldHandle; - - // Get all lamiae the client knows of and their transform in a way we can enumerate over - var enumerator = _entManager.AllEntityQueryEnumerator(); - - // I go over the collection above, pulling out an EntityUid and the two components I need for each. - while (enumerator.MoveNext(out var uid, out var lamia, out var xform)) - { - // Skip ones that are off-map. "Map" in this context means interconnected stuff you can travel between by moving, rather than needing e.g. FTL to load a new map. - if (xform.MapID != args.MapId) - continue; - - // Skip ones where they are not loaded properly, uninitialized, or w/e - if (lamia.Segments.Count < lamia.NumberOfSegments) - { - _entManager.Dirty(uid, lamia); // pls give me an update... - continue; - } - - // By the way, there's a hack to mitigate overdraw somewhat. Check out whatever is going on with the variable called "bounds" in DoAfterOverlay. - // I won't do it here because (1) it's ugly and (2) theoretically these entities can be fucking huge and you'll see the tail end of them when they are way off screen. - // On a PVS level I think segmented entities should be all-or-nothing when it comes to PVS range, that is you either load all of their segments or none. - - // Color.White is drawing without modifying color. For clothed tails, we should use White. For skin, we should use the color of the marking. - // TODO: Better way to cache this - if (_entManager.TryGetComponent(uid, out var humanoid)) - { - if (humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings)) - { - var col = tailMarkings.First().MarkingColors.First(); - DrawLamia(handle, lamia, col); - } - } - else - { - DrawLamia(handle, lamia, Color.White); - } - } - } - - // This is where we do the actual drawing. - private void DrawLamia(DrawingHandleWorld handle, SegmentedEntityComponent lamia, Color color) - { - // We're going to store all our verticies in here and then draw them - List verts = new List(); - - // Radius of the initial segment - float radius = lamia.InitialRadius; - - // We're storing the left and right verticies of the last segment so we can start drawing from there without gaps - Vector2? lastPtCW = null; - Vector2? lastPtCCW = null; - - var tex = _resourceCache.GetTexture(lamia.TexturePath); - - int i = 1; - // do each segment except the last one normally - while (i < lamia.Segments.Count - 1) - { - // get centerpoints of last segment and this one - var origin = _transform.GetWorldPosition(_entManager.GetEntity(lamia.Segments[i - 1])); - var destination = _transform.GetWorldPosition(_entManager.GetEntity(lamia.Segments[i])); - - // get direction between the two points and normalize it - var connectorVec = destination - origin; - connectorVec = connectorVec.Normalized(); - - //get one rotated 90 degrees clockwise - var offsetVecCW = new Vector2(connectorVec.Y, 0 - connectorVec.X); - - //and counterclockwise - var offsetVecCCW = new Vector2(0 - connectorVec.Y, connectorVec.X); - - /// tri 1: line across first segment and corner of second - if (lastPtCW == null) - { - verts.Add(new DrawVertexUV2D(origin + offsetVecCW * radius, Vector2.Zero)); - } - else - { - verts.Add(new DrawVertexUV2D((Vector2) lastPtCW, Vector2.Zero)); - } - - if (lastPtCCW == null) - { - verts.Add(new DrawVertexUV2D(origin + offsetVecCCW * radius, new Vector2(1, 0))); - } - else - { - verts.Add(new DrawVertexUV2D((Vector2) lastPtCCW, new Vector2(1, 0))); - } - - verts.Add(new DrawVertexUV2D(destination + offsetVecCW * radius, new Vector2(0, 1))); - - // tri 2: line across second segment and corner of first - if (lastPtCCW == null) - { - verts.Add(new DrawVertexUV2D(origin + offsetVecCCW * radius, new Vector2(1, 0))); - } - else - { - verts.Add(new DrawVertexUV2D((Vector2) lastPtCCW, new Vector2(1, 0))); - } - - lastPtCW = destination + offsetVecCW * radius; - verts.Add(new DrawVertexUV2D((Vector2) lastPtCW, new Vector2(0, 1))); - lastPtCCW = destination + offsetVecCCW * radius; - verts.Add(new DrawVertexUV2D((Vector2) lastPtCCW, new Vector2(1, 1))); - - // slim down a bit for next segment - radius *= lamia.SlimFactor; - - i++; - } - - // draw tail (1 tri) - if (lastPtCW != null && lastPtCCW != null) - { - verts.Add(new DrawVertexUV2D((Vector2) lastPtCW, new Vector2(0, 0))); - verts.Add(new DrawVertexUV2D((Vector2) lastPtCCW, new Vector2(1, 0))); - - var destination = _transform.GetWorldPosition(_entManager.GetEntity(lamia.Segments.Last())); - - verts.Add(new DrawVertexUV2D(destination, new Vector2(0.5f, 1f))); - } - - // Draw all of the triangles we just pit in at once - handle.DrawPrimitives(DrawPrimitiveTopology.TriangleList, texture: tex, verts.ToArray().AsSpan(), color); - } -} \ No newline at end of file diff --git a/Content.Client/DeltaV/Lamiae/SnakeOverlaySystem.cs b/Content.Client/DeltaV/Lamiae/SnakeOverlaySystem.cs deleted file mode 100644 index 6be1a18dc14..00000000000 --- a/Content.Client/DeltaV/Lamiae/SnakeOverlaySystem.cs +++ /dev/null @@ -1,32 +0,0 @@ -/* -* This file is licensed under AGPLv3 -* Copyright (c) 2024 Rane -* See AGPLv3.txt for details. -*/ - -using Robust.Client.Graphics; -using Robust.Client.ResourceManagement; - -namespace Content.Client.DeltaV.Lamiae; - -/// -/// This system turns on our always-on overlay. I have no opinion on this design pattern or the existence of this file. -/// It also fetches the deps it needs. -/// -public sealed class SnakeOverlaySystem : EntitySystem -{ - [Dependency] private readonly IOverlayManager _overlay = default!; - [Dependency] private readonly IResourceCache _resourceCache = default!; - - public override void Initialize() - { - base.Initialize(); - _overlay.AddOverlay(new SnakeOverlay(EntityManager, _resourceCache)); - } - - public override void Shutdown() - { - base.Shutdown(); - _overlay.RemoveOverlay(); - } -} \ No newline at end of file diff --git a/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs b/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs index 83f2450539f..ee217771d49 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs @@ -4,25 +4,19 @@ * See AGPLv3.txt for details. */ -using Robust.Shared.GameStates; -using Robust.Shared.Serialization; -using Robust.Shared.Utility; - namespace Content.Shared.SegmentedEntity { /// /// Controls initialization of any Multi-segmented entity /// - [RegisterComponent, NetworkedComponent] - [AutoGenerateComponentState] + [RegisterComponent] public sealed partial class SegmentedEntityComponent : Component { /// /// A list of each UID attached to the Lamia, in order of spawn /// [DataField("segments")] - [AutoNetworkedField] - public List Segments = new(); + public List Segments = new(); /// /// A clamped variable that represents the number of segments to be spawned @@ -30,18 +24,6 @@ public sealed partial class SegmentedEntityComponent : Component [DataField("numberOfSegments")] public int NumberOfSegments = 18; - /// - /// How wide the initial segment should be. - /// - [DataField("initialRadius")] - public float InitialRadius = 0.3f; - - /// - /// Texture of the segment. - /// - [DataField("texturePath", required: true)] - public string TexturePath; - /// /// If UseTaperSystem is true, this constant represents the rate at which a segmented entity will taper towards the tip. Tapering is on a logarithmic scale, and will asymptotically approach 0. /// @@ -57,17 +39,11 @@ public sealed partial class SegmentedEntityComponent : Component /// /// Represents the segment prototype to be spawned /// - [DataField("segmentId")] + [DataField("SegmentId")] public string SegmentId = "LamiaSegment"; /// - /// How much to slim each successive segment. - /// - [DataField("slimFactor")] - public float SlimFactor = 0.93f; - - /// - /// Set to 1f for constant width + /// Toggles the tapering system on and off. When false, segmented entities will have a constant width. /// [DataField("useTaperSystem")] public bool UseTaperSystem = true; diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs new file mode 100644 index 00000000000..f1e6a202115 --- /dev/null +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs @@ -0,0 +1,18 @@ +/* +* Delta-V - This file is licensed under AGPLv3 +* Copyright (c) 2024 Delta-V Contributors +* See AGPLv3.txt for details. +*/ + +using Robust.Shared.Serialization; + +namespace Content.Shared.SegmentedEntity +{ + [Serializable, NetSerializable] + public enum SegmentedEntitySegmentVisualLayers + { + Tail, + Armor, + ArmorRsi, + } +} diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index 3ff7002fcfa..497dd31d595 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -2,6 +2,7 @@ using Content.Shared.Damage; using Content.Shared.Explosion; using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Markings; using Content.Shared.Clothing.Components; using Content.Shared.Inventory.Events; using Content.Shared.Tag; @@ -13,14 +14,15 @@ using Robust.Shared.Physics.Components; using System.Numerics; using Robust.Shared.Network; -using Robust.Shared.GameStates; namespace Content.Shared.SegmentedEntity { public sealed partial class LamiaSystem : EntitySystem { [Dependency] private readonly TagSystem _tagSystem = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; + [Dependency] private readonly SharedHumanoidAppearanceSystem _humanoid = default!; [Dependency] private readonly SharedJointSystem _jointSystem = default!; [Dependency] private readonly INetManager _net = default!; @@ -47,6 +49,7 @@ public override void Initialize() SubscribeLocalEvent(OnSnekBoom); SubscribeLocalEvent(HandleDamageTransfer); SubscribeLocalEvent(HandleSegmentDamage); + SubscribeLocalEvent(OnSegmentSpawned); } public override void Update(float frameTime) { @@ -105,7 +108,7 @@ private void OnShutdown(EntityUid uid, SegmentedEntityComponent component, Compo foreach (var segment in component.Segments) { - QueueDel(GetEntity(segment)); + QueueDel(segment); } component.Segments.Clear(); @@ -138,7 +141,7 @@ public void OnStoreSnekAttempt(EntityUid uid, SegmentedEntityComponent comp, ref private void OnJointRemoved(EntityUid uid, SegmentedEntityComponent component, JointRemovedEvent args) { - if (!component.Segments.Contains(GetNetEntity(args.OtherEntity))) + if (!component.Segments.Contains(args.OtherEntity)) return; DeleteSegments(component); @@ -150,7 +153,7 @@ private void DeleteSegments(SegmentedEntityComponent component) return; //Client is not allowed to predict QueueDel, it'll throw an error(but won't crash in Release build) foreach (var segment in component.Segments) - QueueDel(GetEntity(segment)); + QueueDel(segment); component.Segments.Clear(); } @@ -179,8 +182,6 @@ private void SpawnSegments(EntityUid uid, SegmentedEntityComponent component) addTo = segment; i++; } - - Dirty(uid, component); } private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, SegmentedEntityComponent segmentedComponent, int segmentNumber) @@ -234,10 +235,41 @@ private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, Segmente EnsureComp(segment); //Not temporary, segments must never be allowed to go through portals for physics limitation reasons _segments.Enqueue((segmentComponent, parentuid)); - segmentedComponent.Segments.Add(GetNetEntity(segment)); + segmentedComponent.Segments.Add(segment); return segment; } + /// + /// Handles transferring marking selections to the tail segments. Every tail marking must be repeated 2 times in order for this script to work. + /// + /// + /// + /// + // TODO: Please for the love of god don't make me write a test to validate that every marking also has its matching segment states. + // Future contributors will just find out when their game crashes because they didn't make a marking-segment. + private void OnSegmentSpawned(EntityUid uid, SegmentedEntitySegmentComponent component, SegmentSpawnedEvent args) + { + component.Lamia = args.Lamia; + + if (!TryComp(uid, out var species)) return; + if (!TryComp(args.Lamia, out var humanoid)) return; + if (!TryComp(uid, out var appearance)) return; + var humanoidFactor = (humanoid.Height + humanoid.Width) / 2; + + _appearance.SetData(uid, ScaleVisuals.Scale, component.ScaleFactor * humanoidFactor, appearance); + + if (humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings)) + { + foreach (var markings in tailMarkings) + { + var segmentId = species.Species; + var markingId = markings.MarkingId; + string segmentmarking = $"{markingId}-{segmentId}"; + _humanoid.AddMarking(uid, segmentmarking, markings.MarkingColors); + } + } + } + private void HandleSegmentDamage(EntityUid uid, SegmentedEntitySegmentComponent component, DamageModifyEvent args) { if (args.Origin == component.Lamia) @@ -265,7 +297,13 @@ private void OnDidEquipEvent(EntityUid equipee, SegmentedEntityComponent compone if (!TryComp(args.Equipment, out var clothing)) return; if (args.Slot == "outerClothing" && _tagSystem.HasTag(args.Equipment, LamiaHardsuitTag)) { - // TODO: Switch segment sprite + foreach (var uid in component.Segments) + { + if (!TryComp(uid, out var appearance)) return; + _appearance.SetData(uid, SegmentedEntitySegmentVisualLayers.Armor, true, appearance); + if (clothing.RsiPath == null) return; + _appearance.SetData(uid, SegmentedEntitySegmentVisualLayers.ArmorRsi, clothing.RsiPath, appearance); + } } } @@ -278,7 +316,11 @@ private void OnDidUnequipEvent(EntityUid equipee, SegmentedEntityComponent compo { if (args.Slot == "outerClothing" && _tagSystem.HasTag(args.Equipment, LamiaHardsuitTag)) { - // TODO: Revert to default segment sprite + foreach (var uid in component.Segments) + { + if (!TryComp(uid, out var appearance)) return; + _appearance.SetData(uid, SegmentedEntitySegmentVisualLayers.Armor, false, appearance); + } } } @@ -289,7 +331,7 @@ private void OnShootHitscan(EntityUid uid, SegmentedEntityComponent component, r var entityList = new List(); foreach (var entity in args.RayCastResults) { - if (!component.Segments.Contains(GetNetEntity(entity.HitEntity))) + if (!component.Segments.Contains(entity.HitEntity)) entityList.Add(entity); } args.RayCastResults = entityList; diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml index 49951d78421..eb8d0f03f0d 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml @@ -61,7 +61,6 @@ noRot: true drawdepth: Mobs scale: 1, 1 - offset: 0, 0.4 layers: #TODO: manually fix these layers - map: [ "enum.HumanoidVisualLayers.Chest" ] color: "#e8b59b" @@ -197,7 +196,6 @@ - MobLayer - type: SegmentedEntity numberOfSegments: 18 - texturePath: /Textures/Nyanotrasen/Mobs/Species/lamia.rsi/segment.png - type: Speech speechSounds: Alto - type: Vocal diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml index f5fad8c21cb..0383143c269 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml @@ -9,6 +9,7 @@ components: - type: Damageable - type: StandingState + - type: Appearance - type: Clickable - type: InteractionOutline - type: PsionicInsulation #Not a brain, target the lamia instead @@ -28,6 +29,7 @@ - MobLayer - type: Transform anchored: false + - type: SegmentedEntitySegmentVisuals - type: Tag tags: - HideContextMenu @@ -43,7 +45,17 @@ description: A tail segment, hopefully attached to a lamia. components: - type: Sprite + sprite: Nyanotrasen/Mobs/Species/lamia.rsi + drawdepth: SmallMobs + layers: + - map: [ "enum.HumanoidVisualLayers.Tail" ] + - map: [ "enum.SegmentedEntitySegmentVisualLayers.Armor" ] + sprite: Clothing/OuterClothing/Hardsuits/basic.rsi + state: segment + visible: false + - type: Clickable - type: Tag tags: - - HideContextMenu - DoorBumpOpener + - type: HumanoidAppearance + species: LamiaSegment diff --git a/Resources/Prototypes/DeltaV/Species/lamia.yml b/Resources/Prototypes/DeltaV/Species/lamia.yml index ed2ff0448ac..a6cfbf90fe1 100644 --- a/Resources/Prototypes/DeltaV/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Species/lamia.yml @@ -17,6 +17,19 @@ sexes: - Female +- type: species + id: LamiaSegment + name: LamiaSegment + roundStart: false + prototype: LamiaSegment + dollPrototype: MobLamiaDummy + sprites: MobLamiaSegmentSprites + markingLimits: MobLamiaSegmentMarkingLimits + skinColoration: HumanToned + sexes: + - Female + + - type: markingPoints id: MobLamiaMarkingLimits points: @@ -28,6 +41,13 @@ required: true defaultMarkings: [ LamiaBottom ] +- type: markingPoints + id: MobLamiaSegmentMarkingLimits + points: + Tail: + points: 1 + required: false + - type: speciesBaseSprites id: MobLamiaSprites @@ -41,3 +61,8 @@ LHand: MobHumanLHand RHand: MobHumanRHand Tail: MobHumanoidAnyMarking + +- type: speciesBaseSprites + id: MobLamiaSegmentSprites + sprites: + Tail: MobHumanoidAnyMarking diff --git a/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json index 01a2143a397..ebfd0e2dc7b 100644 --- a/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json +++ b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json @@ -10,9 +10,6 @@ { "name": "placeholder" }, - { - "name": "segment" - }, { "name": "bottom", "directions": 4 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/segment.png b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/segment.png deleted file mode 100644 index 09fa419f4594c8c4194b2aa2347ce7ca993f6ab2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4418 zcmeHKe^3EbHu~^5u-P^n4ZZDktxZ}qOryLMPY$|)Z?_lMAdAG+M zr1%2?!RD&Y#6%)VY82ZP!L(||iinjYgsQ=@LNze~87I{mD;*lGm1^Ja0YaOZ4l~Vv z+|1s-{l3rl^SxOPwi@4jP0t{k zpX>N%x&7vEVq(IKAGt2o7Z#j!=?bsfG(U~i4pUz*?ccDnAvA5(`tz>XuN@XyL!zbr4HVtn zT-}U@OVQrwwY%cQOA=?q*8WZT)cLe^_tU?IJ$nBa2Ud3~_OI>wdHVTP#L1&vTYuw@ zpVTZcd48#$`?FMb!#m!Lfitt~*57;lWW_ssOSwIw!UF8GrF(j}b@_8lgVLzW?q3I8 zS%7bf%e{bV!(VP1YU;Q8flOW)H*g#cLzaGizF_8E^7CnB!Ql&!fNc#&k1swYzP94E zZ$5tUqZ%z+!kTWML*{(79<8ZNt4|1BRrLvdusZr7yL;lksX91x-P0F#uq5VeQ_Ew|tdaXPtSg5({lpU2eEPwug|9)_GYxH_i2a_9H3GJPzpzc9x6bB$FPAD|ET7xU{WJ-+!*FgDkXc>ohFs!BQf1&xsgC+!~ zJcD(^@yi5LU`6GE&4I7LruPV1zg!SD=e7rtC!k?j9rMI%;RX zr4&e|*$m4^Eg@741LqIcl^Q3N5)i-4b1we`A#XO!hsH3@U`!3W9X@UDGG)WY z{bkU!fJ@EibPgMTDo2FFB4AK2%N3*iVR7B|$R9w^VS_$7FTdm7K2zj5G+g)I%_r+D z?H2})6xN;gZ}j&@zrANCA)lKPbnc6Sy_=H35u5;uH4xZpwgW7_e3;)f~KLw!3#{}p>!j}K(m zR$a_^@G6qjQ(c=|y>GLqtNPOR6X9q4e`-x^oS`-E^IsQ Date: Wed, 13 Nov 2024 18:56:02 -0500 Subject: [PATCH 68/73] Update SegmentedEntitySystem.cs --- Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index 497dd31d595..529c9ad03f8 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -340,7 +340,7 @@ private void OnShootHitscan(EntityUid uid, SegmentedEntityComponent component, r private void OnParentChanged(EntityUid uid, SegmentedEntityComponent component, ref EntParentChangedMessage args) { //If the change was NOT to a different map - if (args.OldMapId == args.Transform.MapID) + if (args.OldMapId == args.Transform.MapUid) RespawnSegments(uid, component); } } From eba52fbefe7579416d490880b94a0a2a25b42634 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 13 Nov 2024 19:01:13 -0500 Subject: [PATCH 69/73] Update meta.json --- .../OuterClothing/Hardsuits/syndieelite.rsi/meta.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndieelite.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndieelite.rsi/meta.json index 01063a6bfee..0b252abcaa3 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndieelite.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndieelite.rsi/meta.json @@ -10,6 +10,9 @@ { "name": "icon" }, + { + "name": "segment" + }, { "name": "equipped-OUTERCLOTHING", "directions": 4 @@ -22,6 +25,10 @@ "name": "equipped-OUTERCLOTHING-vox", "directions": 4 }, + { + "name": "equipped-OUTERCLOTHING-lamia", + "directions": 4 + }, { "name": "inhand-left", "directions": 4 From 2efba19c937eb022eab680c787f9d514b765b4f7 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 13 Nov 2024 19:24:05 -0500 Subject: [PATCH 70/73] Revert "Revert "Make Lamiae Out of Tris Instead of Sprites (#673)"" This reverts commit 98e13041b751cc6f5ad5214758d0d5ecff9b5c35. --- .../DeltaV/Lamiae/ClientLamiaVisuals.cs | 42 ---- .../Lamiae/LamiaSegmentVisualsComponent.cs | 11 -- Content.Client/DeltaV/Lamiae/SnakeOverlay.cs | 184 ++++++++++++++++++ .../DeltaV/Lamiae/SnakeOverlaySystem.cs | 32 +++ .../SegmentedEntityComponent.cs | 32 ++- .../SegmentedEntitySegmentVisuals.cs | 18 -- .../SegmentedEntity/SegmentedEntitySystem.cs | 62 +----- .../DeltaV/Entities/Mobs/Species/lamia.yml | 2 + .../Objects/Specific/Species/lamia.yml | 14 +- Resources/Prototypes/DeltaV/Species/lamia.yml | 25 --- .../Mobs/Species/lamia.rsi/meta.json | 3 + .../Mobs/Species/lamia.rsi/segment.png | Bin 0 -> 4418 bytes 12 files changed, 260 insertions(+), 165 deletions(-) delete mode 100644 Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs delete mode 100644 Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs create mode 100644 Content.Client/DeltaV/Lamiae/SnakeOverlay.cs create mode 100644 Content.Client/DeltaV/Lamiae/SnakeOverlaySystem.cs delete mode 100644 Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/segment.png diff --git a/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs b/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs deleted file mode 100644 index 046f6a7a3c3..00000000000 --- a/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs +++ /dev/null @@ -1,42 +0,0 @@ -/* -* Delta-V - This file is licensed under AGPLv3 -* Copyright (c) 2024 Delta-V Contributors -* See AGPLv3.txt for details. -*/ - -using Robust.Client.GameObjects; -using System.Numerics; -using Content.Shared.SegmentedEntity; - -namespace Content.Client.DeltaV.Lamiae; - -public sealed class ClientLamiaVisualSystem : VisualizerSystem -{ - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnAppearanceChange); - } - private void OnAppearanceChange(EntityUid uid, SegmentedEntitySegmentComponent component, ref AppearanceChangeEvent args) - { - if (args.Sprite == null) return; - - if (AppearanceSystem.TryGetData(uid, ScaleVisuals.Scale, out var scale) && TryComp(uid, out var sprite)) - { - sprite.Scale = new Vector2(scale, scale); - } - - if (AppearanceSystem.TryGetData(uid, SegmentedEntitySegmentVisualLayers.Armor, out var worn) - && AppearanceSystem.TryGetData(uid, SegmentedEntitySegmentVisualLayers.ArmorRsi, out var path)) - { - var valid = !string.IsNullOrWhiteSpace(path); - if (valid) - { - args.Sprite.LayerSetRSI(SegmentedEntitySegmentVisualLayers.Armor, path); - } - args.Sprite.LayerSetVisible(SegmentedEntitySegmentVisualLayers.Armor, worn); - } - } -} diff --git a/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs b/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs deleted file mode 100644 index e2c1139f234..00000000000 --- a/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -/* -* Delta-V - This file is licensed under AGPLv3 -* Copyright (c) 2024 Delta-V Contributors -* See AGPLv3.txt for details. -*/ - -namespace Content.Client.DeltaV.Lamiae; - -[RegisterComponent] -public sealed partial class SegmentedEntitySegmentVisualsComponent : Component -{} diff --git a/Content.Client/DeltaV/Lamiae/SnakeOverlay.cs b/Content.Client/DeltaV/Lamiae/SnakeOverlay.cs new file mode 100644 index 00000000000..a8ed98c3369 --- /dev/null +++ b/Content.Client/DeltaV/Lamiae/SnakeOverlay.cs @@ -0,0 +1,184 @@ +/* +* This file is licensed under AGPLv3 +* Copyright (c) 2024 Rane +* See AGPLv3.txt for details. +*/ + +using Content.Shared.SegmentedEntity; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Markings; +using Content.Client.Resources; +using Robust.Client.ResourceManagement; +using Robust.Client.Graphics; +using Robust.Shared.Enums; +using System.Numerics; +using System.Linq; + + +namespace Content.Client.DeltaV.Lamiae; + +/// +/// This draws lamia segments directly from polygons instead of sprites. This is a very novel approach as of the time this is being written (August 2024) but it wouldn't surprise me +/// if there's a better way to do this at some point. Currently we have a very heavy restriction on the tools we can make, forcing me to make several helpers that may be redundant later. +/// This will be overcommented because I know you haven't seen code like this before and you might want to copy it. +/// This is an expansion on some techniques I discovered in (https://github.com/Elijahrane/Delta-v/blob/49d76c437740eab79fc622ab50d628b926e6ddcb/Content.Client/DeltaV/Arcade/S3D/Renderer/S3DRenderer.cs) +/// +public sealed class SnakeOverlay : Overlay +{ + private readonly IResourceCache _resourceCache; + private readonly IEntityManager _entManager; + private readonly SharedTransformSystem _transform; + private readonly SharedHumanoidAppearanceSystem _humanoid = default!; + + // Look through these carefully. WorldSpace is useful for debugging. Note that this defaults to "screen space" which breaks when you try and get the world handle. + public override OverlaySpace Space => OverlaySpace.WorldSpaceEntities; + + // Overlays are strange and you need this pattern where you define readonly deps above, and then make a constructor with this pattern. Anything that creates this overlay will then + // have to provide all the deps. + public SnakeOverlay(IEntityManager entManager, IResourceCache resourceCache) + { + _resourceCache = resourceCache; + // we get ent manager from SnakeOverlaySystem turning this on and passing it + _entManager = entManager; + // with ent manager we can fetch our other entity systems + _transform = _entManager.EntitySysManager.GetEntitySystem(); + _humanoid = _entManager.EntitySysManager.GetEntitySystem(); + + // draw at drawdepth 3 + ZIndex = 3; + } + + // This step occurs each frame. For some overlays you may want to conisder limiting how often they update, but for player entities that move around fast we'll just do it every frame. + protected override void Draw(in OverlayDrawArgs args) + { + // load the handle, the "pen" we draw with + var handle = args.WorldHandle; + + // Get all lamiae the client knows of and their transform in a way we can enumerate over + var enumerator = _entManager.AllEntityQueryEnumerator(); + + // I go over the collection above, pulling out an EntityUid and the two components I need for each. + while (enumerator.MoveNext(out var uid, out var lamia, out var xform)) + { + // Skip ones that are off-map. "Map" in this context means interconnected stuff you can travel between by moving, rather than needing e.g. FTL to load a new map. + if (xform.MapID != args.MapId) + continue; + + // Skip ones where they are not loaded properly, uninitialized, or w/e + if (lamia.Segments.Count < lamia.NumberOfSegments) + { + _entManager.Dirty(uid, lamia); // pls give me an update... + continue; + } + + // By the way, there's a hack to mitigate overdraw somewhat. Check out whatever is going on with the variable called "bounds" in DoAfterOverlay. + // I won't do it here because (1) it's ugly and (2) theoretically these entities can be fucking huge and you'll see the tail end of them when they are way off screen. + // On a PVS level I think segmented entities should be all-or-nothing when it comes to PVS range, that is you either load all of their segments or none. + + // Color.White is drawing without modifying color. For clothed tails, we should use White. For skin, we should use the color of the marking. + // TODO: Better way to cache this + if (_entManager.TryGetComponent(uid, out var humanoid)) + { + if (humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings)) + { + var col = tailMarkings.First().MarkingColors.First(); + DrawLamia(handle, lamia, col); + } + } + else + { + DrawLamia(handle, lamia, Color.White); + } + } + } + + // This is where we do the actual drawing. + private void DrawLamia(DrawingHandleWorld handle, SegmentedEntityComponent lamia, Color color) + { + // We're going to store all our verticies in here and then draw them + List verts = new List(); + + // Radius of the initial segment + float radius = lamia.InitialRadius; + + // We're storing the left and right verticies of the last segment so we can start drawing from there without gaps + Vector2? lastPtCW = null; + Vector2? lastPtCCW = null; + + var tex = _resourceCache.GetTexture(lamia.TexturePath); + + int i = 1; + // do each segment except the last one normally + while (i < lamia.Segments.Count - 1) + { + // get centerpoints of last segment and this one + var origin = _transform.GetWorldPosition(_entManager.GetEntity(lamia.Segments[i - 1])); + var destination = _transform.GetWorldPosition(_entManager.GetEntity(lamia.Segments[i])); + + // get direction between the two points and normalize it + var connectorVec = destination - origin; + connectorVec = connectorVec.Normalized(); + + //get one rotated 90 degrees clockwise + var offsetVecCW = new Vector2(connectorVec.Y, 0 - connectorVec.X); + + //and counterclockwise + var offsetVecCCW = new Vector2(0 - connectorVec.Y, connectorVec.X); + + /// tri 1: line across first segment and corner of second + if (lastPtCW == null) + { + verts.Add(new DrawVertexUV2D(origin + offsetVecCW * radius, Vector2.Zero)); + } + else + { + verts.Add(new DrawVertexUV2D((Vector2) lastPtCW, Vector2.Zero)); + } + + if (lastPtCCW == null) + { + verts.Add(new DrawVertexUV2D(origin + offsetVecCCW * radius, new Vector2(1, 0))); + } + else + { + verts.Add(new DrawVertexUV2D((Vector2) lastPtCCW, new Vector2(1, 0))); + } + + verts.Add(new DrawVertexUV2D(destination + offsetVecCW * radius, new Vector2(0, 1))); + + // tri 2: line across second segment and corner of first + if (lastPtCCW == null) + { + verts.Add(new DrawVertexUV2D(origin + offsetVecCCW * radius, new Vector2(1, 0))); + } + else + { + verts.Add(new DrawVertexUV2D((Vector2) lastPtCCW, new Vector2(1, 0))); + } + + lastPtCW = destination + offsetVecCW * radius; + verts.Add(new DrawVertexUV2D((Vector2) lastPtCW, new Vector2(0, 1))); + lastPtCCW = destination + offsetVecCCW * radius; + verts.Add(new DrawVertexUV2D((Vector2) lastPtCCW, new Vector2(1, 1))); + + // slim down a bit for next segment + radius *= lamia.SlimFactor; + + i++; + } + + // draw tail (1 tri) + if (lastPtCW != null && lastPtCCW != null) + { + verts.Add(new DrawVertexUV2D((Vector2) lastPtCW, new Vector2(0, 0))); + verts.Add(new DrawVertexUV2D((Vector2) lastPtCCW, new Vector2(1, 0))); + + var destination = _transform.GetWorldPosition(_entManager.GetEntity(lamia.Segments.Last())); + + verts.Add(new DrawVertexUV2D(destination, new Vector2(0.5f, 1f))); + } + + // Draw all of the triangles we just pit in at once + handle.DrawPrimitives(DrawPrimitiveTopology.TriangleList, texture: tex, verts.ToArray().AsSpan(), color); + } +} \ No newline at end of file diff --git a/Content.Client/DeltaV/Lamiae/SnakeOverlaySystem.cs b/Content.Client/DeltaV/Lamiae/SnakeOverlaySystem.cs new file mode 100644 index 00000000000..6be1a18dc14 --- /dev/null +++ b/Content.Client/DeltaV/Lamiae/SnakeOverlaySystem.cs @@ -0,0 +1,32 @@ +/* +* This file is licensed under AGPLv3 +* Copyright (c) 2024 Rane +* See AGPLv3.txt for details. +*/ + +using Robust.Client.Graphics; +using Robust.Client.ResourceManagement; + +namespace Content.Client.DeltaV.Lamiae; + +/// +/// This system turns on our always-on overlay. I have no opinion on this design pattern or the existence of this file. +/// It also fetches the deps it needs. +/// +public sealed class SnakeOverlaySystem : EntitySystem +{ + [Dependency] private readonly IOverlayManager _overlay = default!; + [Dependency] private readonly IResourceCache _resourceCache = default!; + + public override void Initialize() + { + base.Initialize(); + _overlay.AddOverlay(new SnakeOverlay(EntityManager, _resourceCache)); + } + + public override void Shutdown() + { + base.Shutdown(); + _overlay.RemoveOverlay(); + } +} \ No newline at end of file diff --git a/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs b/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs index ee217771d49..83f2450539f 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs @@ -4,19 +4,25 @@ * See AGPLv3.txt for details. */ +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; + namespace Content.Shared.SegmentedEntity { /// /// Controls initialization of any Multi-segmented entity /// - [RegisterComponent] + [RegisterComponent, NetworkedComponent] + [AutoGenerateComponentState] public sealed partial class SegmentedEntityComponent : Component { /// /// A list of each UID attached to the Lamia, in order of spawn /// [DataField("segments")] - public List Segments = new(); + [AutoNetworkedField] + public List Segments = new(); /// /// A clamped variable that represents the number of segments to be spawned @@ -24,6 +30,18 @@ public sealed partial class SegmentedEntityComponent : Component [DataField("numberOfSegments")] public int NumberOfSegments = 18; + /// + /// How wide the initial segment should be. + /// + [DataField("initialRadius")] + public float InitialRadius = 0.3f; + + /// + /// Texture of the segment. + /// + [DataField("texturePath", required: true)] + public string TexturePath; + /// /// If UseTaperSystem is true, this constant represents the rate at which a segmented entity will taper towards the tip. Tapering is on a logarithmic scale, and will asymptotically approach 0. /// @@ -39,11 +57,17 @@ public sealed partial class SegmentedEntityComponent : Component /// /// Represents the segment prototype to be spawned /// - [DataField("SegmentId")] + [DataField("segmentId")] public string SegmentId = "LamiaSegment"; /// - /// Toggles the tapering system on and off. When false, segmented entities will have a constant width. + /// How much to slim each successive segment. + /// + [DataField("slimFactor")] + public float SlimFactor = 0.93f; + + /// + /// Set to 1f for constant width /// [DataField("useTaperSystem")] public bool UseTaperSystem = true; diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs deleted file mode 100644 index f1e6a202115..00000000000 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs +++ /dev/null @@ -1,18 +0,0 @@ -/* -* Delta-V - This file is licensed under AGPLv3 -* Copyright (c) 2024 Delta-V Contributors -* See AGPLv3.txt for details. -*/ - -using Robust.Shared.Serialization; - -namespace Content.Shared.SegmentedEntity -{ - [Serializable, NetSerializable] - public enum SegmentedEntitySegmentVisualLayers - { - Tail, - Armor, - ArmorRsi, - } -} diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index 529c9ad03f8..2e7e6177a1a 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -2,7 +2,6 @@ using Content.Shared.Damage; using Content.Shared.Explosion; using Content.Shared.Humanoid; -using Content.Shared.Humanoid.Markings; using Content.Shared.Clothing.Components; using Content.Shared.Inventory.Events; using Content.Shared.Tag; @@ -14,15 +13,14 @@ using Robust.Shared.Physics.Components; using System.Numerics; using Robust.Shared.Network; +using Robust.Shared.GameStates; namespace Content.Shared.SegmentedEntity { public sealed partial class LamiaSystem : EntitySystem { [Dependency] private readonly TagSystem _tagSystem = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; - [Dependency] private readonly SharedHumanoidAppearanceSystem _humanoid = default!; [Dependency] private readonly SharedJointSystem _jointSystem = default!; [Dependency] private readonly INetManager _net = default!; @@ -49,7 +47,6 @@ public override void Initialize() SubscribeLocalEvent(OnSnekBoom); SubscribeLocalEvent(HandleDamageTransfer); SubscribeLocalEvent(HandleSegmentDamage); - SubscribeLocalEvent(OnSegmentSpawned); } public override void Update(float frameTime) { @@ -108,7 +105,7 @@ private void OnShutdown(EntityUid uid, SegmentedEntityComponent component, Compo foreach (var segment in component.Segments) { - QueueDel(segment); + QueueDel(GetEntity(segment)); } component.Segments.Clear(); @@ -141,7 +138,7 @@ public void OnStoreSnekAttempt(EntityUid uid, SegmentedEntityComponent comp, ref private void OnJointRemoved(EntityUid uid, SegmentedEntityComponent component, JointRemovedEvent args) { - if (!component.Segments.Contains(args.OtherEntity)) + if (!component.Segments.Contains(GetNetEntity(args.OtherEntity))) return; DeleteSegments(component); @@ -153,7 +150,7 @@ private void DeleteSegments(SegmentedEntityComponent component) return; //Client is not allowed to predict QueueDel, it'll throw an error(but won't crash in Release build) foreach (var segment in component.Segments) - QueueDel(segment); + QueueDel(GetEntity(segment)); component.Segments.Clear(); } @@ -182,6 +179,8 @@ private void SpawnSegments(EntityUid uid, SegmentedEntityComponent component) addTo = segment; i++; } + + Dirty(uid, component); } private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, SegmentedEntityComponent segmentedComponent, int segmentNumber) @@ -235,41 +234,10 @@ private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, Segmente EnsureComp(segment); //Not temporary, segments must never be allowed to go through portals for physics limitation reasons _segments.Enqueue((segmentComponent, parentuid)); - segmentedComponent.Segments.Add(segment); + segmentedComponent.Segments.Add(GetNetEntity(segment)); return segment; } - /// - /// Handles transferring marking selections to the tail segments. Every tail marking must be repeated 2 times in order for this script to work. - /// - /// - /// - /// - // TODO: Please for the love of god don't make me write a test to validate that every marking also has its matching segment states. - // Future contributors will just find out when their game crashes because they didn't make a marking-segment. - private void OnSegmentSpawned(EntityUid uid, SegmentedEntitySegmentComponent component, SegmentSpawnedEvent args) - { - component.Lamia = args.Lamia; - - if (!TryComp(uid, out var species)) return; - if (!TryComp(args.Lamia, out var humanoid)) return; - if (!TryComp(uid, out var appearance)) return; - var humanoidFactor = (humanoid.Height + humanoid.Width) / 2; - - _appearance.SetData(uid, ScaleVisuals.Scale, component.ScaleFactor * humanoidFactor, appearance); - - if (humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings)) - { - foreach (var markings in tailMarkings) - { - var segmentId = species.Species; - var markingId = markings.MarkingId; - string segmentmarking = $"{markingId}-{segmentId}"; - _humanoid.AddMarking(uid, segmentmarking, markings.MarkingColors); - } - } - } - private void HandleSegmentDamage(EntityUid uid, SegmentedEntitySegmentComponent component, DamageModifyEvent args) { if (args.Origin == component.Lamia) @@ -297,13 +265,7 @@ private void OnDidEquipEvent(EntityUid equipee, SegmentedEntityComponent compone if (!TryComp(args.Equipment, out var clothing)) return; if (args.Slot == "outerClothing" && _tagSystem.HasTag(args.Equipment, LamiaHardsuitTag)) { - foreach (var uid in component.Segments) - { - if (!TryComp(uid, out var appearance)) return; - _appearance.SetData(uid, SegmentedEntitySegmentVisualLayers.Armor, true, appearance); - if (clothing.RsiPath == null) return; - _appearance.SetData(uid, SegmentedEntitySegmentVisualLayers.ArmorRsi, clothing.RsiPath, appearance); - } + // TODO: Switch segment sprite } } @@ -316,11 +278,7 @@ private void OnDidUnequipEvent(EntityUid equipee, SegmentedEntityComponent compo { if (args.Slot == "outerClothing" && _tagSystem.HasTag(args.Equipment, LamiaHardsuitTag)) { - foreach (var uid in component.Segments) - { - if (!TryComp(uid, out var appearance)) return; - _appearance.SetData(uid, SegmentedEntitySegmentVisualLayers.Armor, false, appearance); - } + // TODO: Revert to default segment sprite } } @@ -331,7 +289,7 @@ private void OnShootHitscan(EntityUid uid, SegmentedEntityComponent component, r var entityList = new List(); foreach (var entity in args.RayCastResults) { - if (!component.Segments.Contains(entity.HitEntity)) + if (!component.Segments.Contains(GetNetEntity(entity.HitEntity))) entityList.Add(entity); } args.RayCastResults = entityList; diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml index eb8d0f03f0d..49951d78421 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml @@ -61,6 +61,7 @@ noRot: true drawdepth: Mobs scale: 1, 1 + offset: 0, 0.4 layers: #TODO: manually fix these layers - map: [ "enum.HumanoidVisualLayers.Chest" ] color: "#e8b59b" @@ -196,6 +197,7 @@ - MobLayer - type: SegmentedEntity numberOfSegments: 18 + texturePath: /Textures/Nyanotrasen/Mobs/Species/lamia.rsi/segment.png - type: Speech speechSounds: Alto - type: Vocal diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml index 0383143c269..f5fad8c21cb 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml @@ -9,7 +9,6 @@ components: - type: Damageable - type: StandingState - - type: Appearance - type: Clickable - type: InteractionOutline - type: PsionicInsulation #Not a brain, target the lamia instead @@ -29,7 +28,6 @@ - MobLayer - type: Transform anchored: false - - type: SegmentedEntitySegmentVisuals - type: Tag tags: - HideContextMenu @@ -45,17 +43,7 @@ description: A tail segment, hopefully attached to a lamia. components: - type: Sprite - sprite: Nyanotrasen/Mobs/Species/lamia.rsi - drawdepth: SmallMobs - layers: - - map: [ "enum.HumanoidVisualLayers.Tail" ] - - map: [ "enum.SegmentedEntitySegmentVisualLayers.Armor" ] - sprite: Clothing/OuterClothing/Hardsuits/basic.rsi - state: segment - visible: false - - type: Clickable - type: Tag tags: + - HideContextMenu - DoorBumpOpener - - type: HumanoidAppearance - species: LamiaSegment diff --git a/Resources/Prototypes/DeltaV/Species/lamia.yml b/Resources/Prototypes/DeltaV/Species/lamia.yml index a6cfbf90fe1..ed2ff0448ac 100644 --- a/Resources/Prototypes/DeltaV/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Species/lamia.yml @@ -17,19 +17,6 @@ sexes: - Female -- type: species - id: LamiaSegment - name: LamiaSegment - roundStart: false - prototype: LamiaSegment - dollPrototype: MobLamiaDummy - sprites: MobLamiaSegmentSprites - markingLimits: MobLamiaSegmentMarkingLimits - skinColoration: HumanToned - sexes: - - Female - - - type: markingPoints id: MobLamiaMarkingLimits points: @@ -41,13 +28,6 @@ required: true defaultMarkings: [ LamiaBottom ] -- type: markingPoints - id: MobLamiaSegmentMarkingLimits - points: - Tail: - points: 1 - required: false - - type: speciesBaseSprites id: MobLamiaSprites @@ -61,8 +41,3 @@ LHand: MobHumanLHand RHand: MobHumanRHand Tail: MobHumanoidAnyMarking - -- type: speciesBaseSprites - id: MobLamiaSegmentSprites - sprites: - Tail: MobHumanoidAnyMarking diff --git a/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json index ebfd0e2dc7b..01a2143a397 100644 --- a/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json +++ b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json @@ -10,6 +10,9 @@ { "name": "placeholder" }, + { + "name": "segment" + }, { "name": "bottom", "directions": 4 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/segment.png b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..09fa419f4594c8c4194b2aa2347ce7ca993f6ab2 GIT binary patch literal 4418 zcmeHKe^3EbHu~^5u-P^n4ZZDktxZ}qOryLMPY$|)Z?_lMAdAG+M zr1%2?!RD&Y#6%)VY82ZP!L(||iinjYgsQ=@LNze~87I{mD;*lGm1^Ja0YaOZ4l~Vv z+|1s-{l3rl^SxOPwi@4jP0t{k zpX>N%x&7vEVq(IKAGt2o7Z#j!=?bsfG(U~i4pUz*?ccDnAvA5(`tz>XuN@XyL!zbr4HVtn zT-}U@OVQrwwY%cQOA=?q*8WZT)cLe^_tU?IJ$nBa2Ud3~_OI>wdHVTP#L1&vTYuw@ zpVTZcd48#$`?FMb!#m!Lfitt~*57;lWW_ssOSwIw!UF8GrF(j}b@_8lgVLzW?q3I8 zS%7bf%e{bV!(VP1YU;Q8flOW)H*g#cLzaGizF_8E^7CnB!Ql&!fNc#&k1swYzP94E zZ$5tUqZ%z+!kTWML*{(79<8ZNt4|1BRrLvdusZr7yL;lksX91x-P0F#uq5VeQ_Ew|tdaXPtSg5({lpU2eEPwug|9)_GYxH_i2a_9H3GJPzpzc9x6bB$FPAD|ET7xU{WJ-+!*FgDkXc>ohFs!BQf1&xsgC+!~ zJcD(^@yi5LU`6GE&4I7LruPV1zg!SD=e7rtC!k?j9rMI%;RX zr4&e|*$m4^Eg@741LqIcl^Q3N5)i-4b1we`A#XO!hsH3@U`!3W9X@UDGG)WY z{bkU!fJ@EibPgMTDo2FFB4AK2%N3*iVR7B|$R9w^VS_$7FTdm7K2zj5G+g)I%_r+D z?H2})6xN;gZ}j&@zrANCA)lKPbnc6Sy_=H35u5;uH4xZpwgW7_e3;)f~KLw!3#{}p>!j}K(m zR$a_^@G6qjQ(c=|y>GLqtNPOR6X9q4e`-x^oS`-E^IsQ Date: Wed, 13 Nov 2024 19:27:55 -0500 Subject: [PATCH 71/73] aaaa --- Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs | 2 +- Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index 2e7e6177a1a..683f860c72c 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -278,7 +278,7 @@ private void OnDidUnequipEvent(EntityUid equipee, SegmentedEntityComponent compo { if (args.Slot == "outerClothing" && _tagSystem.HasTag(args.Equipment, LamiaHardsuitTag)) { - // TODO: Revert to default segment sprite + // TODO: Revert to default segment sprite } } diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml index 49951d78421..38601f21b54 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml @@ -55,7 +55,6 @@ tags: - CanPilot - DoorBumpOpener - - ShoesRequiredStepTriggerImmune - type: Sprite netsync: false noRot: true From 463f2a1275750b9dae875b0c0854bdf27a690e8d Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 13 Nov 2024 19:36:16 -0500 Subject: [PATCH 72/73] Fuck it, technically playable --- .../SegmentedEntity/SegmentedEntitySystem.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index 683f860c72c..5ab786c429e 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -23,6 +23,7 @@ public sealed partial class LamiaSystem : EntitySystem [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly SharedJointSystem _jointSystem = default!; [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; Queue<(SegmentedEntitySegmentComponent segment, EntityUid lamia)> _segments = new(); @@ -75,14 +76,14 @@ public override void Update(float frameTime) if (segment.segment.SegmentNumber == 1) { - Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates; + _transform.SetCoordinates(segmentUid, Transform(attachedUid).Coordinates); var revoluteJoint = _jointSystem.CreateWeldJoint(attachedUid, segmentUid, id: "Segment" + segment.segment.SegmentNumber + segment.segment.Lamia); revoluteJoint.CollideConnected = false; } if (segment.segment.SegmentNumber <= segment.segment.MaxSegments) - Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0, segment.segment.OffsetSwitching * humanoidFactor)); + _transform.SetCoordinates(segmentUid, Transform(attachedUid).Coordinates.Offset(new Vector2(0, segment.segment.OffsetSwitching * humanoidFactor))); else - Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0, segment.segment.OffsetSwitching * humanoidFactor)); + _transform.SetCoordinates(segmentUid, Transform(attachedUid).Coordinates.Offset(new Vector2(0, segment.segment.OffsetSwitching * humanoidFactor))); var joint = _jointSystem.CreateDistanceJoint(attachedUid, segmentUid, id: ("Segment" + segment.segment.SegmentNumber + segment.segment.Lamia)); joint.CollideConnected = false; @@ -298,8 +299,8 @@ private void OnShootHitscan(EntityUid uid, SegmentedEntityComponent component, r private void OnParentChanged(EntityUid uid, SegmentedEntityComponent component, ref EntParentChangedMessage args) { //If the change was NOT to a different map - if (args.OldMapId == args.Transform.MapUid) - RespawnSegments(uid, component); + //if (args.OldMapId == args.Transform.MapUid) + // RespawnSegments(uid, component); } } } From f81ca020f924a5a7467df576b02ee1d34c49f036 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 13 Nov 2024 19:54:30 -0500 Subject: [PATCH 73/73] Update lamia.yml --- Resources/Prototypes/DeltaV/Species/lamia.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Resources/Prototypes/DeltaV/Species/lamia.yml b/Resources/Prototypes/DeltaV/Species/lamia.yml index ed2ff0448ac..1f7da8306d2 100644 --- a/Resources/Prototypes/DeltaV/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Species/lamia.yml @@ -1,11 +1,7 @@ -# Delta-V - This file is licensed under AGPLv3 -# Copyright (c) 2024 Delta-V Contributors -# See AGPLv3.txt for details. - - type: species id: Lamia name: Lamia - roundStart: true + roundStart: false prototype: MobLamia dollPrototype: MobLamiaDummy sprites: MobLamiaSprites