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/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 = зберігання костюма
diff --git a/Resources/Prototypes/_Pirate/Bos.yml b/Resources/Prototypes/_Pirate/Bos.yml
deleted file mode 100644
index f54378b2609e..000000000000
--- a/Resources/Prototypes/_Pirate/Bos.yml
+++ /dev/null
@@ -1,213 +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
- 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
-
-- 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: entity
- id: DeathTicket
- suffix: Death
- parent: Paper
- components:
- - type: Paper
- content: doc-text-death-ticket
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