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