Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Metempsychosis Returns #685

Merged
merged 56 commits into from
Feb 18, 2024
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
af038b0
Metempsychosis Returns
VMSolidus Jan 17, 2024
85b0e47
Last updates
VMSolidus Jan 17, 2024
a982402
Fixin the linter
VMSolidus Jan 17, 2024
8f10d6b
Update lathe.yml
VMSolidus Jan 17, 2024
a9dbde1
Update CloningSystem.cs
VMSolidus Jan 17, 2024
ec79134
Merge branch 'master' into Metempsychosis
VMSolidus Jan 22, 2024
556e62f
Merge branch 'Metempsychosis' of https://github.com/evilexecutive/Del…
VMSolidus Jan 22, 2024
b88d3c3
Fixing the random name bug
VMSolidus Jan 22, 2024
47586c3
Fugitive, rough but functional
VMSolidus Jan 22, 2024
13124db
Update fugitive.yml
VMSolidus Jan 23, 2024
5af8fbd
Update humanoid.yml
VMSolidus Jan 23, 2024
51d3355
Checking if its the floortile
VMSolidus Jan 23, 2024
bc98f0f
Guh
VMSolidus Jan 23, 2024
82375ac
Update EntityTest.cs
VMSolidus Jan 23, 2024
924eff4
Revert "Update EntityTest.cs"
VMSolidus Jan 23, 2024
667b8c5
Revert "Guh"
VMSolidus Jan 23, 2024
8630ce0
Revert "Checking if its the floortile"
VMSolidus Jan 23, 2024
cb27625
Revert "Update humanoid.yml"
VMSolidus Jan 23, 2024
cf1293e
Revert "Update fugitive.yml"
VMSolidus Jan 23, 2024
a605aa4
Revert "Fugitive, rough but functional"
VMSolidus Jan 23, 2024
dfd76b0
Merge branch 'master' into Metempsychosis
VMSolidus Jan 23, 2024
49e704e
Update Content.Server/Medical/Components/MedicalScannerComponent.cs
VMSolidus Jan 24, 2024
6eb6fbc
Update Content.Server/Nyanotrasen/Cloning/MetempsychosisKarmaComponen…
VMSolidus Jan 24, 2024
8dd1b91
Update Content.Server/Nyanotrasen/Cloning/MetempsychoticMachineCompon…
VMSolidus Jan 24, 2024
62bf453
Update Content.Server/Nyanotrasen/Cloning/MetempsychoticMachineSystem.cs
VMSolidus Jan 24, 2024
6c99f2e
Update Content.Server/Nyanotrasen/Cloning/MetempsychoticMachineSystem.cs
VMSolidus Jan 24, 2024
692eeda
Update Content.Server/Nyanotrasen/Cloning/MetempsychoticMachineSystem.cs
VMSolidus Jan 24, 2024
b9c61ab
Update Resources/Prototypes/Nyanotrasen/Entities/Structures/Machines/…
VMSolidus Jan 24, 2024
4974308
Update Resources/Prototypes/Nyanotrasen/Research/biochemical.yml.yml
VMSolidus Jan 24, 2024
f98a4f8
Update Resources/Textures/Nyanotrasen/Structures/Machines/metempsycho…
VMSolidus Jan 24, 2024
7d9b75e
Update CloningSystem.cs
VMSolidus Jan 24, 2024
26a5217
Update CloningSystem.cs
VMSolidus Jan 24, 2024
b0e21ca
Merge branch 'master' into Metempsychosis
VMSolidus Jan 28, 2024
dae42fc
Update Content.Server/Nyanotrasen/Cloning/MetempsychoticMachineSystem.cs
VMSolidus Jan 28, 2024
2d75497
Update MetempsychoticMachineSystem.cs
VMSolidus Jan 28, 2024
1868e8a
Merge branch 'Metempsychosis' of https://github.com/evilexecutive/Del…
VMSolidus Jan 28, 2024
5cf580e
Merge branch 'master' into Metempsychosis
VMSolidus Jan 28, 2024
a793dbe
Cleaning up some of the Metem code
VMSolidus Jan 28, 2024
1d36641
Update CloningConsoleSystem.cs
VMSolidus Jan 28, 2024
a5a2df7
Reordering usings for less merge conflicts
VMSolidus Jan 28, 2024
384fb60
Update HumanoidAppearanceComponent.cs
VMSolidus Jan 28, 2024
ed2abac
Update CloningSystem.cs
VMSolidus Jan 28, 2024
cb5ebb1
Merge branch 'master' into Metempsychosis
VMSolidus Jan 28, 2024
c5fd613
Apply suggestions from code review
VMSolidus Feb 2, 2024
688ab0b
Update CloningConsoleSystem.cs
VMSolidus Feb 2, 2024
32b7245
Update CloningConsoleSystem.cs
VMSolidus Feb 2, 2024
2596e70
Update CloningSystem.cs
VMSolidus Feb 2, 2024
0b4aa61
Update CloningConsoleSystem.cs
VMSolidus Feb 2, 2024
177bd5c
Apply suggestions from code review
VMSolidus Feb 8, 2024
0a67fae
Requested changes but need assistance with test fail
VMSolidus Feb 9, 2024
63ad078
Merge branch 'master' into Metempsychosis
VMSolidus Feb 9, 2024
27b8ac8
biochem is gone apparently
VMSolidus Feb 9, 2024
eaa031e
Update experimental.yml
VMSolidus Feb 9, 2024
f8a306b
Update MetempsychosisTest.cs
VMSolidus Feb 9, 2024
448e4dc
Update CloningSystem.cs
VMSolidus Feb 9, 2024
e73f454
Merge branch 'master' into Metempsychosis
VMSolidus Feb 13, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Content.IntegrationTests/Tests/EntityTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,9 @@ await server.WaitPost(() =>
if (protoId == "MobHumanSpaceNinja")
continue;

if (protoId == "MobHumanFugitive")
continue; //DeltaV: MidroundAntagEvent comes with a complimentary floor tile, this sets off the test)

var count = server.EntMan.EntityCount;
var clientCount = client.EntMan.EntityCount;
EntityUid uid = default;
Expand Down
19 changes: 9 additions & 10 deletions Content.Server/Cloning/CloningConsoleSystem.cs
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
using System.Linq;
using JetBrains.Annotations;
using Content.Server.Administration.Logs;
using Content.Server.Medical.Components;
using Content.Server.Cloning.Components;
using Content.Server.DeviceLinking.Systems;
using Content.Server.Medical.Components;
using Content.Server.Power.Components;
using Content.Server.Power.EntitySystems;
using Content.Server.UserInterface;
using Content.Shared.Cloning;
using Content.Server.Power.EntitySystems;
using Robust.Server.GameObjects;
using Robust.Server.Player;
using Content.Shared.Cloning.CloningConsole;
using Content.Shared.Cloning;
using Content.Shared.Mind;
using Content.Shared.Database;
using Content.Shared.DeviceLinking;
using Content.Shared.DeviceLinking.Events;
using Content.Shared.IdentityManagement;
using Content.Shared.Mind;
using Content.Shared.Mobs.Components;
using Content.Shared.Mobs.Systems;
using JetBrains.Annotations;
using Robust.Server.GameObjects;
using Robust.Server.Player;

namespace Content.Server.Cloning
{
Expand All @@ -32,7 +32,6 @@ public sealed class CloningConsoleSystem : EntitySystem
[Dependency] private readonly MobStateSystem _mobStateSystem = default!;
[Dependency] private readonly PowerReceiverSystem _powerReceiverSystem = default!;
[Dependency] private readonly SharedMindSystem _mindSystem = default!;

public override void Initialize()
{
base.Initialize();
Expand Down Expand Up @@ -169,8 +168,8 @@ public void TryClone(EntityUid uid, EntityUid cloningPodUid, EntityUid scannerUi

if (mind.UserId.HasValue == false || mind.Session == null)
return;

if (_cloningSystem.TryCloning(cloningPodUid, body.Value, (mindId, mind), cloningPod, scannerComp.CloningFailChanceMultiplier))
// Nyano: Adds scannerComp.MetemKarmaBonus
if (_cloningSystem.TryCloning(cloningPodUid, body.Value, (mindId, mind), cloningPod, scannerComp.CloningFailChanceMultiplier, scannerComp.MetemKarmaBonus))
VMSolidus marked this conversation as resolved.
Show resolved Hide resolved
_adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(uid)} successfully cloned {ToPrettyString(body.Value)}.");
}

Expand Down
166 changes: 128 additions & 38 deletions Content.Server/Cloning/CloningSystem.cs
Original file line number Diff line number Diff line change
@@ -1,42 +1,54 @@
using Content.Shared.GameTicking;
using Content.Shared.Damage;
using Content.Shared.Examine;
using Content.Shared.Cloning;
using Content.Shared.Speech;
using Content.Shared.Atmos;
using Content.Shared.Tag;
using Content.Shared.CCVar;
using Content.Shared.Preferences;
using Content.Shared.Emoting;
using Content.Server.Psionics;
using Content.Server.Cloning.Components;
using Content.Server.Speech.Components;
using Content.Server.Power.EntitySystems;
using Content.Server.Atmos.EntitySystems;
using Content.Server.StationEvents.Components;
using Content.Server.EUI;
using Content.Server.Humanoid;
using Content.Server.Ghost.Roles.Components;
using Content.Shared.Chemistry.Components;
using Content.Server.Fluids.EntitySystems;
using Content.Server.Chat.Systems;
using Content.Server.Cloning.Components;
using Content.Server.Construction;
using Content.Server.DeviceLinking.Events;
using Content.Server.DeviceLinking.Systems;
using Content.Server.EUI;
using Content.Server.Fluids.EntitySystems;
using Content.Server.Humanoid;
using Content.Server.Jobs;
using Content.Server.Materials;
using Content.Server.Jobs;
using Content.Server.Popups;
using Content.Server.Power.EntitySystems;
using Content.Server.Traits.Assorted;
using Content.Shared.Atmos;
using Content.Shared.CCVar;
using Content.Shared.Chemistry.Components;
using Content.Shared.Cloning;
using Content.Shared.Damage;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
using Content.Shared.Mind;
using Content.Shared.Mind.Components;
using Content.Server.Preferences.Managers;
using Content.Shared.DeviceLinking.Events;
using Content.Shared.Emag.Components;
using Content.Shared.Emag.Systems;
using Content.Shared.Examine;
using Content.Shared.GameTicking;
using Content.Shared.Humanoid;
using Content.Shared.Mind;
using Content.Shared.Mind.Components;
using Content.Shared.Humanoid.Prototypes;
using Content.Shared.Zombies;
using Content.Shared.Mobs.Systems;
using Content.Shared.Roles.Jobs;
using Robust.Server.Containers;
using Robust.Server.GameObjects;
using Robust.Server.Containers;
using Robust.Server.Player;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Configuration;
using Robust.Shared.Containers;
using Robust.Shared.Physics.Components;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Content.Server.Psionics; //Nyano - Summary: allows the potential psionic ability to be written to the character.
using Robust.Shared.GameObjects.Components.Localization;
using Content.Server.Traits.Assorted;

namespace Content.Server.Cloning
{
Expand All @@ -61,9 +73,13 @@ public sealed class CloningSystem : EntitySystem
[Dependency] private readonly IConfigurationManager _configManager = default!;
[Dependency] private readonly MaterialStorageSystem _material = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly MetempsychoticMachineSystem _metem = default!;
[Dependency] private readonly TagSystem _tag = default!;
[Dependency] private readonly IServerPreferencesManager _prefs = default!;
[Dependency] private readonly SharedMindSystem _mindSystem = default!;
[Dependency] private readonly MetaDataSystem _metaSystem = default!;
[Dependency] private readonly SharedJobSystem _jobs = default!;
[Dependency] private readonly MetaDataSystem _metaData = default!;

public readonly Dictionary<MindComponent, EntityUid> ClonesWaitingForMind = new();
public const float EasyModeCloningCost = 0.7f;
Expand All @@ -80,7 +96,6 @@ public override void Initialize()
SubscribeLocalEvent<CloningPodComponent, PortDisconnectedEvent>(OnPortDisconnected);
SubscribeLocalEvent<CloningPodComponent, AnchorStateChangedEvent>(OnAnchor);
SubscribeLocalEvent<CloningPodComponent, ExaminedEvent>(OnExamined);
SubscribeLocalEvent<CloningPodComponent, GotEmaggedEvent>(OnEmagged);
}

private void OnComponentInit(EntityUid uid, CloningPodComponent clonePod, ComponentInit args)
Expand Down Expand Up @@ -155,8 +170,8 @@ private void OnExamined(EntityUid uid, CloningPodComponent component, ExaminedEv

args.PushMarkup(Loc.GetString("cloning-pod-biomass", ("number", _material.GetMaterialAmount(uid, component.RequiredMaterial))));
}

public bool TryCloning(EntityUid uid, EntityUid bodyToClone, Entity<MindComponent> mindEnt, CloningPodComponent? clonePod, float failChanceModifier = 1)
// Nyano: Adds float karmaBonus
public bool TryCloning(EntityUid uid, EntityUid bodyToClone, Entity<MindComponent> mindEnt, CloningPodComponent? clonePod, float failChanceModifier = 1, float karmaBonus = 0.25f)
{
if (!Resolve(uid, ref clonePod))
return false;
Expand Down Expand Up @@ -186,6 +201,13 @@ public bool TryCloning(EntityUid uid, EntityUid bodyToClone, Entity<MindComponen
if (!TryComp<HumanoidAppearanceComponent>(bodyToClone, out var humanoid))
return false; // whatever body was to be cloned, was not a humanoid

// Begin Nyano-code: allow paradox anomalies to be cloned.
var pref = humanoid.LastProfileLoaded;
// End Nyano-code.

if (pref == null)
return false;

VMSolidus marked this conversation as resolved.
Show resolved Hide resolved
if (!_prototype.TryIndex(humanoid.Species, out var speciesPrototype))
return false;

Expand Down Expand Up @@ -241,20 +263,11 @@ public bool TryCloning(EntityUid uid, EntityUid bodyToClone, Entity<MindComponen
AddComp<ActiveCloningPodComponent>(uid);
return true;
}
// End Nyano-code.
}
// end of genetic damage checks

var mob = Spawn(speciesPrototype.Prototype, Transform(uid).MapPosition);
_humanoidSystem.CloneAppearance(bodyToClone, mob);

///Nyano - Summary: adds the potential psionic trait to the reanimated mob.
EnsureComp<PotentialPsionicComponent>(mob);

var ev = new CloningEvent(bodyToClone, mob);
RaiseLocalEvent(bodyToClone, ref ev);

if (!ev.NameHandled)
_metaSystem.SetEntityName(mob, MetaData(bodyToClone).EntityName);
var mob = FetchAndSpawnMob(clonePod, pref, speciesPrototype, humanoid, bodyToClone, karmaBonus);

var cloneMindReturn = EntityManager.AddComponent<BeingClonedComponent>(mob);
cloneMindReturn.Mind = mind;
Expand All @@ -266,7 +279,7 @@ public bool TryCloning(EntityUid uid, EntityUid bodyToClone, Entity<MindComponen

AddComp<ActiveCloningPodComponent>(uid);

// TODO: Ideally, components like this should be components on the mind entity so this isn't necessary.
// TODO: Ideally, components like this should be on a mind entity so this isn't neccesary.
DebugOk marked this conversation as resolved.
Show resolved Hide resolved
// Add on special job components to the mob.
if (_jobs.MindTryGetJob(mindEnt, out _, out var prototype))
{
Expand Down Expand Up @@ -345,7 +358,6 @@ private void EndFailedCloning(EntityUid uid, CloningPodComponent clonePod)
var transform = Transform(uid);
var indices = _transformSystem.GetGridTilePositionOrDefault((uid, transform));
var tileMix = _atmosphereSystem.GetTileMixture(transform.GridUid, null, indices, true);

if (HasComp<EmaggedComponent>(uid))
{
_audio.PlayPvs(clonePod.ScreamSound, uid);
Expand Down Expand Up @@ -373,6 +385,84 @@ private void EndFailedCloning(EntityUid uid, CloningPodComponent clonePod)
RemCompDeferred<ActiveCloningPodComponent>(uid);
}

/// <summary>
/// Handles fetching the mob and any appearance stuff...
/// </summary>
private EntityUid FetchAndSpawnMob(CloningPodComponent clonePod, HumanoidCharacterProfile pref, SpeciesPrototype speciesPrototype, HumanoidAppearanceComponent humanoid, EntityUid bodyToClone, float karmaBonus)
{
List<Sex> sexes = new();
bool switchingSpecies = false;
bool applyKarma = false;
var name = pref.Name;
var toSpawn = speciesPrototype.Prototype;
TryComp<MetempsychosisKarmaComponent>(bodyToClone, out var oldKarma);

if (TryComp<MetempsychoticMachineComponent>(clonePod.Owner, out var metem))
{
toSpawn = _metem.GetSpawnEntity(clonePod.Owner, karmaBonus, speciesPrototype, out var newSpecies, oldKarma?.Score, metem);
applyKarma = true;

if (newSpecies != null)
{
sexes = newSpecies.Sexes;

if (speciesPrototype.ID != newSpecies.ID)
{
switchingSpecies = true;
}
VMSolidus marked this conversation as resolved.
Show resolved Hide resolved

speciesPrototype = newSpecies;
}
}

var mob = Spawn(toSpawn, Transform(clonePod.Owner).MapPosition);
if (TryComp<HumanoidAppearanceComponent>(mob, out var newHumanoid))
{
if (switchingSpecies || HasComp<MetempsychosisKarmaComponent>(bodyToClone))
{
pref = HumanoidCharacterProfile.RandomWithSpecies(newHumanoid.Species);
if (sexes.Contains(humanoid.Sex))
pref = pref.WithSex(humanoid.Sex);

pref = pref.WithGender(humanoid.Gender);
pref = pref.WithAge(humanoid.Age);

}
_humanoidSystem.LoadProfile(mob, pref);
}

if (applyKarma)
{
var karma = EnsureComp<MetempsychosisKarmaComponent>(mob);
karma.Score++;
if (oldKarma != null)
karma.Score += oldKarma.Score;
}

var ev = new CloningEvent(bodyToClone, mob);
RaiseLocalEvent(bodyToClone, ref ev);

if (!ev.NameHandled)
_metaSystem.SetEntityName(mob, MetaData(bodyToClone).EntityName);

var grammar = EnsureComp<GrammarComponent>(mob);
grammar.ProperNoun = true;
grammar.Gender = humanoid.Gender;
Dirty(grammar);

EnsureComp<PotentialPsionicComponent>(mob);
EnsureComp<SpeechComponent>(mob);
EnsureComp<EmotingComponent>(mob);
RemComp<ReplacementAccentComponent>(mob);
RemComp<MonkeyAccentComponent>(mob);
RemComp<SentienceTargetComponent>(mob);
RemComp<GhostTakeoverAvailableComponent>(mob);

_tag.AddTag(mob, "DoorBumpOpener");

return mob;
}

VMSolidus marked this conversation as resolved.
Show resolved Hide resolved
public void Reset(RoundRestartCleanupEvent ev)
{
ClonesWaitingForMind.Clear();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ public sealed partial class MedicalScannerComponent : SharedMedicalScannerCompon

[ViewVariables(VVAccess.ReadWrite)]
public float CloningFailChanceMultiplier = 1f;
//Nyano, needed for Metem Machine. It's not like Wizden will ever touch this again though, since Cloning is no longer maintained upstream
VMSolidus marked this conversation as resolved.
Show resolved Hide resolved
public float MetemKarmaBonus = 0.25f;

[DataField("machinePartCloningFailChance", customTypeSerializer: typeof(PrototypeIdSerializer<MachinePartPrototype>))]
public string MachinePartCloningFailChance = "Capacitor";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace Content.Server.Cloning
VMSolidus marked this conversation as resolved.
Show resolved Hide resolved
{
/// <summary>
/// This tracks how many times you have already been cloned and lowers your chance of getting a humanoid each time.
/// </summary>
[RegisterComponent]
public sealed partial class MetempsychosisKarmaComponent : Component
{
[DataField("score")]
public int Score = 0;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace Content.Server.Cloning
VMSolidus marked this conversation as resolved.
Show resolved Hide resolved
{
[RegisterComponent]
public sealed partial class MetempsychoticMachineComponent : Component
{
/// <summary>
/// Chance you will spawn as a humanoid instead of a non humanoid.
/// </summary>
[DataField("humanoidBaseChance")]
public float HumanoidBaseChance = 0.75f;
}
}
Loading
Loading