From ece112d35fdc594d209f37643e438b155965a254 Mon Sep 17 00:00:00 2001 From: JustDemocor Date: Sat, 27 Dec 2025 17:22:13 +0100 Subject: [PATCH 1/3] Update Bos.yml --- Resources/Prototypes/_Pirate/Bos.yml | 78 +++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/_Pirate/Bos.yml b/Resources/Prototypes/_Pirate/Bos.yml index f54378b2609e..e30f05d60ca5 100644 --- a/Resources/Prototypes/_Pirate/Bos.yml +++ b/Resources/Prototypes/_Pirate/Bos.yml @@ -101,8 +101,8 @@ - type: MobThresholds thresholds: 0: Alive - 125: Critical - 200: Dead + 1000: Critical + 2000: Dead - type: Destructible thresholds: - trigger: @@ -160,6 +160,8 @@ damageRecovery: types: Asphyxiation: -10.0 + - type: SkeletonAccent + enabled: false - type: entity id: ClothingOuterPlagueSuitDeath @@ -203,6 +205,15 @@ contents: - id: DeathTicket amount: 10 + - type: ItemSlots + slots: + pen_slot: + name: clipboard-slot-component-slot-name-pen + startingItem: PenCentcom + whitelist: + tags: + - Write + insertOnInteract: false - type: entity id: DeathTicket @@ -211,3 +222,66 @@ components: - type: Paper content: doc-text-death-ticket + +- type: entity + id: JustDecorHandTeleporterBackrooms + suffix: Backrooms, JustDecor + parent: BaseItem + name: BackRooms + components: + - type: Sprite + sprite: /Textures/Objects/Devices/hand_teleporter.rsi + layers: + - state: icon + color: green + - type: HandTeleporter + allowPortalsOnDifferentGrids: true + allowPortalsOnDifferentMaps: true + firstPortalPrototype: JustDecorPortalGatewayBlue + secondPortalPrototype: JustDecorPortalGatewayOrange + +- type: entity + id: JustDecorBasePortal + abstract: true + name: bluespace portal + description: Transports you to a linked destination! + components: + - type: Transform + anchored: True + - type: InteractionOutline + - type: Clickable + - type: Physics + bodyType: Static + - type: Fixtures + fixtures: + portalFixture: + shape: + !type:PhysShapeAabb + bounds: "-0.25,-0.48,0.25,0.48" + mask: + - FullTileMask + layer: + - WallLayer + hard: false + - type: Portal + + +- type: entity + id: JustDecorPortalGatewayBlue + parent: JustDecorBasePortal + components: + - type: PointLight + color: SkyBlue + radius: 3 + energy: 1 + netsync: false + +- type: entity + id: JustDecorPortalGatewayOrange + parent: JustDecorBasePortal + components: + - type: PointLight + color: OrangeRed + radius: 3 + energy: 1 + netsync: false \ No newline at end of file From c6b62d84dbace8db5cbe295df2accd1442a20d98 Mon Sep 17 00:00:00 2001 From: JustDemocor Date: Mon, 9 Feb 2026 22:46:55 +0100 Subject: [PATCH 2/3] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D1=80=D1=82=D1=8C=20?= =?UTF-8?q?=F0=9F=92=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Melee/SharedTeleportStrikeSystem.cs | 202 ++++++++++++ .../Weapons/Melee/TeleportStrikeComponent.cs | 19 ++ .../Melee/TeleportStrikeLockComponent.cs | 28 ++ Resources/Prototypes/_Pirate/Bos.yml | 287 ------------------ .../_Pirate/_JustDecor/Bos/documents.yml | 7 + .../_Pirate/_JustDecor/Bos/gear.yml | 12 + .../_Pirate/_JustDecor/Bos/items.yml | 123 ++++++++ .../_Pirate/_JustDecor/Bos/mobs.yml | 72 +++++ .../_Pirate/_JustDecor/Bos/portals.yml | 62 ++++ 9 files changed, 525 insertions(+), 287 deletions(-) create mode 100644 Content.Pirate.Shared/_JustDecor/Weapons/Melee/SharedTeleportStrikeSystem.cs create mode 100644 Content.Pirate.Shared/_JustDecor/Weapons/Melee/TeleportStrikeComponent.cs create mode 100644 Content.Pirate.Shared/_JustDecor/Weapons/Melee/TeleportStrikeLockComponent.cs delete mode 100644 Resources/Prototypes/_Pirate/Bos.yml create mode 100644 Resources/Prototypes/_Pirate/_JustDecor/Bos/documents.yml create mode 100644 Resources/Prototypes/_Pirate/_JustDecor/Bos/gear.yml create mode 100644 Resources/Prototypes/_Pirate/_JustDecor/Bos/items.yml create mode 100644 Resources/Prototypes/_Pirate/_JustDecor/Bos/mobs.yml create mode 100644 Resources/Prototypes/_Pirate/_JustDecor/Bos/portals.yml diff --git a/Content.Pirate.Shared/_JustDecor/Weapons/Melee/SharedTeleportStrikeSystem.cs b/Content.Pirate.Shared/_JustDecor/Weapons/Melee/SharedTeleportStrikeSystem.cs new file mode 100644 index 000000000000..2e3d0d504dd3 --- /dev/null +++ b/Content.Pirate.Shared/_JustDecor/Weapons/Melee/SharedTeleportStrikeSystem.cs @@ -0,0 +1,202 @@ +using System; +using System.Linq; +using System.Numerics; +using Content.Goobstation.Common.BlockTeleport; +using Content.Goobstation.Common.Weapons; +using Content.Pirate.Shared._JustDecor.Weapons.Melee; +using Content.Shared.ActionBlocker; +using Content.Shared.Interaction; +using Content.Shared.Movement.Events; +using Content.Shared.Movement.Systems; +using Content.Shared.Physics; +using Content.Shared.Weapons.Melee; +using Content.Shared.Weapons.Melee.Events; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Maths; +using Robust.Shared.Network; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Systems; +using Robust.Shared.Timing; +using Robust.Shared.Utility; +using Content.Shared.Interaction.Events; + +namespace Content.Pirate.Shared._JustDecor.Weapons.Melee; + +public sealed class SharedTeleportStrikeSystem : EntitySystem +{ + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedTransformSystem _xform = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly SharedMeleeWeaponSystem _melee = default!; + [Dependency] private readonly MovementSpeedModifierSystem _movementSpeed = default!; + [Dependency] private readonly RotateToFaceSystem _rotateToFace = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly INetManager _net = default!; + + /// + /// Delay before performing the attack after teleporting. + /// + private const float AttackDelay = 0.1f; + + /// + /// Additional delay added to return time after attack. + /// + private const float ExtraReturnDelay = 0.2f; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnGetRange); + SubscribeLocalEvent(OnSpecialAttack); + SubscribeLocalEvent(OnRefreshMovespeed); + SubscribeLocalEvent(OnChangeDirection); + } + + private void OnGetRange(Entity ent, ref GetLightAttackRangeEvent args) + { + if (_net.IsServer) + return; + + args.Range = Math.Max(args.Range, ent.Comp.MaxRange); + } + + private void OnSpecialAttack(Entity ent, ref LightAttackSpecialInteractionEvent args) + { + if (_net.IsClient) + return; + + if (args.Target == null) + return; + + var user = args.User; + var target = args.Target.Value; + + if (HasComp(user)) + return; + + if (!TryComp(ent, out MeleeWeaponComponent? melee) || melee.NextAttack > _timing.CurTime) + return; + + var userXform = Transform(user); + var targetXform = Transform(target); + + if (userXform.MapID != targetXform.MapID) + return; + + var userPos = _xform.GetWorldPosition(userXform); + var targetPos = _xform.GetWorldPosition(targetXform); + + var dir = targetPos - userPos; + var distance = dir.Length(); + + if (distance <= args.Range || distance > ent.Comp.MaxRange) + return; + + var ev = new TeleportAttemptEvent(false); + RaiseLocalEvent(user, ref ev); + if (ev.Cancelled) + return; + + var normalized = new Vector2(dir.X / distance, dir.Y / distance); + var ray = new CollisionRay( + userPos, + normalized, + (int) (CollisionGroup.Impassable | CollisionGroup.InteractImpassable)); + + var result = _physics.IntersectRay(userXform.MapID, ray, distance, user).FirstOrNull(); + if (result != null && result.Value.HitEntity != target) + return; + + var behindPos = targetPos + normalized * ent.Comp.BehindOffset; + + var originalCoords = userXform.Coordinates; + var originalVelocity = Vector2.Zero; + if (TryComp(user, out var physics)) + { + originalVelocity = physics.LinearVelocity; + _physics.SetLinearVelocity(user, Vector2.Zero, body: physics); + } + + var lockComp = EnsureComp(user); + lockComp.ReturnCoordinates = originalCoords; + lockComp.ReturnVelocity = originalVelocity; + lockComp.Target = target; + lockComp.Weapon = ent.Owner; + lockComp.AttackTime = _timing.CurTime + TimeSpan.FromSeconds(AttackDelay); + lockComp.ReturnTime = _timing.CurTime + TimeSpan.FromSeconds(ent.Comp.ReturnDelay + ExtraReturnDelay); + Dirty(user, lockComp); + + _movementSpeed.RefreshMovementSpeedModifiers(user); + + if (ent.Comp.TeleportSound != null) + _audio.PlayPredicted(ent.Comp.TeleportSound, user, user); + + // Teleport behind the target + _xform.SetWorldPosition(user, behindPos); + + // Calculate and set rotation to face the target + var dirToTarget = targetPos - behindPos; + if (dirToTarget.LengthSquared() > 0.01f) + { + var angle = Angle.FromWorldVec(dirToTarget); + _xform.SetWorldRotation(user, angle); + } + + args.Cancel = true; + } + + private void OnRefreshMovespeed(EntityUid uid, TeleportStrikeLockComponent comp, ref RefreshMovementSpeedModifiersEvent args) + { + args.ModifySpeed(0f, 0f); + } + + private void OnChangeDirection(EntityUid uid, TeleportStrikeLockComponent comp, ChangeDirectionAttemptEvent args) + { + args.Cancel(); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + if (_net.IsClient) + return; + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var lockComp)) + { + if (!Exists(uid)) + continue; + + // Perform attack when attack time is reached + if (lockComp.AttackTime != TimeSpan.Zero && _timing.CurTime >= lockComp.AttackTime) + { + lockComp.AttackTime = TimeSpan.Zero; + Dirty(uid, lockComp); + + if (TryComp(lockComp.Weapon, out var melee) && Exists(lockComp.Target)) + { + _melee.AttemptLightAttack(uid, lockComp.Weapon, melee, lockComp.Target); + + // Set cooldown after the attack + melee.NextAttack += TimeSpan.FromSeconds(0.2); + Dirty(lockComp.Weapon, melee); + } + } + + // Return to original position after return time + if (_timing.CurTime < lockComp.ReturnTime) + continue; + + _xform.SetCoordinates(uid, lockComp.ReturnCoordinates); + + if (TryComp(uid, out var physics)) + _physics.SetLinearVelocity(uid, lockComp.ReturnVelocity, body: physics); + + RemComp(uid); + _movementSpeed.RefreshMovementSpeedModifiers(uid); + } + } +} diff --git a/Content.Pirate.Shared/_JustDecor/Weapons/Melee/TeleportStrikeComponent.cs b/Content.Pirate.Shared/_JustDecor/Weapons/Melee/TeleportStrikeComponent.cs new file mode 100644 index 000000000000..d848c7f9987d --- /dev/null +++ b/Content.Pirate.Shared/_JustDecor/Weapons/Melee/TeleportStrikeComponent.cs @@ -0,0 +1,19 @@ +using Robust.Shared.Audio; + +namespace Content.Pirate.Shared._JustDecor.Weapons.Melee; + +[RegisterComponent] +public sealed partial class TeleportStrikeComponent : Component +{ + [DataField] + public float MaxRange = 7f; + + [DataField] + public float BehindOffset = 0.5f; + + [DataField] + public float ReturnDelay = 0.25f; + + [DataField] + public SoundSpecifier? TeleportSound; +} diff --git a/Content.Pirate.Shared/_JustDecor/Weapons/Melee/TeleportStrikeLockComponent.cs b/Content.Pirate.Shared/_JustDecor/Weapons/Melee/TeleportStrikeLockComponent.cs new file mode 100644 index 000000000000..b694df297472 --- /dev/null +++ b/Content.Pirate.Shared/_JustDecor/Weapons/Melee/TeleportStrikeLockComponent.cs @@ -0,0 +1,28 @@ +using System; +using System.Numerics; +using Robust.Shared.GameStates; +using Robust.Shared.Map; + +namespace Content.Pirate.Shared._JustDecor.Weapons.Melee; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TeleportStrikeLockComponent : Component +{ + [DataField, AutoNetworkedField] + public EntityCoordinates ReturnCoordinates; + + [DataField, AutoNetworkedField] + public Vector2 ReturnVelocity; + + [DataField, AutoNetworkedField] + public TimeSpan ReturnTime; + + [DataField, AutoNetworkedField] + public TimeSpan AttackTime; + + [DataField, AutoNetworkedField] + public EntityUid Target; + + [DataField, AutoNetworkedField] + public EntityUid Weapon; +} diff --git a/Resources/Prototypes/_Pirate/Bos.yml b/Resources/Prototypes/_Pirate/Bos.yml deleted file mode 100644 index e30f05d60ca5..000000000000 --- a/Resources/Prototypes/_Pirate/Bos.yml +++ /dev/null @@ -1,287 +0,0 @@ -- type: startingGear - id: SkeletonDeathGear - equipment: - outerClothing: ClothingOuterPlagueSuitDeath - jumpsuit: ClothingUniformJumpsuitChaplain - shoes: ClothingShoesChameleonNoSlips - mask: ClothingMaskPlague - head: ClothingHeadHatPlaguedoctor - id: ERTChaplainIDCard - back: WeaponScytheDeath - belt: BoxFolderCentComClipboardDeath - ears: ClothingHeadsetAltCentCom - -- type: entity - id: WeaponScytheDeath - suffix: Death - name: Коса Смерті - parent: BaseItem - description: Коса, що випромінює загрозу. Лезо вкрите засохлою кров'ю. - components: - - type: Sharp - - type: Sprite - sprite: _DV/CosmicCult/Objects/cosmicscythe.rsi - layers: - - state: icon - - state: icon-overlay - shader: unshaded - - type: MeleeWeapon - attackRate: 2 - range: 1.3 - damage: - types: - Slash: 15 - wideAnimationRotation: 135 - heavyStaminaCost: 2 - angle: 120 - - type: Tool - qualities: - - Prying - - type: Utensil - breakChance: 0 - - type: AutoRecharge - rechargeDuration: 10 - - type: Tag - tags: - - Katana - - BotanyHatchet - - type: ThrowingAngle - angle: 315 - - type: Clothing - sprite: _DV/CosmicCult/Objects/cosmicscythe.rsi - slots: - - back - - type: BoneSaw - speed: 0.35 - - type: SurgeryTool - startSound: - path: /Audio/_Shitmed/Medical/Surgery/saw.ogg - - type: Item - size: Ginormous - sprite: _DV/CosmicCult/Objects/cosmicscythe-inhands.rsi - inhandVisuals: - left: - - state: inhand-left - right: - - state: inhand-right - - type: IncreaseDamageOnWield - damage: - types: - Structural: 5 - - type: Reflect - reflectProb: .35 - spread: 120 - soundOnReflect: - path: /Audio/_DV/CosmicCult/cosmicsword_glance.ogg - params: - variation: 0.2 - volume: -6 - - type: Wieldable - wieldSound: - path: /Audio/_DV/CosmicCult/cosmic_wield.ogg - params: - variation: 0.2 - volume: -2 - unwieldSound: - path: /Audio/_DV/CosmicCult/cosmic_unwield.ogg - params: - variation: 0.2 - volume: 0 - -- type: entity - id: MobDeathSkeleton - name: Кістлява смерть - description: Величезний скелет у рясі, що несе косу смерті. - parent: BaseMobSkeletonPerson - suffix: Death - components: - - type: Damageable - damageContainer: Biological - damageModifierSet: Skeleton - - type: MobThresholds - thresholds: - 0: Alive - 1000: Critical - 2000: Dead - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 2550 - behaviors: - - !type:GibBehavior # Shitmed Change - gibContents: Skip # Shitmed Change - - type: PointLight - enabled: true - color: "#b01403" - radius: 6.0 - energy: 3.0 - netsync: false - - type: GhostRole - name: Кістлява смерть - description: "Ти - Жива Смерть, втілення загибелі. Твоя задача - випробувати екіпаж, використовуючи свою косу. Не забувай: ти не людина, а надприродна сила, і твоя поява - це знак кінця." - rules: | - 1. Грай атмосферно, не розмовляй як звичайна людина. - 2. Використовуй свою косу, щоб випробувати екіпаж на міцність. - 3. Не вбивай усіх одразу - давай шанс на епічну боротьбу. - 4. Не залишай свою роль без причини, не допомагай екіпажу. - 5. Пам'ятай: твоя мета - створити атмосферу страху та випробування, а не просто знищити всіх. - 6. Лікуй підданих монстрів або тих, хто загинув несправедливо, за допомогою свого дефібрилятора. Можеш ним кидатися, щоб відновити усе здоров'я або використати його як звичайний дефібрилятор на неживій істоті. - mindRoles: - - MindRoleGhostRoleTeamAntagonist - raffle: - settings: default - - type: GhostTakeoverAvailable - - type: Loadout - prototypes: [SkeletonDeathGear] - - type: GhostTargeting - - type: Tag - tags: - - CanPilot - - BypassInteractionRangeChecks - - BypassDropChecks - - NoConsoleSound - - FootstepSound - - DoorBumpOpener - - type: Puller - needsHands: false - - type: Thieving - stripTimeReduction: 9999 - stealthy: true - - type: BypassInteractionChecks - - type: SupermatterImmune - - type: MovementIgnoreGravity - - type: AutoImplant - implants: [ ShiftImplant, BlinkImplant, FreedomImplant, ScramImplant, StopTimeImplant, NutrimentPumpImplant, SpaceProofImplant, StypticStimulatorImplant ] - - type: Respirator - damage: - types: - Asphyxiation: 0.1 - damageRecovery: - types: - Asphyxiation: -10.0 - - type: SkeletonAccent - enabled: false - -- type: entity - id: ClothingOuterPlagueSuitDeath - suffix: Death - parent: [ClothingOuterPlagueSuit] - components: - - type: PressureProtection - highPressureMultiplier: 0.6 - lowPressureMultiplier: 1000 - - type: TemperatureProtection - - type: Armor - modifiers: - coefficients: - Blunt: 0.1 - Slash: 0.1 - Piercing: 0.1 - Heat: 0.1 - - type: Unremoveable - - type: Storage - grid: - - 0,0,2,1 - - type: ContainerContainer - containers: - storagebase: !type:Container - ents: [] - - type: UserInterface - interfaces: - enum.StorageUiKey.Key: - type: StorageBoundUserInterface - - type: StorageFill - contents: - - id: AmnestizineHypospray - - id: BoxAmnestizineCartridge - -- type: entity - id: BoxFolderCentComClipboardDeath - parent: BoxFolderCentComClipboard - suffix: Death - components: - - type: StorageFill - contents: - - id: DeathTicket - amount: 10 - - type: ItemSlots - slots: - pen_slot: - name: clipboard-slot-component-slot-name-pen - startingItem: PenCentcom - whitelist: - tags: - - Write - insertOnInteract: false - -- type: entity - id: DeathTicket - suffix: Death - parent: Paper - components: - - type: Paper - content: doc-text-death-ticket - -- type: entity - id: JustDecorHandTeleporterBackrooms - suffix: Backrooms, JustDecor - parent: BaseItem - name: BackRooms - components: - - type: Sprite - sprite: /Textures/Objects/Devices/hand_teleporter.rsi - layers: - - state: icon - color: green - - type: HandTeleporter - allowPortalsOnDifferentGrids: true - allowPortalsOnDifferentMaps: true - firstPortalPrototype: JustDecorPortalGatewayBlue - secondPortalPrototype: JustDecorPortalGatewayOrange - -- type: entity - id: JustDecorBasePortal - abstract: true - name: bluespace portal - description: Transports you to a linked destination! - components: - - type: Transform - anchored: True - - type: InteractionOutline - - type: Clickable - - type: Physics - bodyType: Static - - type: Fixtures - fixtures: - portalFixture: - shape: - !type:PhysShapeAabb - bounds: "-0.25,-0.48,0.25,0.48" - mask: - - FullTileMask - layer: - - WallLayer - hard: false - - type: Portal - - -- type: entity - id: JustDecorPortalGatewayBlue - parent: JustDecorBasePortal - components: - - type: PointLight - color: SkyBlue - radius: 3 - energy: 1 - netsync: false - -- type: entity - id: JustDecorPortalGatewayOrange - parent: JustDecorBasePortal - components: - - type: PointLight - color: OrangeRed - radius: 3 - energy: 1 - netsync: false \ No newline at end of file diff --git a/Resources/Prototypes/_Pirate/_JustDecor/Bos/documents.yml b/Resources/Prototypes/_Pirate/_JustDecor/Bos/documents.yml new file mode 100644 index 000000000000..8fecbce0efd7 --- /dev/null +++ b/Resources/Prototypes/_Pirate/_JustDecor/Bos/documents.yml @@ -0,0 +1,7 @@ +- type: entity + id: DeathTicket + suffix: Death + parent: Paper + components: + - type: Paper + content: doc-text-death-ticket diff --git a/Resources/Prototypes/_Pirate/_JustDecor/Bos/gear.yml b/Resources/Prototypes/_Pirate/_JustDecor/Bos/gear.yml new file mode 100644 index 000000000000..529a8dbdb6f5 --- /dev/null +++ b/Resources/Prototypes/_Pirate/_JustDecor/Bos/gear.yml @@ -0,0 +1,12 @@ +- type: startingGear + id: SkeletonDeathGear + equipment: + outerClothing: ClothingOuterPlagueSuitDeath + jumpsuit: ClothingUniformJumpsuitChaplain + shoes: ClothingShoesChameleonNoSlips + mask: ClothingMaskPlague + head: ClothingHeadHatPlaguedoctor + id: ERTChaplainIDCard + back: WeaponScytheDeath + belt: BoxFolderCentComClipboardDeath + ears: ClothingHeadsetAltCentCom diff --git a/Resources/Prototypes/_Pirate/_JustDecor/Bos/items.yml b/Resources/Prototypes/_Pirate/_JustDecor/Bos/items.yml new file mode 100644 index 000000000000..ff871f2b46c4 --- /dev/null +++ b/Resources/Prototypes/_Pirate/_JustDecor/Bos/items.yml @@ -0,0 +1,123 @@ +- type: entity + id: WeaponScytheDeath + suffix: Death + name: Коса Смерті + parent: BaseItem + description: Коса, що випромінює загрозу. Лезо вкрите засохлою кров'ю. + components: + - type: Sharp + - type: Sprite + sprite: _DV/CosmicCult/Objects/cosmicscythe.rsi + layers: + - state: icon + - state: icon-overlay + shader: unshaded + - type: MeleeWeapon + attackRate: 2 + range: 1.3 + damage: + types: + Slash: 15 + wideAnimationRotation: 135 + heavyStaminaCost: 2 + angle: 120 + - type: TeleportStrike + maxRange: 7 + behindOffset: 0.5 + returnDelay: 0.25 + - type: Tool + qualities: + - Prying + - type: Utensil + breakChance: 0 + - type: AutoRecharge + rechargeDuration: 10 + - type: Tag + tags: + - Katana + - BotanyHatchet + - type: ThrowingAngle + angle: 315 + - type: Clothing + sprite: _DV/CosmicCult/Objects/cosmicscythe.rsi + slots: + - back + - type: BoneSaw + speed: 0.35 + - type: SurgeryTool + startSound: + path: /Audio/_Shitmed/Medical/Surgery/saw.ogg + - type: Item + size: Ginormous + sprite: _DV/CosmicCult/Objects/cosmicscythe-inhands.rsi + inhandVisuals: + left: + - state: inhand-left + right: + - state: inhand-right + - type: IncreaseDamageOnWield + damage: + types: + Structural: 5 + - type: Reflect + reflectProb: .35 + spread: 120 + soundOnReflect: + path: /Audio/_DV/CosmicCult/cosmicsword_glance.ogg + params: + variation: 0.2 + volume: -6 + - type: Wieldable + wieldSound: + path: /Audio/_DV/CosmicCult/cosmic_wield.ogg + params: + variation: 0.2 + volume: -2 + unwieldSound: + path: /Audio/_DV/CosmicCult/cosmic_unwield.ogg + params: + variation: 0.2 + volume: 0 + +- type: entity + id: ClothingOuterPlagueSuitDeath + suffix: Death + parent: [ClothingOuterPlagueSuit] + components: + - type: PressureProtection + highPressureMultiplier: 0.6 + lowPressureMultiplier: 1000 + - type: TemperatureProtection + - type: Armor + modifiers: + coefficients: + Blunt: 0.1 + Slash: 0.1 + Piercing: 0.1 + Heat: 0.1 + - type: Unremoveable + - type: Storage + grid: + - 0,0,2,1 + - type: ContainerContainer + containers: + storagebase: !type:Container + ents: [] + - type: UserInterface + interfaces: + enum.StorageUiKey.Key: + type: StorageBoundUserInterface + - type: StorageFill + contents: + - id: AmnestizineHypospray + - id: BoxAmnestizineCartridge + +- type: entity + id: BoxFolderCentComClipboardDeath + parent: BoxFolderCentComClipboard + suffix: Death + components: + - type: StorageFill + contents: + - id: DeathTicket + amount: 10 diff --git a/Resources/Prototypes/_Pirate/_JustDecor/Bos/mobs.yml b/Resources/Prototypes/_Pirate/_JustDecor/Bos/mobs.yml new file mode 100644 index 000000000000..6bb444e41834 --- /dev/null +++ b/Resources/Prototypes/_Pirate/_JustDecor/Bos/mobs.yml @@ -0,0 +1,72 @@ +- type: entity + id: MobDeathSkeleton + name: Кістлява смерть + description: Величезний скелет у рясі, що несе косу смерті. + parent: BaseMobSkeletonPerson + suffix: Death + components: + - type: Damageable + damageContainer: Biological + damageModifierSet: Skeleton + - type: MobThresholds + thresholds: + 0: Alive + 125: Critical + 200: Dead + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 2550 + behaviors: + - !type:GibBehavior # Shitmed Change + gibContents: Skip # Shitmed Change + - type: PointLight + enabled: true + color: "#b01403" + radius: 6.0 + energy: 3.0 + netsync: false + - type: GhostRole + name: Кістлява смерть + description: "Ти - Жива Смерть, втілення загибелі. Твоя задача - випробувати екіпаж, використовуючи свою косу. Не забувай: ти не людина, а надприродна сила, і твоя поява - це знак кінця." + rules: | + 1. Грай атмосферно, не розмовляй як звичайна людина. + 2. Використовуй свою косу, щоб випробувати екіпаж на міцність. + 3. Не вбивай усіх одразу - давай шанс на епічну боротьбу. + 4. Не залишай свою роль без причини, не допомагай екіпажу. + 5. Пам'ятай: твоя мета - створити атмосферу страху та випробування, а не просто знищити всіх. + 6. Лікуй підданих монстрів або тих, хто загинув несправедливо, за допомогою свого дефібрилятора. Можеш ним кидатися, щоб відновити усе здоров'я або використати його як звичайний дефібрилятор на неживій істоті. + mindRoles: + - MindRoleGhostRoleTeamAntagonist + raffle: + settings: default + - type: GhostTakeoverAvailable + - type: Loadout + prototypes: [SkeletonDeathGear] + - type: GhostTargeting + - type: Tag + tags: + - CanPilot + - BypassInteractionRangeChecks + - BypassDropChecks + - NoConsoleSound + - FootstepSound + - DoorBumpOpener + - type: Puller + needsHands: false + - type: Thieving + stripTimeReduction: 9999 + stealthy: true + - type: BypassInteractionChecks + - type: SupermatterImmune + - type: MovementIgnoreGravity + - type: AutoImplant + implants: [ ShiftImplant, BlinkImplant, FreedomImplant, ScramImplant, StopTimeImplant, NutrimentPumpImplant, SpaceProofImplant, StypticStimulatorImplant ] + - type: Respirator + damage: + types: + Asphyxiation: 0.1 + damageRecovery: + types: + Asphyxiation: -10.0 diff --git a/Resources/Prototypes/_Pirate/_JustDecor/Bos/portals.yml b/Resources/Prototypes/_Pirate/_JustDecor/Bos/portals.yml new file mode 100644 index 000000000000..bb3ac4e700b0 --- /dev/null +++ b/Resources/Prototypes/_Pirate/_JustDecor/Bos/portals.yml @@ -0,0 +1,62 @@ +- type: entity + id: JustDecorHandTeleporterBackrooms + suffix: Backrooms, JustDecor + parent: BaseItem + name: BackRooms + components: + - type: Sprite + sprite: /Textures/Objects/Devices/hand_teleporter.rsi + layers: + - state: icon + color: green + - type: HandTeleporter + allowPortalsOnDifferentGrids: true + allowPortalsOnDifferentMaps: true + firstPortalPrototype: JustDecorPortalGatewayBlue + secondPortalPrototype: JustDecorPortalGatewayOrange + +- type: entity + id: JustDecorBasePortal + abstract: true + name: bluespace portal + description: Transports you to a linked destination! + components: + - type: Transform + anchored: True + - type: InteractionOutline + - type: Clickable + - type: Physics + bodyType: Static + - type: Fixtures + fixtures: + portalFixture: + shape: + !type:PhysShapeAabb + bounds: "-0.25,-0.48,0.25,0.48" + mask: + - FullTileMask + layer: + - WallLayer + hard: false + - type: Portal + + +- type: entity + id: JustDecorPortalGatewayBlue + parent: JustDecorBasePortal + components: + - type: PointLight + color: SkyBlue + radius: 3 + energy: 1 + netsync: false + +- type: entity + id: JustDecorPortalGatewayOrange + parent: JustDecorBasePortal + components: + - type: PointLight + color: OrangeRed + radius: 3 + energy: 1 + netsync: false \ No newline at end of file From da94a132b9d756365492b726a57d4109cd412879 Mon Sep 17 00:00:00 2001 From: JustDemocor Date: Mon, 9 Feb 2026 23:26:34 +0100 Subject: [PATCH 3/3] Update slot-blocker.ftl --- .../uk-UA/_Pirate/clothing/slot-blocker.ftl | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Resources/Locale/uk-UA/_Pirate/clothing/slot-blocker.ftl b/Resources/Locale/uk-UA/_Pirate/clothing/slot-blocker.ftl index 139597f9cb07..28e23344aad3 100644 --- a/Resources/Locale/uk-UA/_Pirate/clothing/slot-blocker.ftl +++ b/Resources/Locale/uk-UA/_Pirate/clothing/slot-blocker.ftl @@ -1,2 +1,24 @@ +slot-blocker-blocked-generic = Ви повинні зняти {THE($blocker)}, щоб зробити це! +slot-blocker-blocked-equipped = Ви повинні зняти {THE($blocker)}, щоб одягнути це! +slot-blocker-blocked-unequipped = Ви повинні зняти {THE($blocker)}, щоб зняти це! +slot-blocker-examine-blocks = Це може блокувати наступні слоти при екіпіруванні: [bold]{$slots}[/bold] +slot-blocker-examine-blocked-by = Це може бути заблоковано наступними слотами: [bold]{$slots}[/bold] +# Named generic slot flags. Add more if more get added, but do not add slot flags that are not supposed to be named (e.g. WITHOUT_POCKET) +# We do not use the names from InventoryTemplate because those character-specific and they suck. +slot-name-HEAD = голова +slot-name-EYES = очі +slot-name-EARS = вуха +slot-name-MASK = маска +slot-name-OUTERCLOTHING = верхній одяг +slot-name-INNERCLOTHING = нижній одяг +slot-name-NECK = шия +slot-name-BACK = спина +slot-name-BELT = пояс +slot-name-GLOVES = руки +slot-name-IDCARD = КПК +slot-name-POCKET = кишені +slot-name-LEGS = ноги +slot-name-FEET = стопи +slot-name-SUITSTORAGE = зберігання костюма