Character Height Slider + Character Height Changes (#6320)

* Do the thing for everyone. Height is now +/- 20% for everyone.

* Make the height slider show height. Solve for special cases. Solve world hunger.

* Fixed some minor things.

* Adjust some densities

* Smaller character balance

* Comment

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Oops, that was from a failed thing.

* Size calc correction

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* people are tall in the future

* I need to refactor a bit still.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Refactor into a system

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* smol

* Fixed remaining scale visual components and species

* Remove MockScale. Just add scale visuals for Allalulo to compensate.

* PR feedback

* Slight refactor. Moved profile/species scale out of the scale system and put it into the HumanoidProfileSystem. Removed some CD logic that is no longer needed.

* how'd this get in there

* Move the other motorkind.yml to AprilFools dir

* NO NO_PENTALTY lol

* Other PR stuff

* Other PR stuff

* Add a dirty

* Add some networking to the comp

* Add small character to cloning

* One more fixX

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
Vanessa 2026-08-04 11:27:55 -05:00 committed by GitHub
parent 877267cd31
commit f44178bec3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
44 changed files with 258 additions and 417 deletions

View File

@ -9,6 +9,8 @@ using Content.Shared.Preferences;
using Robust.Client.UserInterface.Controls;
using Robust.Shared.Enums;
using Robust.Shared.Prototypes;
using Content.Client._CD.Records.UI; // DeltaV
using Content.Shared._DV.Body.Systems; // DeltaV
namespace Content.Client.Lobby.UI;
@ -193,6 +195,7 @@ public sealed partial class HumanoidProfileEditor
RefreshLoadouts();
UpdateSexControls(); // update sex for new species
UpdateSpeciesGuidebookIcon();
UpdateHeightControls(); // DeltaV
ReloadPreview();
}
@ -204,23 +207,22 @@ public sealed partial class HumanoidProfileEditor
ReloadProfilePreview();
}
private void UpdateHeightControls()
{
if (Profile == null)
{
return;
}
var species = _species.Find(x => x.ID == Profile.Species);
if (species != null)
_defaultHeight = species.DefaultHeight;
var prototype = _prototypeManager.Index(Profile.Species);
_defaultHeight = prototype.DefaultHeight;
var prototype = _prototypeManager.Index<SpeciesPrototype>(Profile.Species);
var sliderPercent = (Profile.Height - prototype.MinHeight) /
(prototype.MaxHeight - prototype.MinHeight);
CDHeightSlider.Value = sliderPercent;
CDHeight.Text = Profile.Height.ToString(CultureInfo.InvariantCulture);
var scaleReference = _defaultHeight * prototype.BaseScale.Y;
var newHeight = MathF.Round(MathHelper.Lerp(prototype.MinHeight, prototype.MaxHeight, sliderPercent), 2);
CDHeightLabel.Text = UnitConversion.GetMetricAndImperialDisplayFromScale(scaleReference * newHeight);
CDPullSpeedReductionLabel.Text = SmallCharacterSystem.GetPullSpeedPenaltyDisplayFromScale(newHeight);
}
// End CD - Character Records

View File

@ -73,9 +73,13 @@
<BoxContainer HorizontalExpand="True">
<Label Text="{Loc 'humanoid-profile-editor-height-label'}" />
<Control HorizontalExpand="True" />
<Label Name="CDHeightLabel" />
<Slider Name="CDHeightSlider" HorizontalAlignment="Right" SetWidth="300" MinValue="0.0" MaxValue="1.0"/>
<LineEdit HorizontalAlignment="Right" Name="CDHeight" MinSize="60 0" Text="1.0" />
<Button Name="CDHeightReset" Text="{Loc 'humanoid-profile-editor-reset-height-button'}" HorizontalAlignment="Right"/>
</BoxContainer>
<BoxContainer HorizontalExpand="True">
<Label Text="{Loc 'humanoid-profile-editor-height-pull-speed-penalty-label'}" />
<Control HorizontalExpand="True" />
<Label Name="CDPullSpeedReductionLabel" />
</BoxContainer>
<!-- End CD - Character Records -->
<!-- Sex -->

View File

@ -2,9 +2,6 @@ using Content.Client.Humanoid;
using Content.Client.Message;
using Content.Client.Players.PlayTimeTracking;
using Content.Client.Sprite;
using Content.Client.UserInterface.Systems.Guidebook;
using Content.Shared._DV.Species; // DeltaV - Species hider
using Content.Shared.Body;
using Content.Shared.CCVar;
using Content.Shared.GameTicking;
using Content.Shared.Humanoid;
@ -22,13 +19,8 @@ using Robust.Shared.ContentPack;
using Robust.Shared.Enums;
using Robust.Shared.Prototypes;
using Direction = Robust.Shared.Maths.Direction;
// Begin CD - Character Records
using System.Globalization;
using Content.Client._CD.Records.UI;
using Content.Shared._CD.Records;
// End CD - Character Records
using Content.Shared._DV.Traits;
using Content.Shared.Humanoid.Prototypes; // DV - Traits
using Content.Client._CD.Records.UI; // CD - Character Records
using Content.Shared._DV.Body.Systems; // DV - Traits
namespace Content.Client.Lobby.UI
{
@ -221,34 +213,18 @@ namespace Content.Client.Lobby.UI
// Begin CD - Character Records
#region CDHeight
CDHeight.OnTextChanged += args =>
{
if (Profile is null || !float.TryParse(args.Text, out var newHeight))
return;
var prototype = _prototypeManager.Index<SpeciesPrototype>(Profile.Species);
newHeight = MathF.Round(Math.Clamp(newHeight, prototype.MinHeight, prototype.MaxHeight), 2);
// The percentage between the start and end numbers, aka "inverse lerp"
var sliderPercent = (newHeight - prototype.MinHeight) /
(prototype.MaxHeight - prototype.MinHeight);
CDHeightSlider.Value = sliderPercent;
SetProfileHeight(newHeight);
};
CDHeightReset.OnPressed += _ =>
{
CDHeight.SetText(_defaultHeight.ToString(CultureInfo.InvariantCulture), true);
};
CDHeightSlider.OnValueChanged += _ =>
{
if (Profile is null)
return;
var prototype = _prototypeManager.Index<SpeciesPrototype>(Profile.Species);
var prototype = _prototypeManager.Index(Profile.Species);
var newHeight = MathF.Round(MathHelper.Lerp(prototype.MinHeight, prototype.MaxHeight, CDHeightSlider.Value), 2);
CDHeight.Text = newHeight.ToString(CultureInfo.InvariantCulture);
var speciesScale = prototype.BaseScale.Y;
CDHeightLabel.Text = UnitConversion.GetMetricAndImperialDisplayFromScale(newHeight * speciesScale);
CDPullSpeedReductionLabel.Text = SmallCharacterSystem.GetPullSpeedPenaltyDisplayFromScale(newHeight);
SetProfileHeight(newHeight);
};

View File

@ -49,11 +49,6 @@
<Control HorizontalExpand="True" />
<Label Name="RecordContainerSpecies" Align="Right" />
</BoxContainer>
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
<Label Text="{Loc 'humanoid-profile-editor-cd-records-height'}"/>
<Control HorizontalExpand="True" />
<Label Name="RecordContainerHeight" Align="Right" />
</BoxContainer>
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
<Label Text="{Loc 'humanoid-profile-editor-cd-records-weight'}"/>
<Control HorizontalExpand="True" />

View File

@ -325,8 +325,7 @@ public sealed partial class CharacterRecordViewer : FancyWindow
RecordContainerJob.Text = record.JobTitle; /* At some point in the future we might want to display the icon */
RecordContainerGender.Text = record.Gender.ToString();
RecordContainerSpecies.Text = record.Species;
RecordContainerHeight.Text = cr.Height + " " + UnitConversion.GetImperialDisplayLength(cr.Height);
RecordContainerWeight.Text = cr.Weight + " " + UnitConversion.GetImperialDisplayMass(cr.Weight);
RecordContainerWeight.Text = $"{cr.Weight} ({UnitConversion.GetImperialDisplayMass(cr.Weight)})";
RecordContainerContactName.SetValue(cr.EmergencyContactName);
RecordContainerEmployment.Visible = false;

View File

@ -5,12 +5,6 @@
<BoxContainer Orientation="Vertical" HorizontalExpand="True" Margin="10">
<!-- Height, Weight -->
<GridContainer Columns="2">
<BoxContainer HorizontalExpand="True" SeparationOverride="2">
<Label Text="{Loc 'humanoid-profile-editor-cd-records-height'}" />
<Control HorizontalExpand="True" MinSize="5 0" />
<LineEdit Name="HeightEdit" HorizontalAlignment="Right" MinSize="60 0" />
<Label Name="HeightImperialLabel" MinWidth="60" />
</BoxContainer>
<BoxContainer HorizontalExpand="True" SeparationOverride="2">
<Label Text="{Loc 'humanoid-profile-editor-cd-records-weight'}" />
<Control HorizontalExpand="True" MinSize="5 0" />

View File

@ -25,14 +25,6 @@ public sealed partial class RecordEditorGui : Control
#region General
HeightEdit.OnTextChanged += args =>
{
if (!int.TryParse(args.Text, out var newHeight))
return;
UpdateImperialHeight(newHeight);
UpdateRecords(_records.WithHeight(newHeight));
};
WeightEdit.OnTextChanged += args =>
{
if (!int.TryParse(args.Text, out var newWeight))
@ -128,8 +120,6 @@ public sealed partial class RecordEditorGui : Control
private void UpdateWidgets()
{
HeightEdit.SetText(_records.Height.ToString());
UpdateImperialHeight(_records.Height);
WeightEdit.SetText(_records.Weight.ToString());
UpdateImperialWeight(_records.Weight);
ContactNameEdit.SetText(_records.EmergencyContactName);
@ -143,13 +133,8 @@ public sealed partial class RecordEditorGui : Control
PostmortemEdit.SetText(_records.PostmortemInstructions);
}
private void UpdateImperialHeight(int newHeight)
{
HeightImperialLabel.Text = UnitConversion.GetImperialDisplayLength(newHeight);
}
private void UpdateImperialWeight(int newWeight)
{
WeightImperialLabel.Text = UnitConversion.GetImperialDisplayMass(newWeight);
WeightImperialLabel.Text = $"({UnitConversion.GetImperialDisplayMass(newWeight)})";
}
}

View File

@ -2,15 +2,47 @@ namespace Content.Client._CD.Records.UI;
public static class UnitConversion
{
/// <summary>
/// DeltaV - The average height of a human in centimeters. According to the US CDC, its
/// 171 for men and 160 for women. So average of that is ~165cm.
///
/// Just kidding, we're going with EE's arbitrary standard of 175cm.
/// </summary>
private const int AVERAGE_HEIGHT_CM = 175;
/// <summary>
/// DeltaV - 1.0 scale is considered average for humans, so a scale of 1 will be 175cm.
/// Ensure that scale also includes the base species height AND the user-defined height.
/// </summary>
/// <param name="scale"></param>
/// <returns></returns>
private static int GetMetricHeightFromScale(float scale = 1)
{
// cast as int because we don't care about decimal
return (int)Math.Max(scale * AVERAGE_HEIGHT_CM, 1); // can't be shorter than 1cm I guess
}
/// <summary>
/// DeltaV - Gets nicely formatted string that contains both metric and imperial measurements.
/// With a scale of 1, it should look like... 175cm (5' 9")
/// </summary>
/// <param name="scale"></param>
/// <returns></returns>
public static string GetMetricAndImperialDisplayFromScale(float scale = 1)
{
var metricHeight = GetMetricHeightFromScale(scale);
return $"{metricHeight}cm ({GetImperialDisplayLength(metricHeight)})";
}
public static string GetImperialDisplayLength(int lengthCm)
{
var heightIn = (int) Math.Round(lengthCm * 0.3937007874 /* cm to in*/);
return $"({heightIn / 12}'{heightIn % 12}'')";
var heightIn = (int)Math.Round(lengthCm * 0.3937007874 /* cm to in*/);
return $"{heightIn / 12}'{heightIn % 12}\"";
}
public static string GetImperialDisplayMass(int massKg)
{
var weightLbs = (int) Math.Round(massKg * 2.2046226218 /* kg to lbs */);
return $"({weightLbs} lbs)";
var weightLbs = (int)Math.Round(massKg * 2.2046226218 /* kg to lbs */);
return $"{weightLbs} lbs";
}
}

View File

@ -1,9 +1,7 @@
using System.Linq;
using System.Numerics;
using Content.Shared._DV.Humanoid;
using Content.Shared._DV.Humanoid; // DeltaV
using Content.Shared.Humanoid.Markings;
using Content.Shared.Humanoid;
using Content.Shared.Sprite;
using Robust.Shared.Containers;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
@ -18,7 +16,6 @@ public abstract partial class SharedVisualBodySystem : EntitySystem
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly MarkingManager _marking = default!;
[Dependency] private readonly SharedContainerSystem _container = default!;
[Dependency] private readonly SharedScaleVisualsSystem _scaleVisualsSystem = default!;
public override void Initialize()
{
@ -28,7 +25,6 @@ public abstract partial class SharedVisualBodySystem : EntitySystem
SubscribeLocalEvent<VisualOrganMarkingsComponent, BodyRelayedEvent<OrganCopyAppearanceEvent>>(OnMarkingsOrganCopyAppearance);
SubscribeLocalEvent<VisualOrganComponent, BodyRelayedEvent<ApplyOrganProfileDataEvent>>(OnVisualOrganApplyProfile);
SubscribeLocalEvent<VisualOrganMarkingsComponent, BodyRelayedEvent<ApplyOrganMarkingsEvent>>(OnMarkingsOrganApplyMarkings);
SubscribeLocalEvent<HumanoidProfileComponent, ApplyOrganProfileDataEvent>(OnApplyOrganProfileData); // Delta V - Taking the solution from CD
InitializeModifiers();
InitializeInitial();
@ -100,36 +96,9 @@ public abstract partial class SharedVisualBodySystem : EntitySystem
if (!other.Layer.Equals(ent.Comp.Layer))
return;
// Delta V - Begin Fix Height for Cloning
var height = other.Profile.Height;
if (TryComp<HumanoidProfileComponent>(args.Body.Owner, out var component))
ScaleBody((args.Body.Owner, component), height, height);
// Delta V - End
SetOrganAppearance(ent, other.Data);
}
// Delta V - BEGIN CD Solution
private void OnApplyOrganProfileData(Entity<HumanoidProfileComponent> entity, ref ApplyOrganProfileDataEvent args)
{
var speciesPrototype = _prototype.Index(entity.Comp.Species);
if (args.Base == null)
return;
var height = Math.Clamp(MathF.Round(args.Base.Value.Height, 2), speciesPrototype.MinHeight, speciesPrototype.MaxHeight);
ScaleBody(entity, speciesPrototype.ScaleHeight ? height : 1f, height);
}
private void ScaleBody(Entity<HumanoidProfileComponent> entity, float heightX, float heightY)
{
_scaleVisualsSystem.SetSpriteScale(
entity.Owner,
new Vector2(heightX, heightY)
);
}
// Delta V - END
private void OnMarkingsOrganCopyAppearance(Entity<VisualOrganMarkingsComponent> ent, ref BodyRelayedEvent<OrganCopyAppearanceEvent> args)
{

View File

@ -1,7 +1,9 @@
using System.Numerics; // DeltaV
using Content.Shared.Examine;
using Content.Shared.Humanoid.Prototypes;
using Content.Shared.IdentityManagement;
using Content.Shared.Preferences;
using Content.Shared.Sprite; // DeltaV
using Robust.Shared.GameObjects.Components.Localization;
using Robust.Shared.Prototypes;
@ -11,6 +13,7 @@ public sealed class HumanoidProfileSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly GrammarSystem _grammar = default!;
[Dependency] private readonly SharedScaleVisualsSystem _scale = default!; // DeltaV
public override void Initialize()
{
@ -28,6 +31,7 @@ public sealed class HumanoidProfileSystem : EntitySystem
ent.Comp.Age = profile.Age;
ent.Comp.Species = profile.Species;
ent.Comp.Sex = profile.Sex;
ent.Comp.Height = profile.Height; // DeltaV
Dirty(ent);
var sexChanged = new SexChangedEvent(ent.Comp.Sex, profile.Sex);
@ -37,6 +41,19 @@ public sealed class HumanoidProfileSystem : EntitySystem
{
_grammar.SetGender((ent, grammar), profile.Gender);
}
// START DeltaV - Apply profile/species size
Vector2 scale = new(profile.Height, profile.Height);
// If visuals already exist, then re-apply
if (TryComp<ScaleVisualsComponent>(ent, out var scaledVisuals))
scale *= scaledVisuals.Scale;
var speciesProto = _prototype.Index(profile.Species);
scale *= speciesProto.BaseScale;
_scale.SetSpriteScale(ent, scale);
// END DeltaV
}
private void OnExamined(Entity<HumanoidProfileComponent> ent, ref ExaminedEvent args)

View File

@ -1,3 +1,4 @@
using System.Numerics; // DeltaV
using Content.Shared.Body;
using Content.Shared.Dataset;
using Content.Shared.Humanoid.Markings;
@ -111,7 +112,7 @@ public sealed partial class SpeciesPrototype : IPrototype
/// The base height scale for this species
/// </summary>
[DataField("baseScale")]
public System.Numerics.Vector2 BaseScale = new(1f, 1f);
public Vector2 BaseScale = new(1f, 1f);
// End DV - CD Character Records shouldn't nuke species heights
// Begin CD - Character Records
@ -119,13 +120,13 @@ public sealed partial class SpeciesPrototype : IPrototype
/// The minimum height for this species
/// </summary>
[DataField("minHeight")]
public float MinHeight = 0.9f; // DeltaV - less trolling with the heights
public float MinHeight = 0.8f; // DeltaV
/// <summary>
/// The maximum height for this species
/// </summary>
[DataField("maxHeight")]
public float MaxHeight = 1.1f; // DeltaV - less trolling with the heights
public float MaxHeight = 1.2f; // DeltaV
/// <summary>
/// The default height for this species

View File

@ -1,3 +1,5 @@
using Content.Shared._DV.Body.Components; // DeltaV
using Content.Shared._DV.Body.Systems; // DeltaV
using Content.Shared._ST.Interaction; // Stellar - interaction particles
using Content.Shared._Floof.OfferItem; // Floof
using Content.Shared.ActionBlocker;
@ -10,6 +12,7 @@ using Content.Shared.Database;
using Content.Shared.Hands;
using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Humanoid; // DeltaV
using Content.Shared.IdentityManagement;
using Content.Shared.Input;
using Content.Shared.Interaction;
@ -55,6 +58,7 @@ public sealed class PullingSystem : EntitySystem
[Dependency] private readonly HeldSpeedModifierSystem _clothingMoveSpeed = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly SharedVirtualItemSystem _virtual = default!;
[Dependency] private readonly SmallCharacterSystem _smallCharacter = default!; // DeltaV
public override void Initialize()
{
@ -295,6 +299,14 @@ public sealed class PullingSystem : EntitySystem
private void OnRefreshMovespeed(EntityUid uid, PullerComponent component, RefreshMovementSpeedModifiersEvent args)
{
// BEGIN DeltaV - Slow if smaller puller
if (TryComp<SmallCharacterComponent>(uid, out var smol))
{
var sizePenalty = _smallCharacter.ApplyPullSpeedPenalty((uid, smol), component.Pulling);
args.ModifySpeed(sizePenalty, sizePenalty);
}
// END DeltaV
if (TryComp<HeldSpeedModifierComponent>(component.Pulling, out var heldMoveSpeed) && component.Pulling.HasValue)
{
var (walkMod, sprintMod) =

View File

@ -177,7 +177,7 @@ namespace Content.Shared.Preferences
_traitPreferences = traitPreferences;
_loadouts = loadouts;
// Begin CD - Character Records
Height = height;
Height = height; // This is the user-set scale on the profile editor. Not actual height measurements.
CDCharacterRecords = cdCharacterRecords;
// End CD - Character Records

View File

@ -24,12 +24,4 @@ public sealed partial class ScaleVisualsComponent : Component
[DataField]
[ViewVariables]
public Vector2? OriginalScale;
// Delta V Addition
/// <summary>
/// Base Scale of the Species, which we use to set a new height relative to this.
/// </summary>
[DataField, AutoNetworkedField]
[ViewVariables]
public Vector2 SpeciesScale = Vector2.One;
}

View File

@ -41,13 +41,8 @@ public abstract class SharedScaleVisualsSystem : EntitySystem
comp.Scale = scale;
Dirty(uid, comp);
// Delta V - Begin Species Scaling
// 120% species scale => add 0.2 to scale
var newScale = scale + comp.SpeciesScale - Vector2.One;
// Delta V - End Species Scaling
var appearanceComponent = EnsureComp<AppearanceComponent>(uid);
_appearance.SetData(uid, ScaleVisuals.Scale, newScale /* Delta V - Custom Species Scale */, appearanceComponent);
_appearance.SetData(uid, ScaleVisuals.Scale, scale, appearanceComponent);
// Raise an event for content use.
var ev = new ScaleEntityEvent(uid, scale);

View File

@ -0,0 +1,23 @@
using Content.Shared._DV.Body.Systems;
using Robust.Shared.GameStates;
namespace Content.Shared._DV.Body.Components;
/// <summary>
/// If an entity has this, if a small character has penalties (such as pull speed),
/// the small character will ignore the penalties associated with their size.
///
/// Mostly used for things like wheeled/floating objects.
/// </summary>
[RegisterComponent, NetworkedComponent]
[AutoGenerateComponentState]
[Access(typeof(SmallCharacterSystem))]
public sealed partial class SmallCharacterComponent : Component
{
/// <summary>
/// The speed of which to scale the small character's pull speed by if the
/// object is big enough to warrant a pull-speed slowdown.
/// </summary>
[DataField, AutoNetworkedField]
public float PullSpeedPenalty = 1f;
}

View File

@ -0,0 +1,12 @@
namespace Content.Shared._DV.Body.Components;
/// <summary>
/// If an entity has this, if a small character has penalties (such as pull speed),
/// the small character will ignore the penalties associated with their size.
///
/// Mostly used for things like wheeled/floating objects.
///
/// See <see cref="Systems.SmallCharacterSystem"/>
/// </summary>
[RegisterComponent]
public sealed partial class UnaffectedBySizePenaltyComponent : Component;

View File

@ -0,0 +1,97 @@
using Content.Shared._DV.Body.Components;
using Content.Shared.GameTicking;
using Content.Shared.Humanoid;
using Content.Shared.Item;
using JetBrains.Annotations;
using Robust.Shared.Physics.Components;
namespace Content.Shared._DV.Body.Systems;
/// <summary>
/// Used to relay or subscribe to events if a character's scale is 1.0 or below.
/// This is only used for the height slider scale.
/// </summary>
public sealed partial class SmallCharacterSystem : EntitySystem
{
private const float NO_PENALTY = 1.0f;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PlayerSpawnCompleteEvent>(OnSpawn);
}
private void OnSpawn(PlayerSpawnCompleteEvent ev)
{
if (TryComp<HumanoidProfileComponent>(ev.Mob, out var profile))
ApplySmallCharacter(ev.Mob, profile.Height);
}
[PublicAPI]
public float ApplyPullSpeedPenalty(Entity<SmallCharacterComponent?> puller, EntityUid? pulledEntity)
{
// Ignore if they aren't pulling anything...
if (!pulledEntity.HasValue)
return NO_PENALTY;
// Ignore if they aren't a small character in the first place
if (!Resolve(puller, ref puller.Comp, false))
return NO_PENALTY;
// If the pulled entity has the component that ignores the penalty
if (HasComp<UnaffectedBySizePenaltyComponent>(pulledEntity))
return NO_PENALTY;
// Ignore if it's an item that can be held or stored. It would be weird to
// slow by X% from pulling a piece of paper or a gun when you can just hold it
// and not suffer from a penalty.
if (HasComp<ItemComponent>(pulledEntity))
return NO_PENALTY;
// Ignore if the object is floating in the air.
if (TryComp<PhysicsComponent>(pulledEntity, out var pulledPhysics)
&& pulledPhysics.BodyStatus == BodyStatus.InAir)
return NO_PENALTY;
return puller.Comp.PullSpeedPenalty;
}
#region Static Members
/// <summary>
/// Gets the move-speed penalty as a float. Should be applied multiplicatively.
/// Caps at 1 so we don't make bigger characters faster when pulling.
/// </summary>
/// <returns></returns>
[PublicAPI]
public static float GetPullSpeedPenaltyFromScale(float scale = 1.0f)
{
return Math.Min(scale * scale, 1);
}
/// <summary>
/// Calculates a well-formed display string of the pull speed penalty.
/// Used primarily in the character editor to get the well-formed percent
/// without having to duplicate formulas.
/// </summary>
/// <param name="scale"></param>
/// <returns></returns>
[PublicAPI]
public static string GetPullSpeedPenaltyDisplayFromScale(float scale = 1.0f)
{
return $"{Math.Round((1 - GetPullSpeedPenaltyFromScale(scale)) * 100)}%";
}
#endregion
#region Private Members
private void ApplySmallCharacter(EntityUid uid, float scale = 1)
{
if (scale >= 1)
return;
// The character scale is stored in the HumanoidProfileComponent if you ever
// need it.
var comp = EnsureComp<SmallCharacterComponent>(uid);
comp.PullSpeedPenalty = GetPullSpeedPenaltyFromScale(scale);
Dirty(uid, comp);
}
#endregion
}

View File

@ -1,2 +1,3 @@
humanoid-profile-editor-height-label = Height:
humanoid-profile-editor-height-label = Size - Height:
humanoid-profile-editor-height-pull-speed-penalty-label = Size - Pull Speed Reduction:
humanoid-profile-editor-reset-height-button = Reset

View File

@ -34,8 +34,8 @@
Kidneys: OrganHumanKidneys
- type: HumanoidProfile
species: Dwarf
- type: ScaleVisuals
scale: 1, 0.8
#- type: ScaleVisuals # DeltaV - Scale defined at species level
# scale: 1, 0.8
- type: entity
parent:

View File

@ -63,6 +63,8 @@
- SpanishAccent
- StutteringAccent
# Begin DeltaV Additions
- ScaleVisuals # Preserve species/profile height
- SmallCharacter
- Addicted
- DogVision
- FrenchAccent

View File

@ -69,3 +69,4 @@
components:
- type: TileFrictionModifier
modifier: 0.4
- type: UnaffectedBySizePenalty # DeltaV - Wheels make it easy to move

View File

@ -5,3 +5,4 @@
prototype: MobDwarf
dollPrototype: AppearanceDwarf
skinColoration: HumanToned
baseScale: 1, 0.8 # DeltaV - used instead of ScaleVisuals on body

View File

@ -9,7 +9,4 @@
maleFirstNames: NamesFirstMale
femaleFirstNames: NamesFirstFemale
lastNames: NamesLast
minHeight: 0.8
maxHeight: 1.05
# Delta V - Nubody Merge, at lot moved into other files
baseScale: 0.9, 0.9

View File

@ -114,8 +114,6 @@
Kidneys: OrganHumanKidneys
- type: HumanoidProfile
species: Motorkind
- type: ScaleVisuals
speciesScale: 2, 2
- type: entity
name: Urist McQueen

View File

@ -60,8 +60,6 @@
Kidneys: OrganHumanKidneys
- type: HumanoidProfile
species: Felinid
- type: ScaleVisuals
speciesScale: 0.75, 0.75
- type: entity
parent:

View File

@ -41,6 +41,7 @@
- type: entity
parent: BaseSpeciesAppearance
id: AppearanceHarpy
name: harpy appearance
components:
- type: Inventory
speciesId: harpy
@ -75,8 +76,6 @@
Kidneys: OrganHumanKidneys
- type: HumanoidProfile
species: Harpy
- type: ScaleVisuals
speciesScale: 0.9, 0.9
- type: entity
parent:

View File

@ -64,8 +64,6 @@
Kidneys: OrganHumanKidneys
- type: HumanoidProfile
species: Oni
- type: ScaleVisuals
speciesScale: 1.2, 1.2
- type: entity
parent:

View File

@ -94,8 +94,6 @@
Kidneys: OrganAnimalKidneys
- type: HumanoidProfile
species: Ovinia
- type: ScaleVisuals
scale: 0.9, 0.9
- type: entity
parent:
@ -110,7 +108,7 @@
shape:
!type:PhysShapeCircle
radius: 0.35
density: 215 # sheep be heavy
density: 200 # sheep be heavy
restitution: 0.0
mask:
- MobMask

View File

@ -70,8 +70,6 @@
Kidneys: OrganHumanKidneys
- type: HumanoidProfile
species: Rodentia
- type: ScaleVisuals
speciesScale: 0.8, 0.8
- type: entity
parent:

View File

@ -75,8 +75,6 @@
Kidneys: OrganShadekinKidneys
- type: HumanoidProfile
species: Shadekin
- type: ScaleVisuals
scale: 0.9, 0.9
- type: entity

View File

@ -9,7 +9,4 @@
maleFirstNames: NamesMotorkindFirst
femaleFirstNames: NamesMotorkindFirst
lastNames: NamesMotorkindLast
baseScale: "2.0, 2.0"
minHeight: 0.8
maxHeight: 1.2
defaultHeight: 1.0
baseScale: 2.0, 2.0

View File

@ -9,5 +9,4 @@
femaleFirstNames: NamesOniFemale
lastNames: NamesOniLocation
naming: LastNoFirst
baseScale: "1.2, 1.2"
maxHeight: 1.05
baseScale: 1.1, 1.1

View File

@ -5,5 +5,4 @@
prototype: MobFelinid
dollPrototype: AppearanceFelinid
skinColoration: Hues
baseScale: "0.8, 0.8"
minHeight: 0.95
baseScale: 0.8, 0.8

View File

@ -5,8 +5,4 @@
prototype: MobHarpy
dollPrototype: AppearanceHarpy
skinColoration: HumanToned
baseScale: "0.9, 0.9"
# Delta V Start - Due to the actual real world variance in avian size, I changed the range to be slightly wider, allowing for much larger, and smaller, Harpies, without going into territory deemed unfair.
minHeight: 0.75
maxHeight: 1.25
# Delta V End
baseScale: 0.95, 0.95

View File

@ -5,6 +5,4 @@
prototype: MobKitsune
dollPrototype: AppearanceKitsune
skinColoration: HumanToned
baseScale: 1, 1
minHeight: .85
maxHeight: 1.05
baseScale: 0.9, 0.9

View File

@ -11,4 +11,3 @@
lastNames: NamesRodentiaLast
naming: LastFirst
baseScale: 0.8, 0.8
minHeight: .85

View File

@ -102,8 +102,6 @@
Kidneys: OrganHumanKidneys
- type: HumanoidProfile
species: Thaven
- type: ScaleVisuals
speciesScale: 1.0, 1.05
- type: entity
parent:
@ -148,7 +146,7 @@
shape:
!type:PhysShapeCircle
radius: 0.35
density: 120
density: 180
restitution: 0.0
mask:
- MobMask

View File

@ -1,5 +1,5 @@
- type: entity
save: false
name: Uristia Mc-hands
name: Urist McShorty
parent: BaseMobAllulalo
id: MobAllulalo

View File

@ -1,6 +1,6 @@
- type: entity
save: false
name: Uristia Mc-Hands
name: Uristia McShorty
parent:
- AppearanceAllulalo
- BaseSpeciesMobOrganic
@ -119,103 +119,6 @@
- type: Carriable # Delta V - grips the bird
freeHandsRequired: 1
# Begin Delta V Removals - Nubody
# - type: HumanoidAppearance
# species: Allulalo
# hideLayersOnEquip:
# - Hair
# - Snout
# - HeadTop
# - HeadSide
# - LLeg
# - RLeg
# - LFoot
# - RFoot
#- type: entity
# parent: BaseSpeciesDummy
# id: MobAllulaloDummy
# categories: [ HideSpawnMenu ]
# components:
# - type: Sprite
# scale: 1, 1
# - type: Inventory
# speciesId: allulalo
# templateId: allulalo
# displacements:
# jumpsuit:
# sizeMaps:
# 32:
# sprite: _Impstation/Mobs/Species/Allulalo/displacement.rsi
# state: jumpsuit
# head:
# sizeMaps:
# 32:
# sprite: _Impstation/Mobs/Species/Allulalo/displacement.rsi
# state: head
# eyes:
# sizeMaps:
# 32:
# sprite: _Impstation/Mobs/Species/Allulalo/displacement.rsi
# state: glasses
# ears:
# sizeMaps:
# 32:
# sprite: _Impstation/Mobs/Species/Allulalo/displacement.rsi
# state: ears
# mask:
# sizeMaps:
# 32:
# sprite: _Impstation/Mobs/Species/Allulalo/displacement.rsi
# state: mask
# neck:
# sizeMaps:
# 32:
# sprite: _Impstation/Mobs/Species/Allulalo/displacement.rsi
# state: neck
# outerClothing:
# sizeMaps:
# 32:
# sprite: _Impstation/Mobs/Species/Allulalo/displacement.rsi
# state: outerClothing
# gloves:
# sizeMaps:
# 32:
# sprite: _Impstation/Mobs/Species/Allulalo/displacement.rsi
# state: hands
# shoes:
# sizeMaps:
# 32:
# sprite: _Impstation/Mobs/Species/Allulalo/displacement.rsi
# state: feet
# belt:
# sizeMaps:
# 32:
# sprite: _Impstation/Mobs/Species/Allulalo/displacement.rsi
# state: belt
# back:
# sizeMaps:
# 32:
# sprite: _Impstation/Mobs/Species/Allulalo/displacement.rsi
# state: back
# suitstorage:
# sizeMaps:
# 32:
# sprite: _Impstation/Mobs/Species/Allulalo/displacement.rsi
# state: suitstorage
# - type: Hands
# leftHandDisplacement:
# sizeMaps:
# 32:
# sprite: Mobs/Species/Vox/displacement.rsi
# state: hand_l
# rightHandDisplacement:
# sizeMaps:
# 32:
# sprite: Mobs/Species/Vox/displacement.rsi
# state: hand_r
# End Delta V Removals
# Begin Delta V addition - Nubody
- type: entity
parent: BaseSpeciesAppearance
@ -319,6 +222,13 @@
Kidneys: OrganHumanKidneys
- type: HumanoidProfile
species: Allulalo
# BEGIN DeltaV
# Allulalo are weird because they are small yet base scale 1.0 BUT since the height system uses
# base scale to determine the metric/imperial height values, so we're just correcting the scale
# because Allulalo have to be the special kid on the block.
- type: ScaleVisuals
scale: 2.0, 2.0
# END DeltaV
- type: entity
parent: OrganBase

View File

@ -4,7 +4,6 @@
roundStart: true
prototype: MobAllulalo
defaultSkinTone: "#385878"
#markingLimits: MobAllulaloMarkingLimits # Delta V - Nubody
dollPrototype: AppearanceAllulalo # Delta V - Nubody
skinColoration: Hues
maleFirstNames: AllulaloFirstNames
@ -14,150 +13,4 @@
- Male
- Female
- Unsexed
# Begin Delta V Removals - Changes for Nubody
#- type: speciesBaseSprites
# id: MobAllulaloSprites
# sprites:
# TailBehind: MobHumanoidAnyMarking # floof
# TailOversuit: MobHumanoidAnyMarking # floof
# Eyes: MobAllulaloEyes
# Head: MobAllulaloHead
# HeadTop: MobHumanoidAnyMarking
# Hair: MobHumanoidAnyMarking
# Chest: MobAllulaloTorso
# LArm: MobAllulaloLArm
# RArm: MobAllulaloRArm
# LHand: MobAllulaloLHand
# LLeg: MobAllulaloLLeg
# RLeg: MobAllulaloRLeg
# LFoot: MobAllulaloLFoot
# RFoot: MobAllulaloRFoot
# Tail: MobHumanoidAnyMarking
# Snout: MobHumanoidAnyMarking
#
#- type: markingPoints
# id: MobAllulaloMarkingLimits
# onlyWhitelisted: true
# points:
# Hair:
# points: 1
# required: false
# Eyes:
# points: 1
# required: true
# defaultMarkings: [ AllulaloEyesDefault ]
# Head:
# points: 3
# required: false
# HeadTop:
# points: 1
# required: false
# UndergarmentTop:
# points: 1
# required: false
# Chest:
# points: 2
# required: false
# Tail:
# points: 1
# required: true
# defaultMarkings: [ AllulaloTailDefault ]
# Snout:
# points: 1
# required: false
# Overlay:
# points: 1
# required: false
# Arms:
# points: 1
# required: true
# defaultMarkings: [ AllulaloWingsDefault ]
# Legs:
# points: 2
# required: false
#
#- type: humanoidBaseSprite
# id: MobAllulaloEyes
# baseSprite:
# sprite: _Impstation/Mobs/Species/Allulalo/parts.rsi
# state: eyes
#
#- type: humanoidBaseSprite
# id: MobAllulaloHead
# baseSprite:
# sprite: _Impstation/Mobs/Species/Allulalo/parts.rsi
# state: head
#
#- type: humanoidBaseSprite
# id: MobAllulaloHeadMale
# baseSprite:
# sprite: _Impstation/Mobs/Species/Allulalo/parts.rsi
# state: head
#
#- type: humanoidBaseSprite
# id: MobAllulaloHeadFemale
# baseSprite:
# sprite: _Impstation/Mobs/Species/Allulalo/parts.rsi
# state: head
#
#- type: humanoidBaseSprite
# id: MobAllulaloTorso
# baseSprite:
# sprite: _Impstation/Mobs/Species/Allulalo/parts.rsi
# state: torso
#
#- type: humanoidBaseSprite
# id: MobAllulaloTorsoMale
# baseSprite:
# sprite: _Impstation/Mobs/Species/Allulalo/parts.rsi
# state: torso
#
#- type: humanoidBaseSprite
# id: MobAllulaloTorsoFemale
# baseSprite:
# sprite: _Impstation/Mobs/Species/Allulalo/parts.rsi
# state: torso
#
#- type: humanoidBaseSprite
# id: MobAllulaloLLeg
# baseSprite:
# sprite: _Impstation/Mobs/Species/Allulalo/parts.rsi
# state: l_leg
#
#- type: humanoidBaseSprite
# id: MobAllulaloLHand
# baseSprite:
# sprite: _Impstation/Mobs/Species/Allulalo/parts.rsi
# state: hands
#
#- type: humanoidBaseSprite
# id: MobAllulaloLArm
# baseSprite:
# sprite: _Impstation/Mobs/Species/Allulalo/parts.rsi
# state: l_arm
#
#- type: humanoidBaseSprite
# id: MobAllulaloLFoot
# baseSprite:
# sprite: _Impstation/Mobs/Species/Allulalo/parts.rsi
# state: l_foot
#
#- type: humanoidBaseSprite
# id: MobAllulaloRLeg
# baseSprite:
# sprite: _Impstation/Mobs/Species/Allulalo/parts.rsi
# state: r_leg
#
#- type: humanoidBaseSprite
# id: MobAllulaloRArm
# baseSprite:
# sprite: _Impstation/Mobs/Species/Allulalo/parts.rsi
# state: r_arm
#
#- type: humanoidBaseSprite
# id: MobAllulaloRFoot
# baseSprite:
# sprite: _Impstation/Mobs/Species/Allulalo/parts.rsi
# state: r_foot
# End Delta V Removals
baseScale: 0.5, 0.5 # they smol

View File

@ -14,5 +14,4 @@
- Female
- Unsexed
baseScale: "1, 1.05" # DeltaV - make sure Thaven are still scaled w/ CD records
maxHeight: 1.05 # DeltaV

View File

@ -10,4 +10,3 @@
maleFirstNames: names_avali_unisex
femaleFirstNames: names_avali_unisex
naming: First
minHeight: 0.8 # DeltaV - ability to be slightly shorter than humans