[feat] Custom name for clown, mime and borgs

This commit is contained in:
rhailrake
2023-05-04 13:44:24 +06:00
committed by Aviu00
parent f04400926e
commit 68e52f60c9
18 changed files with 3124 additions and 43 deletions

View File

@@ -19,7 +19,31 @@ namespace Content.Client.Preferences.UI
if (Profile == null) return; if (Profile == null) return;
var name = HumanoidCharacterProfile.GetName(Profile.Species, Profile.Gender); var name = HumanoidCharacterProfile.GetName(Profile.Species, Profile.Gender);
SetName(name); SetName(name);
UpdateNameEdit(); UpdateNamesEdit();
}
private void RandomizeClownName()
{
if (Profile == null) return;
var name = HumanoidCharacterProfile.GetClownName();
SetClownName(name);
UpdateNamesEdit();
}
private void RandomizeMimeName()
{
if (Profile == null) return;
var name = HumanoidCharacterProfile.GetMimeName();
SetMimeName(name);
UpdateNamesEdit();
}
private void RandomizeBorgName()
{
if (Profile == null) return;
var name = HumanoidCharacterProfile.GetBorgName();
SetBorgName(name);
UpdateNamesEdit();
} }
} }
} }

View File

@@ -19,6 +19,21 @@
<LineEdit Name="CNameEdit" MinSize="270 0" VerticalAlignment="Center" Margin="5 0 0 0" /> <LineEdit Name="CNameEdit" MinSize="270 0" VerticalAlignment="Center" Margin="5 0 0 0" />
<Button Name="CNameRandomize" Text="{Loc 'humanoid-profile-editor-name-random-button'}" /> <Button Name="CNameRandomize" Text="{Loc 'humanoid-profile-editor-name-random-button'}" />
</BoxContainer> </BoxContainer>
<BoxContainer Orientation="Horizontal" VerticalExpand="True">
<Label Text="{Loc 'humanoid-profile-editor-clown-name-label'}" />
<LineEdit Name="CClownNameEdit" MinSize="270 0" VerticalAlignment="Center" Margin="5 0 0 0" />
<Button Name="CClownNameRandomize" Text="{Loc 'humanoid-profile-editor-name-random-button'}" />
</BoxContainer>
<BoxContainer Orientation="Horizontal" VerticalExpand="True">
<Label Text="{Loc 'humanoid-profile-editor-mime-name-label'}" />
<LineEdit Name="CMimeNameEdit" MinSize="270 0" VerticalAlignment="Center" Margin="5 0 0 0" />
<Button Name="CMimeNameRandomize" Text="{Loc 'humanoid-profile-editor-name-random-button'}" />
</BoxContainer>
<BoxContainer Orientation="Horizontal" VerticalExpand="True">
<Label Text="{Loc 'humanoid-profile-editor-borg-name-label'}" />
<LineEdit Name="CBorgNameEdit" MinSize="270 0" VerticalAlignment="Center" Margin="5 0 0 0" />
<Button Name="CBorgNameRandomize" Text="{Loc 'humanoid-profile-editor-name-random-button'}" />
</BoxContainer>
<Button Name="CRandomizeEverything" HorizontalAlignment="Center" <Button Name="CRandomizeEverything" HorizontalAlignment="Center"
HorizontalExpand="False" MaxWidth="256" HorizontalExpand="False" MaxWidth="256"
Text="{Loc 'humanoid-profile-editor-randomize-everything-button'}" /> Text="{Loc 'humanoid-profile-editor-randomize-everything-button'}" />

View File

@@ -69,7 +69,13 @@ namespace Content.Client.Preferences.UI
private LineEdit _ageEdit => CAgeEdit; private LineEdit _ageEdit => CAgeEdit;
private LineEdit _nameEdit => CNameEdit; private LineEdit _nameEdit => CNameEdit;
private TextEdit _flavorTextEdit = null!; private TextEdit _flavorTextEdit = null!;
private LineEdit _nameClownEdit => CClownNameEdit;
private LineEdit _nameMimeEdit => CMimeNameEdit;
private LineEdit _nameBorgEdit => CBorgNameEdit;
private Button _nameRandomButton => CNameRandomize; private Button _nameRandomButton => CNameRandomize;
private Button _nameClownRandomButton => CClownNameRandomize;
private Button _nameMimeRandomButton => CMimeNameRandomize;
private Button _nameBorgRandomButton => CBorgNameRandomize;
private Button _randomizeEverythingButton => CRandomizeEverything; private Button _randomizeEverythingButton => CRandomizeEverything;
private RichTextLabel _warningLabel => CWarningLabel; private RichTextLabel _warningLabel => CWarningLabel;
private Button _saveButton => CSaveButton; private Button _saveButton => CSaveButton;
@@ -136,7 +142,13 @@ namespace Content.Client.Preferences.UI
#region Name #region Name
_nameEdit.OnTextChanged += args => { SetName(args.Text); }; _nameEdit.OnTextChanged += args => { SetName(args.Text); };
_nameClownEdit.OnTextChanged += args => { SetClownName(args.Text); };
_nameMimeEdit.OnTextChanged += args => { SetMimeName(args.Text); };
_nameBorgEdit.OnTextChanged += args => { SetBorgName(args.Text); };
_nameRandomButton.OnPressed += args => RandomizeName(); _nameRandomButton.OnPressed += args => RandomizeName();
_nameClownRandomButton.OnPressed += args => RandomizeClownName();
_nameMimeRandomButton.OnPressed += args => RandomizeMimeName();
_nameBorgRandomButton.OnPressed += args => RandomizeBorgName();
_randomizeEverythingButton.OnPressed += args => { RandomizeEverything(); }; _randomizeEverythingButton.OnPressed += args => { RandomizeEverything(); };
_warningLabel.SetMarkup($"[color=red]{Loc.GetString("humanoid-profile-editor-naming-rules-warning")}[/color]"); _warningLabel.SetMarkup($"[color=red]{Loc.GetString("humanoid-profile-editor-naming-rules-warning")}[/color]");
@@ -817,6 +829,24 @@ namespace Content.Client.Preferences.UI
IsDirty = true; IsDirty = true;
} }
private void SetClownName(string newName)
{
Profile = Profile?.WithClownName(newName);
IsDirty = true;
}
private void SetMimeName(string newName)
{
Profile = Profile?.WithMimeName(newName);
IsDirty = true;
}
private void SetBorgName(string newName)
{
Profile = Profile?.WithBorgName(newName);
IsDirty = true;
}
private void SetClothing(ClothingPreference newClothing) private void SetClothing(ClothingPreference newClothing)
{ {
Profile = Profile?.WithClothingPreference(newClothing); Profile = Profile?.WithClothingPreference(newClothing);
@@ -852,9 +882,12 @@ namespace Content.Client.Preferences.UI
} }
} }
private void UpdateNameEdit() private void UpdateNamesEdit()
{ {
_nameEdit.Text = Profile?.Name ?? ""; _nameEdit.Text = Profile?.Name ?? "";
_nameClownEdit.Text = Profile?.ClownName ?? "";
_nameMimeEdit.Text = Profile?.MimeName ?? "";
_nameBorgEdit.Text = Profile?.BorgName ?? "";
} }
private void UpdateFlavorTextEdit() private void UpdateFlavorTextEdit()
@@ -1134,8 +1167,10 @@ namespace Content.Client.Preferences.UI
public void UpdateControls() public void UpdateControls()
{ {
if (Profile is null) return; if (Profile is null)
UpdateNameEdit(); return;
UpdateNamesEdit();
UpdateFlavorTextEdit(); UpdateFlavorTextEdit();
UpdateSexControls(); UpdateSexControls();
UpdateGenderControls(); UpdateGenderControls();

View File

@@ -40,6 +40,9 @@ namespace Content.IntegrationTests.Tests.Preferences
{ {
return new( return new(
"Charlie Charlieson", "Charlie Charlieson",
"HONK",
"Quiet",
"Silicon",
"The biggest boy around.", "The biggest boy around.",
"Human", "Human",
"Eugene", "Eugene",

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,48 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Content.Server.Database.Migrations.Postgres
{
public partial class CATaddNamesToProfile : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "borg_name",
table: "profile",
type: "text",
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "clown_name",
table: "profile",
type: "text",
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "mime_name",
table: "profile",
type: "text",
nullable: false,
defaultValue: "");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "borg_name",
table: "profile");
migrationBuilder.DropColumn(
name: "clown_name",
table: "profile");
migrationBuilder.DropColumn(
name: "mime_name",
table: "profile");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,48 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Content.Server.Database.Migrations.Sqlite
{
public partial class CATaddNamesToProfile : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "borg_name",
table: "profile",
type: "TEXT",
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "clown_name",
table: "profile",
type: "TEXT",
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "mime_name",
table: "profile",
type: "TEXT",
nullable: false,
defaultValue: "");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "borg_name",
table: "profile");
migrationBuilder.DropColumn(
name: "clown_name",
table: "profile");
migrationBuilder.DropColumn(
name: "mime_name",
table: "profile");
}
}
}

View File

@@ -320,6 +320,9 @@ namespace Content.Server.Database
public int Id { get; set; } public int Id { get; set; }
public int Slot { get; set; } public int Slot { get; set; }
[Column("char_name")] public string CharacterName { get; set; } = null!; [Column("char_name")] public string CharacterName { get; set; } = null!;
public string ClownName { get; set; } = null!;
public string MimeName { get; set; } = null!;
public string BorgName { get; set; } = null!;
public string FlavorText { get; set; } = null!; public string FlavorText { get; set; } = null!;
public int Age { get; set; } public int Age { get; set; }
public string Sex { get; set; } = null!; public string Sex { get; set; } = null!;

View File

@@ -213,6 +213,9 @@ namespace Content.Server.Database
return new HumanoidCharacterProfile( return new HumanoidCharacterProfile(
profile.CharacterName, profile.CharacterName,
profile.ClownName,
profile.MimeName,
profile.BorgName,
profile.FlavorText, profile.FlavorText,
profile.Species, profile.Species,
voice, voice,
@@ -250,6 +253,9 @@ namespace Content.Server.Database
var markings = JsonSerializer.SerializeToDocument(markingStrings); var markings = JsonSerializer.SerializeToDocument(markingStrings);
profile.CharacterName = humanoid.Name; profile.CharacterName = humanoid.Name;
profile.ClownName = humanoid.ClownName;
profile.MimeName = humanoid.MimeName;
profile.BorgName = humanoid.BorgName;
profile.FlavorText = humanoid.FlavorText; profile.FlavorText = humanoid.FlavorText;
profile.Species = humanoid.Species; profile.Species = humanoid.Species;
profile.Age = humanoid.Age; profile.Age = humanoid.Age;

View File

@@ -202,7 +202,7 @@ namespace Content.Server.GameTicking
DebugTools.AssertNotNull(data); DebugTools.AssertNotNull(data);
var newMind = _mind.CreateMind(data!.UserId, character.Name); var newMind = _mind.CreateMind(data!.UserId, character.Name, character.ClownName, character.MimeName, character.BorgName);
_mind.SetUserId(newMind, data.UserId); _mind.SetUserId(newMind, data.UserId);
var jobPrototype = _prototypeManager.Index<JobPrototype>(jobId); var jobPrototype = _prototypeManager.Index<JobPrototype>(jobId);
@@ -210,42 +210,31 @@ namespace Content.Server.GameTicking
_roles.MindAddRole(newMind, job, silent: silent); _roles.MindAddRole(newMind, job, silent: silent);
var jobName = _jobs.MindTryGetJobName(newMind); var jobName = _jobs.MindTryGetJobName(newMind);
_playTimeTrackings.PlayerRolesChanged(player); if (_cfg.GetCVar(WhiteCVars.FanaticXenophobiaEnabled))
var whitelistedSpecies = jobPrototype.WhitelistedSpecies;
if (whitelistedSpecies.Count > 0 && !whitelistedSpecies.Contains(character.Species))
{ {
var playerProfiles = _prefsManager.GetPreferences(player.UserId).Characters.Values.Cast<HumanoidCharacterProfile>().ToList(); character = ReplaceBlacklistedSpecies(player, character, jobPrototype);
newMind.Comp.CharacterName = character.Name;
var existedAllowedProfile = playerProfiles.FindAll(x => whitelistedSpecies.Contains(x.Species)); newMind.Comp.ClownName = character.ClownName;
newMind.Comp.MimeName = character.MimeName;
if (existedAllowedProfile.Count == 0) newMind.Comp.BorgName = character.BorgName;
{
character = HumanoidCharacterProfile.RandomWithSpecies(_robustRandom.Pick(whitelistedSpecies));
_chatManager.DispatchServerMessage(player, "Данному виду запрещено играть на этой профессии. Вам была выдана случайная внешность.");
}
else
{
character = _robustRandom.Pick(existedAllowedProfile);
_chatManager.DispatchServerMessage(player, "Данному виду запрещено играть на этой профессии. Вам была выдана случайная внешность с подходящим видом из вашего профиля.");
}
StringBuilder availableSpeciesLoc = new StringBuilder();
foreach (var specie in whitelistedSpecies)
{
availableSpeciesLoc.AppendLine("-" + Loc.GetString($"species-name-{specie.ToLower()}"));
}
_chatManager.DispatchServerMessage(player, $"Доступные виды: \n {availableSpeciesLoc}");
} }
_playTimeTrackings.PlayerRolesChanged(player);
var mobMaybe = _stationSpawning.SpawnPlayerCharacterOnStation(station, job, character); var mobMaybe = _stationSpawning.SpawnPlayerCharacterOnStation(station, job, character);
DebugTools.AssertNotNull(mobMaybe); DebugTools.AssertNotNull(mobMaybe);
var mob = mobMaybe!.Value; var mob = mobMaybe!.Value;
if (jobId.Contains("Clown"))
if (newMind.Comp.ClownName != null)
_metaData.SetEntityName(mob, newMind.Comp.ClownName);
if (jobId.Contains("Mime"))
if (newMind.Comp.MimeName != null)
_metaData.SetEntityName(mob, newMind.Comp.MimeName);
if (jobId.Contains("Cyborg"))
if (newMind.Comp.BorgName != null)
_metaData.SetEntityName(mob, newMind.Comp.BorgName);
_mind.TransferTo(newMind, mob); _mind.TransferTo(newMind, mob);
if (lateJoin && !silent) if (lateJoin && !silent)
@@ -308,6 +297,42 @@ namespace Content.Server.GameTicking
RaiseLocalEvent(mob, aev, true); RaiseLocalEvent(mob, aev, true);
} }
private HumanoidCharacterProfile ReplaceBlacklistedSpecies(ICommonSession player, HumanoidCharacterProfile character, JobPrototype jobPrototype)
{
var whitelistedSpecies = jobPrototype.WhitelistedSpecies;
if (whitelistedSpecies.Count > 0 && !whitelistedSpecies.Contains(character.Species))
{
var playerProfiles = _prefsManager.GetPreferences(player.UserId).Characters.Values
.Cast<HumanoidCharacterProfile>().ToList();
var existedAllowedProfile = playerProfiles.FindAll(x => whitelistedSpecies.Contains(x.Species));
if (existedAllowedProfile.Count == 0)
{
character = HumanoidCharacterProfile.RandomWithSpecies(_robustRandom.Pick(whitelistedSpecies));
_chatManager.DispatchServerMessage(player,
"Данному виду запрещено играть на этой профессии. Вам была выдана случайная внешность.");
}
else
{
character = _robustRandom.Pick(existedAllowedProfile);
_chatManager.DispatchServerMessage(player,
"Данному виду запрещено играть на этой профессии. Вам была выдана случайная внешность с подходящим видом из вашего профиля.");
}
StringBuilder availableSpeciesLoc = new StringBuilder();
foreach (var specie in whitelistedSpecies)
{
availableSpeciesLoc.AppendLine("-" + Loc.GetString($"species-name-{specie.ToLower()}"));
}
_chatManager.DispatchServerMessage(player, $"Доступные виды: \n {availableSpeciesLoc}");
}
return character;
}
public void Respawn(ICommonSession player) public void Respawn(ICommonSession player)
{ {
_mind.WipeMind(player); _mind.WipeMind(player);

View File

@@ -105,7 +105,7 @@ public sealed class StationSpawningSystem : SharedStationSpawningSystem
DebugTools.Assert(entity is null); DebugTools.Assert(entity is null);
var jobEntity = EntityManager.SpawnEntity(prototype.JobEntity, coordinates); var jobEntity = EntityManager.SpawnEntity(prototype.JobEntity, coordinates);
MakeSentientCommand.MakeSentient(jobEntity, EntityManager); MakeSentientCommand.MakeSentient(jobEntity, EntityManager);
DoJobSpecials(job, jobEntity); DoJobSpecials(job, jobEntity, profile);
_identity.QueueIdentityUpdate(jobEntity); _identity.QueueIdentityUpdate(jobEntity);
return jobEntity; return jobEntity;
} }
@@ -141,7 +141,14 @@ public sealed class StationSpawningSystem : SharedStationSpawningSystem
var startingGear = _prototypeManager.Index<StartingGearPrototype>(prototype.StartingGear); var startingGear = _prototypeManager.Index<StartingGearPrototype>(prototype.StartingGear);
EquipStartingGear(entity.Value, startingGear, profile); EquipStartingGear(entity.Value, startingGear, profile);
if (profile != null) if (profile != null)
EquipIdCard(entity.Value, profile.Name, prototype, station); {
if (prototype.ID.Contains("Clown"))
EquipIdCard(entity.Value, profile.ClownName, prototype, station);
else if (prototype.ID.Contains("Mime"))
EquipIdCard(entity.Value, profile.MimeName, prototype, station);
else
EquipIdCard(entity.Value, profile.Name, prototype, station);
}
} }
if (profile != null) if (profile != null)
@@ -154,12 +161,12 @@ public sealed class StationSpawningSystem : SharedStationSpawningSystem
} }
} }
DoJobSpecials(job, entity.Value); DoJobSpecials(job, entity.Value, profile);
_identity.QueueIdentityUpdate(entity.Value); _identity.QueueIdentityUpdate(entity.Value);
return entity.Value; return entity.Value;
} }
private void DoJobSpecials(JobComponent? job, EntityUid entity) private void DoJobSpecials(JobComponent? job, EntityUid entity, HumanoidCharacterProfile? profile)
{ {
if (!_prototypeManager.TryIndex(job?.Prototype ?? string.Empty, out JobPrototype? prototype)) if (!_prototypeManager.TryIndex(job?.Prototype ?? string.Empty, out JobPrototype? prototype))
return; return;
@@ -168,6 +175,42 @@ public sealed class StationSpawningSystem : SharedStationSpawningSystem
{ {
jobSpecial.AfterEquip(entity); jobSpecial.AfterEquip(entity);
} }
if (prototype.ID.Contains("Cyborg"))
{
if (_randomizeCharacters || profile == null)
{
_metaSystem.SetEntityName(entity, HumanoidCharacterProfile.GetBorgName());
}
else
{
_metaSystem.SetEntityName(entity, profile.BorgName);
}
}
if (prototype.ID.Contains("Clown"))
{
if (_randomizeCharacters || profile == null)
{
_metaSystem.SetEntityName(entity, HumanoidCharacterProfile.GetClownName());
}
else
{
_metaSystem.SetEntityName(entity, profile.ClownName);
}
}
if (prototype.ID.Contains("Mime"))
{
if (_randomizeCharacters || profile == null)
{
_metaSystem.SetEntityName(entity, HumanoidCharacterProfile.GetMimeName());
}
else
{
_metaSystem.SetEntityName(entity, profile.MimeName);
}
}
} }
/// <summary> /// <summary>

View File

@@ -69,7 +69,7 @@ public sealed class StationRecordsSystem : SharedStationRecordsSystem
TryComp<FingerprintComponent>(player, out var fingerprintComponent); TryComp<FingerprintComponent>(player, out var fingerprintComponent);
TryComp<DnaComponent>(player, out var dnaComponent); TryComp<DnaComponent>(player, out var dnaComponent);
CreateGeneralRecord(station, idUid.Value, profile.Name, profile.Age, profile.Species, profile.Gender, jobId, fingerprintComponent?.Fingerprint, dnaComponent?.DNA, profile, records); CreateGeneralRecord(station, idUid.Value, profile.Name, profile.ClownName, profile.MimeName, profile.BorgName, profile.Age, profile.Species, profile.Gender, jobId, fingerprintComponent?.Fingerprint, dnaComponent?.DNA, profile, records);
} }
@@ -100,7 +100,7 @@ public sealed class StationRecordsSystem : SharedStationRecordsSystem
/// Optional - other systems should anticipate this. /// Optional - other systems should anticipate this.
/// </param> /// </param>
/// <param name="records">Station records component.</param> /// <param name="records">Station records component.</param>
public void CreateGeneralRecord(EntityUid station, EntityUid? idUid, string name, int age, string species, Gender gender, string jobId, string? mobFingerprint, string? dna, HumanoidCharacterProfile? profile = null, public void CreateGeneralRecord(EntityUid station, EntityUid? idUid, string name, string clownName, string mimeName, string borgName, int age, string species, Gender gender, string jobId, string? mobFingerprint, string? dna, HumanoidCharacterProfile? profile = null,
StationRecordsComponent? records = null) StationRecordsComponent? records = null)
{ {
if (!Resolve(station, ref records)) if (!Resolve(station, ref records))
@@ -116,6 +116,9 @@ public sealed class StationRecordsSystem : SharedStationRecordsSystem
var record = new GeneralStationRecord() var record = new GeneralStationRecord()
{ {
Name = name, Name = name,
ClownName = clownName,
MimeName = mimeName,
BorgName = borgName,
Age = age, Age = age,
JobTitle = jobPrototype.LocalizedName, JobTitle = jobPrototype.LocalizedName,
JobIcon = jobPrototype.Icon, JobIcon = jobPrototype.Icon,

View File

@@ -72,5 +72,20 @@ namespace Content.Shared.Humanoid
} }
// WD-EDIT // WD-EDIT
} }
public string GetBorgName()
{
return _random.Pick(_prototypeManager.Index<DatasetPrototype>("names_autoborg").Values); //Реди
}
public string GetMimeName()
{
return _random.Pick(_prototypeManager.Index<DatasetPrototype>("names_mime").Values); //Реди
}
public string GetClownName()
{
return _random.Pick(_prototypeManager.Index<DatasetPrototype>("names_clown").Values); //Реди
}
} }
} }

View File

@@ -64,6 +64,15 @@ namespace Content.Shared.Mind
[DataField, AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)] [DataField, AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)]
public string? CharacterName { get; set; } public string? CharacterName { get; set; }
[DataField, AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)]
public string? ClownName { get; set; }
[DataField, AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)]
public string? MimeName { get; set; }
[DataField, AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)]
public string? BorgName { get; set; }
/// <summary> /// <summary>
/// The time of death for this Mind. /// The time of death for this Mind.
/// Can be null - will be null if the Mind is not considered "dead". /// Can be null - will be null if the Mind is not considered "dead".

View File

@@ -184,12 +184,15 @@ public abstract class SharedMindSystem : EntitySystem
return null; return null;
} }
public Entity<MindComponent> CreateMind(NetUserId? userId, string? name = null) public Entity<MindComponent> CreateMind(NetUserId? userId, string? name = null, string? clownName = null, string? mimeName = null, string? borgName = null)
{ {
var mindId = Spawn(null, MapCoordinates.Nullspace); var mindId = Spawn(null, MapCoordinates.Nullspace);
_metadata.SetEntityName(mindId, name == null ? "mind" : $"mind ({name})"); _metadata.SetEntityName(mindId, name == null ? "mind" : $"mind ({name})");
var mind = EnsureComp<MindComponent>(mindId); var mind = EnsureComp<MindComponent>(mindId);
mind.CharacterName = name; mind.CharacterName = name;
mind.ClownName = clownName;
mind.MimeName = mimeName;
mind.BorgName = borgName;
SetUserId(mindId, userId, mind); SetUserId(mindId, userId, mind);
return (mindId, mind); return (mindId, mind);

View File

@@ -34,6 +34,9 @@ namespace Content.Shared.Preferences
private HumanoidCharacterProfile( private HumanoidCharacterProfile(
string name, string name,
string clownName,
string mimeName,
string borgName,
string flavortext, string flavortext,
string species, string species,
int age, int age,
@@ -49,6 +52,9 @@ namespace Content.Shared.Preferences
List<string> traitPreferences) List<string> traitPreferences)
{ {
Name = name; Name = name;
ClownName = clownName;
MimeName = mimeName;
BorgName = borgName;
FlavorText = flavortext; FlavorText = flavortext;
Species = species; Species = species;
Voice = voice; Voice = voice;
@@ -70,7 +76,7 @@ namespace Content.Shared.Preferences
Dictionary<string, JobPriority> jobPriorities, Dictionary<string, JobPriority> jobPriorities,
List<string> antagPreferences, List<string> antagPreferences,
List<string> traitPreferences) List<string> traitPreferences)
: this(other.Name, other.FlavorText, other.Species, other.Voice, other.Age, other.Sex, other.Gender, other.Appearance, other.Clothing, other.Backpack, : this(other.Name, other.ClownName, other.MimeName, other.BorgName, other.FlavorText, other.Species, other.Voice, other.Age, other.Sex, other.Gender, other.Appearance, other.Clothing, other.Backpack,
jobPriorities, other.PreferenceUnavailable, antagPreferences, traitPreferences) jobPriorities, other.PreferenceUnavailable, antagPreferences, traitPreferences)
{ {
} }
@@ -83,6 +89,9 @@ namespace Content.Shared.Preferences
public HumanoidCharacterProfile( public HumanoidCharacterProfile(
string name, string name,
string clownName,
string mimeName,
string borgName,
string flavortext, string flavortext,
string species, string species,
string voice, string voice,
@@ -96,7 +105,7 @@ namespace Content.Shared.Preferences
PreferenceUnavailableMode preferenceUnavailable, PreferenceUnavailableMode preferenceUnavailable,
IReadOnlyList<string> antagPreferences, IReadOnlyList<string> antagPreferences,
IReadOnlyList<string> traitPreferences) IReadOnlyList<string> traitPreferences)
: this(name, flavortext, species, age, sex, voice, gender, appearance, clothing, backpack, new Dictionary<string, JobPriority>(jobPriorities), : this(name, clownName, mimeName, borgName, flavortext, species, age, sex, voice, gender, appearance, clothing, backpack, new Dictionary<string, JobPriority>(jobPriorities),
preferenceUnavailable, new List<string>(antagPreferences), new List<string>(traitPreferences)) preferenceUnavailable, new List<string>(antagPreferences), new List<string>(traitPreferences))
{ {
} }
@@ -108,6 +117,9 @@ namespace Content.Shared.Preferences
/// <returns></returns> /// <returns></returns>
public HumanoidCharacterProfile() : this( public HumanoidCharacterProfile() : this(
"John Doe", "John Doe",
"HONK",
"Quiet",
"Silicon",
"", "",
SharedHumanoidAppearanceSystem.DefaultSpecies, SharedHumanoidAppearanceSystem.DefaultSpecies,
SharedHumanoidAppearanceSystem.DefaultVoice, SharedHumanoidAppearanceSystem.DefaultVoice,
@@ -136,6 +148,9 @@ namespace Content.Shared.Preferences
{ {
return new( return new(
"John Doe", "John Doe",
"HONK",
"Quiet",
"Silicon",
"", "",
species, species,
SharedHumanoidAppearanceSystem.DefaultVoice, SharedHumanoidAppearanceSystem.DefaultVoice,
@@ -190,8 +205,11 @@ namespace Content.Shared.Preferences
var gender = sex == Sex.Male ? Gender.Male : Gender.Female; var gender = sex == Sex.Male ? Gender.Male : Gender.Female;
var name = GetName(species, gender); var name = GetName(species, gender);
var clownName = GetClownName();
var mimeName = GetMimeName();
var borgName = GetBorgName();
return new HumanoidCharacterProfile(name, "", species, voiceId, age, sex, gender, HumanoidCharacterAppearance.Random(species, sex), ClothingPreference.Jumpsuit, BackpackPreference.Backpack, return new HumanoidCharacterProfile(name, clownName, mimeName, borgName, "", species, voiceId, age, sex, gender, HumanoidCharacterAppearance.Random(species, sex), ClothingPreference.Jumpsuit, BackpackPreference.Backpack,
new Dictionary<string, JobPriority> new Dictionary<string, JobPriority>
{ {
{SharedGameTicker.FallbackOverflowJob, JobPriority.High}, {SharedGameTicker.FallbackOverflowJob, JobPriority.High},
@@ -199,6 +217,9 @@ namespace Content.Shared.Preferences
} }
public string Name { get; private set; } public string Name { get; private set; }
public string ClownName { get; private set; }
public string MimeName { get; private set; }
public string BorgName { get; private set; }
public string FlavorText { get; private set; } public string FlavorText { get; private set; }
public string Species { get; private set; } public string Species { get; private set; }
@@ -235,6 +256,19 @@ namespace Content.Shared.Preferences
return new(this) { Name = name }; return new(this) { Name = name };
} }
public HumanoidCharacterProfile WithClownName(string name)
{
return new(this) { ClownName = name };
}
public HumanoidCharacterProfile WithMimeName(string name)
{
return new(this) { MimeName = name };
}
public HumanoidCharacterProfile WithBorgName(string name)
{
return new(this) { BorgName = name };
}
public HumanoidCharacterProfile WithFlavorText(string flavorText) public HumanoidCharacterProfile WithFlavorText(string flavorText)
{ {
return new(this) { FlavorText = flavorText }; return new(this) { FlavorText = flavorText };
@@ -357,6 +391,9 @@ namespace Content.Shared.Preferences
{ {
if (maybeOther is not HumanoidCharacterProfile other) return false; if (maybeOther is not HumanoidCharacterProfile other) return false;
if (Name != other.Name) return false; if (Name != other.Name) return false;
if (ClownName != other.ClownName) return false;
if (MimeName != other.MimeName) return false;
if (BorgName != other.BorgName) return false;
if (Age != other.Age) return false; if (Age != other.Age) return false;
if (Sex != other.Sex) return false; if (Sex != other.Sex) return false;
if (Gender != other.Gender) return false; if (Gender != other.Gender) return false;
@@ -414,6 +451,9 @@ namespace Content.Shared.Preferences
}; };
string name; string name;
string clownName;
string mimeName;
string borgName;
if (string.IsNullOrEmpty(Name)) if (string.IsNullOrEmpty(Name))
{ {
name = GetName(Species, gender); name = GetName(Species, gender);
@@ -426,13 +466,55 @@ namespace Content.Shared.Preferences
{ {
name = Name; name = Name;
} }
if (string.IsNullOrEmpty(ClownName))
{
clownName = GetClownName();
}
else if (ClownName.Length > MaxNameLength)
{
clownName = ClownName[..MaxNameLength];
}
else
{
clownName = ClownName;
}
if (string.IsNullOrEmpty(MimeName))
{
mimeName = GetMimeName();
}
else if (MimeName.Length > MaxNameLength)
{
mimeName = MimeName[..MaxNameLength];
}
else
{
mimeName = MimeName;
}
if (string.IsNullOrEmpty(BorgName))
{
borgName = GetBorgName();
}
else if (BorgName.Length > MaxNameLength)
{
borgName = BorgName[..MaxNameLength];
}
else
{
borgName = BorgName;
}
name = name.Trim(); name = name.Trim();
clownName = clownName.Trim();
mimeName = mimeName.Trim();
borgName = borgName.Trim();
var configManager = IoCManager.Resolve<IConfigurationManager>(); var configManager = IoCManager.Resolve<IConfigurationManager>();
if (configManager.GetCVar(CCVars.RestrictedNames)) if (configManager.GetCVar(CCVars.RestrictedNames))
{ {
name = Regex.Replace(name, @"[^А-Я,а-я,0-9, -]", string.Empty); //WD EDIT name = Regex.Replace(name, @"[^А-Я,а-я,0-9, -]", string.Empty); //WD EDIT
clownName = Regex.Replace(clownName, @"[^А-Я,а-я,0-9, -]", string.Empty);
mimeName = Regex.Replace(mimeName, @"[^А-Я,а-я,0-9, -]", string.Empty);
borgName = Regex.Replace(borgName, @"[^А-Я,а-я,0-9, -]", string.Empty);
} }
if (configManager.GetCVar(CCVars.ICNameCase)) if (configManager.GetCVar(CCVars.ICNameCase))
@@ -441,11 +523,23 @@ namespace Content.Shared.Preferences
name = Regex.Replace(name, name = Regex.Replace(name,
@"^(?<word>\w)|\b(?<word>\w)(?=\w*$)", @"^(?<word>\w)|\b(?<word>\w)(?=\w*$)",
m => m.Groups["word"].Value.ToUpper()); m => m.Groups["word"].Value.ToUpper());
clownName = Regex.Replace(clownName,
@"^(?<word>\w)|\b(?<word>\w)(?=\w*$)",
m => m.Groups["word"].Value.ToUpper());
mimeName = Regex.Replace(mimeName,
@"^(?<word>\w)|\b(?<word>\w)(?=\w*$)",
m => m.Groups["word"].Value.ToUpper());
borgName = Regex.Replace(borgName,
@"^(?<word>\w)|\b(?<word>\w)(?=\w*$)",
m => m.Groups["word"].Value.ToUpper());
} }
if (string.IsNullOrEmpty(name)) if (string.IsNullOrEmpty(name))
{ {
name = GetName(Species, gender); name = GetName(Species, gender);
clownName = GetClownName();
mimeName = GetMimeName();
borgName = GetBorgName();
} }
string flavortext; string flavortext;
@@ -503,6 +597,9 @@ namespace Content.Shared.Preferences
.ToList(); .ToList();
Name = name; Name = name;
ClownName = clownName;
MimeName = mimeName;
BorgName = borgName;
FlavorText = flavortext; FlavorText = flavortext;
Age = age; Age = age;
Sex = sex; Sex = sex;
@@ -544,6 +641,24 @@ namespace Content.Shared.Preferences
return namingSystem.GetName(species, gender); return namingSystem.GetName(species, gender);
} }
public static string GetClownName()
{
var namingSystem = IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<NamingSystem>();
return namingSystem.GetClownName();
}
public static string GetMimeName()
{
var namingSystem = IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<NamingSystem>();
return namingSystem.GetMimeName();
}
public static string GetBorgName()
{
var namingSystem = IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<NamingSystem>();
return namingSystem.GetBorgName();
}
public override bool Equals(object? obj) public override bool Equals(object? obj)
{ {
return obj is HumanoidCharacterProfile other && MemberwiseEquals(other); return obj is HumanoidCharacterProfile other && MemberwiseEquals(other);
@@ -562,6 +677,9 @@ namespace Content.Shared.Preferences
Clothing, Clothing,
Backpack Backpack
), ),
ClownName,
MimeName,
BorgName,
PreferenceUnavailable, PreferenceUnavailable,
_jobPriorities, _jobPriorities,
_antagPreferences, _antagPreferences,

View File

@@ -15,6 +15,15 @@ public sealed class GeneralStationRecord
[ViewVariables] [ViewVariables]
public string Name = string.Empty; public string Name = string.Empty;
[ViewVariables]
public string ClownName = string.Empty;
[ViewVariables]
public string MimeName = string.Empty;
[ViewVariables]
public string BorgName = string.Empty;
/// <summary> /// <summary>
/// Age of the person that this station record represents. /// Age of the person that this station record represents.
/// </summary> /// </summary>