diff --git a/Content.Server/Traits/Assorted/WheelchairBoundComponent.cs b/Content.Server/Traits/Assorted/WheelchairBoundComponent.cs
new file mode 100644
index 0000000000..5e307b12db
--- /dev/null
+++ b/Content.Server/Traits/Assorted/WheelchairBoundComponent.cs
@@ -0,0 +1,15 @@
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
+
+namespace Content.Server.Traits.Assorted;
+
+///
+/// On adding spawns wheelchair prototype and tries buckle player to it, then self removing
+///
+[RegisterComponent, Access(typeof(WheelchairBoundSystem))]
+public sealed class WheelchairBoundComponent : Component
+{
+ [ViewVariables(VVAccess.ReadWrite)]
+ [DataField("wheelchairPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))]
+ public string WheelchairPrototype = "VehicleWheelchair";
+}
diff --git a/Content.Server/Traits/Assorted/WheelchairBoundSystem.cs b/Content.Server/Traits/Assorted/WheelchairBoundSystem.cs
new file mode 100644
index 0000000000..c827d37681
--- /dev/null
+++ b/Content.Server/Traits/Assorted/WheelchairBoundSystem.cs
@@ -0,0 +1,21 @@
+using Content.Shared.Buckle;
+using Content.Shared.Traits.Assorted;
+
+namespace Content.Server.Traits.Assorted;
+
+public sealed class WheelchairBoundSystem : EntitySystem
+{
+ [Dependency] private readonly SharedBuckleSystem _buckleSystem = default!;
+
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(OnStartup);
+ }
+
+ private void OnStartup(EntityUid uid, WheelchairBoundComponent component, ComponentStartup args)
+ {
+ var wheelchair = Spawn(component.WheelchairPrototype, Transform(uid).Coordinates);
+ _buckleSystem.TryBuckle(uid, uid, wheelchair);
+ RemComp(uid);
+ }
+}
diff --git a/Content.Shared/Traits/Assorted/LegsParalyzedComponent.cs b/Content.Shared/Traits/Assorted/LegsParalyzedComponent.cs
new file mode 100644
index 0000000000..a3cdb4ab33
--- /dev/null
+++ b/Content.Shared/Traits/Assorted/LegsParalyzedComponent.cs
@@ -0,0 +1,12 @@
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Traits.Assorted;
+
+///
+/// Set player speed to zero and standing state to down, simulating leg paralysis.
+/// Used for Wheelchair bound trait.
+///
+[RegisterComponent, NetworkedComponent, Access(typeof(LegsParalyzedSystem))]
+public sealed class LegsParalyzedComponent : Component
+{
+}
diff --git a/Content.Shared/Traits/Assorted/LegsParalyzedSystem.cs b/Content.Shared/Traits/Assorted/LegsParalyzedSystem.cs
new file mode 100644
index 0000000000..47d5999b30
--- /dev/null
+++ b/Content.Shared/Traits/Assorted/LegsParalyzedSystem.cs
@@ -0,0 +1,46 @@
+using Content.Shared.Body.Systems;
+using Content.Shared.Buckle.Components;
+using Content.Shared.Movement.Components;
+using Content.Shared.Movement.Systems;
+using Content.Shared.Standing;
+
+namespace Content.Shared.Traits.Assorted;
+
+public sealed class LegsParalyzedSystem : EntitySystem
+{
+ [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifierSystem = default!;
+ [Dependency] private readonly StandingStateSystem _standingSystem = default!;
+ [Dependency] private readonly SharedBodySystem _bodySystem = default!;
+
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(OnStartup);
+ SubscribeLocalEvent(OnShutdown);
+ SubscribeLocalEvent(OnBuckleChange);
+ }
+
+ private void OnStartup(EntityUid uid, LegsParalyzedComponent component, ComponentStartup args)
+ {
+ // TODO: In future probably must be surgery related wound
+ var movementSpeed = EnsureComp(uid);
+ _movementSpeedModifierSystem.ChangeBaseSpeed(uid, 0, 0, 20, movementSpeed);
+ }
+
+ private void OnShutdown(EntityUid uid, LegsParalyzedComponent component, ComponentShutdown args)
+ {
+ _standingSystem.Stand(uid);
+ _bodySystem.UpdateMovementSpeed(uid);
+ }
+
+ private void OnBuckleChange(EntityUid uid, LegsParalyzedComponent component, ref BuckleChangeEvent args)
+ {
+ if (args.Buckling)
+ {
+ _standingSystem.Stand(args.BuckledEntity);
+ }
+ else
+ {
+ _standingSystem.Down(args.BuckledEntity);
+ }
+ }
+}
diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl
index fd9cd1dce8..3e315d3889 100644
--- a/Resources/Locale/en-US/traits/traits.ftl
+++ b/Resources/Locale/en-US/traits/traits.ftl
@@ -28,3 +28,6 @@ trait-archaic-accent-desc = You speak in a way that many others find outdated
trait-accentless-name = Accentless
trait-accentless-desc = You don't have the accent that your species would usually have
+
+trait-wheelchair-bound-name = Wheelchair Bound
+trait-wheelchair-bound-desc = You cannot move without your wheelchair. Wheelchair included.
diff --git a/Resources/Prototypes/Entities/Objects/Vehicles/buckleable.yml b/Resources/Prototypes/Entities/Objects/Vehicles/buckleable.yml
index e1d3212327..08f870ef04 100644
--- a/Resources/Prototypes/Entities/Objects/Vehicles/buckleable.yml
+++ b/Resources/Prototypes/Entities/Objects/Vehicles/buckleable.yml
@@ -428,3 +428,51 @@
components:
- type: Foldable
folded: true
+
+- type: entity
+ id: VehicleWheelchair
+ parent: [BaseVehicle, BaseFoldable, BaseItem]
+ name: Wheelchair
+ description: A chair with big wheels. It looks like you can move in this on your own.
+ components:
+ - type: Vehicle
+ northOver: true
+ hasKey: true
+ northOverride: 0
+ southOverride: 0
+ - type: Sprite
+ sprite: Objects/Vehicles/wheelchair.rsi
+ layers:
+ - state: vehicle
+ map: ["enum.VehicleVisualLayers.AutoAnimate", "unfoldedLayer"]
+ - state: vehicle_folded
+ map: ["foldedLayer"]
+ visible: false
+ netsync: false
+ noRot: true
+ - type: MovementSpeedModifier
+ baseWalkSpeed: 2
+ baseSprintSpeed: 2
+ - type: Strap
+ buckleOffset: "0,0"
+ maxBuckleDistance: 1
+ - type: Fixtures
+ fixtures:
+ fix1:
+ shape:
+ !type:PhysShapeCircle
+ radius: 0.2
+ density: 360
+ restitution: 0.0
+ mask:
+ - MobMask
+ layer:
+ - TableLayer
+
+- type: entity
+ parent: VehicleWheelchair
+ id: VehicleWheelchairFolded
+ suffix: folded
+ components:
+ - type: Foldable
+ folded: true
diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml
index fd845aa8d2..9869eb8536 100644
--- a/Resources/Prototypes/Traits/disabilities.yml
+++ b/Resources/Prototypes/Traits/disabilities.yml
@@ -49,3 +49,11 @@
description: trait-uncloneable-desc
components:
- type: Uncloneable
+
+- type: trait
+ id: WheelchairBound
+ name: trait-wheelchair-bound-name
+ description: trait-wheelchair-bound-desc
+ components:
+ - type: WheelchairBound
+ - type: LegsParalyzed
diff --git a/Resources/Textures/Objects/Vehicles/wheelchair.rsi/inhand-left.png b/Resources/Textures/Objects/Vehicles/wheelchair.rsi/inhand-left.png
new file mode 100644
index 0000000000..b047753f0b
Binary files /dev/null and b/Resources/Textures/Objects/Vehicles/wheelchair.rsi/inhand-left.png differ
diff --git a/Resources/Textures/Objects/Vehicles/wheelchair.rsi/inhand-right.png b/Resources/Textures/Objects/Vehicles/wheelchair.rsi/inhand-right.png
new file mode 100644
index 0000000000..0cac500166
Binary files /dev/null and b/Resources/Textures/Objects/Vehicles/wheelchair.rsi/inhand-right.png differ
diff --git a/Resources/Textures/Objects/Vehicles/wheelchair.rsi/meta.json b/Resources/Textures/Objects/Vehicles/wheelchair.rsi/meta.json
new file mode 100644
index 0000000000..8c69fc1225
--- /dev/null
+++ b/Resources/Textures/Objects/Vehicles/wheelchair.rsi/meta.json
@@ -0,0 +1,26 @@
+{
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/8f6e48e30ff85cb58b5b0a91add4a1741b971f0f",
+ "states": [
+ {
+ "name": "vehicle",
+ "directions": 4
+ },
+ {
+ "name": "vehicle_folded"
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Objects/Vehicles/wheelchair.rsi/vehicle.png b/Resources/Textures/Objects/Vehicles/wheelchair.rsi/vehicle.png
new file mode 100644
index 0000000000..c18335d032
Binary files /dev/null and b/Resources/Textures/Objects/Vehicles/wheelchair.rsi/vehicle.png differ
diff --git a/Resources/Textures/Objects/Vehicles/wheelchair.rsi/vehicle_folded.png b/Resources/Textures/Objects/Vehicles/wheelchair.rsi/vehicle_folded.png
new file mode 100644
index 0000000000..ecc42ed4eb
Binary files /dev/null and b/Resources/Textures/Objects/Vehicles/wheelchair.rsi/vehicle_folded.png differ