diff --git a/Content.Server/_Impstation/Heretic/Components/HereticSoulFragmentComponent.cs b/Content.Server/_Impstation/Heretic/Components/HereticSoulFragmentComponent.cs new file mode 100644 index 0000000000000..970e724c7e5c7 --- /dev/null +++ b/Content.Server/_Impstation/Heretic/Components/HereticSoulFragmentComponent.cs @@ -0,0 +1,10 @@ +using Content.Server.Heretic.EntitySystems; + +namespace Content.Server.Heretic.Components; + +[RegisterComponent, Access(typeof(HereticSoulFragmentSystem))] +public sealed partial class HereticSoulFragmentComponent : Component +{ + [DataField] + public LocId Message { get; private set; } = string.Empty; +} diff --git a/Content.Server/_Impstation/Heretic/EntitySystems/HellWorldSystem.cs b/Content.Server/_Impstation/Heretic/EntitySystems/HellWorldSystem.cs index 7cd35176b4af5..30e93cae31536 100644 --- a/Content.Server/_Impstation/Heretic/EntitySystems/HellWorldSystem.cs +++ b/Content.Server/_Impstation/Heretic/EntitySystems/HellWorldSystem.cs @@ -19,6 +19,7 @@ using Robust.Shared.Audio; using Robust.Shared.EntitySerialization; using Robust.Shared.EntitySerialization.Systems; +using Robust.Shared.Physics.Systems; using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; @@ -45,16 +46,25 @@ public sealed class HellWorldSystem : EntitySystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly MapLoaderSystem _mapLoader = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedMapSystem _map = default!; [Dependency] private readonly SharedMindSystem _mind = default!; [Dependency] private readonly SharedTransformSystem _xform = default!; [Dependency] private readonly CloningSystem _cloning = default!; - [Dependency] private readonly TransformSystem _transform = default!; [Dependency] private readonly AntagSelectionSystem _antag = default!; - [Dependency] private readonly GibbingSystem _gibbing = default!; private readonly ResPath _mapPath = new("Maps/_Impstation/Nonstations/InfiniteArchives.yml"); private readonly ProtoId _cloneSettings = "HellClone"; + private readonly List _soulParts = new() + { + "SoulFragmentSight", + "SoulFragmentHunger", + "SoulFragmentDreams", + "SoulFragmentSpeech", + "SoulFragmentSword", + "SoulFragmentShield", + "SoulFragmentRhythm" + }; public override void Initialize() { @@ -96,12 +106,12 @@ public override void Update(float frameTime) /// private void BeforeSend(Entity uid, ref HereticBeforeHellEvent args) { - //spawn a clone of the victim - _cloning.TryCloning(uid, _transform.GetMapCoordinates(uid), uid.Comp.CloneSettings, out var clone); - - //gib clone to get matching organs. - if (clone != null) - _gibbing.Gib(clone.Value); + //spawn victims soul parts for use in rituals + foreach(var part in _soulParts) + { + var partEnt = Spawn(part, _xform.GetMapCoordinates(uid)); + FlingDroppedEntity(partEnt); + } //set original body to put the mind back in later uid.Comp.OriginalBody = uid; @@ -114,6 +124,13 @@ private void BeforeSend(Entity uid, ref HereticBeforeHellEvent uid.Comp.Mind = mindContainer.Mind.Value; } + private void FlingDroppedEntity(EntityUid target) //this code is direct from GibbingSystem, but inside another system so i can't get to it >:( + { + var impulse = 25 + _random.NextFloat(5); + var scatterVec = _random.NextAngle().ToVec() * impulse; + _physics.ApplyLinearImpulse(target, scatterVec); + } + /// /// handles creation of the hell clone and moving the mind into it /// diff --git a/Content.Server/_Impstation/Heretic/EntitySystems/HereticSoulFragmentSystem.cs b/Content.Server/_Impstation/Heretic/EntitySystems/HereticSoulFragmentSystem.cs new file mode 100644 index 0000000000000..76fcf8158ee80 --- /dev/null +++ b/Content.Server/_Impstation/Heretic/EntitySystems/HereticSoulFragmentSystem.cs @@ -0,0 +1,24 @@ +using Content.Server.Heretic.Components; +using Content.Shared.Examine; +using Content.Shared.Heretic; + + +namespace Content.Server.Heretic.EntitySystems; + +public sealed partial class HereticSoulFragmentSystem : EntitySystem +{ + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnExamined); + } + +private void OnExamined(Entity ent, ref ExaminedEvent args) + { + if(TryComp(args.Examiner, out _)) + { + args.PushMarkup(markup: Loc.GetString(ent.Comp.Message)); + } + } +} diff --git a/Resources/Locale/en-US/_Impstation/Heretic/heretic/fragments.ftl b/Resources/Locale/en-US/_Impstation/Heretic/heretic/fragments.ftl new file mode 100644 index 0000000000000..5ecf135901c1a --- /dev/null +++ b/Resources/Locale/en-US/_Impstation/Heretic/heretic/fragments.ftl @@ -0,0 +1,7 @@ +heretic-soul-fragment-sight = [color=purple]This can be used as Eyes in a ritual.[/color] +heretic-soul-fragment-hunger = [color=purple]This can be used as a Stomach in a ritual.[/color] +heretic-soul-fragment-dreams = [color=purple]This can be used as a Brain in a ritual.[/color] +heretic-soul-fragment-speech = [color=purple]This can be used as Lungs in a ritual.[/color] +heretic-soul-fragment-sword = [color=purple]This can be used as Kidneys in a ritual.[/color] +heretic-soul-fragment-shield = [color=purple]This can be used as a Liver in a ritual.[/color] +heretic-soul-fragment-rhythm = [color=purple]This can be used as a Heart in a ritual.[/color] \ No newline at end of file diff --git a/Resources/Prototypes/_Impstation/Heretic/Entities/Objects/Specific/soulparts.yml b/Resources/Prototypes/_Impstation/Heretic/Entities/Objects/Specific/soulparts.yml new file mode 100644 index 0000000000000..4cac110c45d2d --- /dev/null +++ b/Resources/Prototypes/_Impstation/Heretic/Entities/Objects/Specific/soulparts.yml @@ -0,0 +1,181 @@ +- type: entity + parent: [ BaseItem, TierXContraband ] + id: SoulFragmentSight + name: soul fragment - sight + description: The Archivist's gifts. + components: + - type: Item + size: Tiny + - type: Sprite + sprite: _Impstation/Heretic/soul_fragments.rsi + state: sight + noRot: true + - type: Icon + sprite: _Impstation/Heretic/soul_fragments.rsi + state: sight + - type: PointLight + radius: 1.5 + energy: 3 + color: "#f7ff1c" + - type: Tag + tags: + - Organ + - Eyes + - type: HereticSoulFragment + message: heretic-soul-fragment-sight + +- type: entity + parent: SoulFragmentSight + id: SoulFragmentHunger + name: soul fragment - hunger + description: The Doe's gifts. + components: + - type: Item + size: Tiny + - type: Sprite + sprite: _Impstation/Heretic/soul_fragments.rsi + state: hunger + noRot: true #doe in shambles + - type: Icon + sprite: _Impstation/Heretic/soul_fragments.rsi + state: hunger + - type: PointLight + radius: 1.5 + energy: 3 + color: "#ff4423" + - type: Tag + tags: + - Organ + - Stomach + - type: HereticSoulFragment + message: heretic-soul-fragment-hunger + +- type: entity + parent: SoulFragmentSight + id: SoulFragmentDreams + name: soul fragment - dreams + description: A gift to ourselves. + components: + - type: Item + size: Tiny + - type: Sprite + sprite: _Impstation/Heretic/soul_fragments.rsi + state: dreams + noRot: true + - type: Icon + sprite: _Impstation/Heretic/soul_fragments.rsi + state: dreams + - type: PointLight + radius: 1.5 + energy: 3 + color: "#68d8d6" + - type: Tag + tags: + - Organ + - Brain + - type: HereticSoulFragment + message: heretic-soul-fragment-dreams + +- type: entity + parent: SoulFragmentSight + id: SoulFragmentRhythm + name: soul fragment - rhythm + description: The Note's gifts. + components: + - type: Item + size: Tiny + - type: Sprite + sprite: _Impstation/Heretic/soul_fragments.rsi + state: rhythm + noRot: true + - type: Icon + sprite: _Impstation/Heretic/soul_fragments.rsi + state: rhythm + - type: PointLight + radius: 1.5 + energy: 3 + color: "#ff7c6d" + - type: Tag + tags: + - Organ + - Heart + - type: HereticSoulFragment + message: heretic-soul-fragment-rhythm + +- type: entity + parent: SoulFragmentSight + id: SoulFragmentSpeech + name: soul fragment - speech + description: The Alchemist's gifts. + components: + - type: Item + size: Tiny + - type: Sprite + sprite: _Impstation/Heretic/soul_fragments.rsi + state: speech + noRot: true + - type: Icon + sprite: _Impstation/Heretic/soul_fragments.rsi + state: speech + - type: PointLight + radius: 1.5 + energy: 3 + color: "#de50e5" + - type: Tag + tags: + - Organ + - Lungs + - type: HereticSoulFragment + message: heretic-soul-fragment-speech + +- type: entity + parent: SoulFragmentSight + id: SoulFragmentSword + name: soul fragment - sword + description: The Fugitive's gifts. + components: + - type: Item + size: Tiny + - type: Sprite + sprite: _Impstation/Heretic/soul_fragments.rsi + state: sword + noRot: true + - type: Icon + sprite: _Impstation/Heretic/soul_fragments.rsi + state: sword + - type: PointLight + radius: 1.5 + energy: 3 + color: "#d6dd49" + - type: Tag + tags: + - Organ + - Kidneys + - type: HereticSoulFragment + message: heretic-soul-fragment-sword + +- type: entity + parent: SoulFragmentSight + id: SoulFragmentShield + name: soul fragment - shield + description: The Warden's gifts. + components: + - type: Item + size: Tiny + - type: Sprite + sprite: _Impstation/Heretic/soul_fragments.rsi + state: shield + noRot: true + - type: Icon + sprite: _Impstation/Heretic/soul_fragments.rsi + state: shield + - type: PointLight + radius: 1.5 + energy: 3 + color: "#ef6007" + - type: Tag + tags: + - Organ + - Liver + - type: HereticSoulFragment + message: heretic-soul-fragment-shield \ No newline at end of file diff --git a/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/dreams.png b/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/dreams.png new file mode 100644 index 0000000000000..689802dd29a2e Binary files /dev/null and b/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/dreams.png differ diff --git a/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/hunger.png b/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/hunger.png new file mode 100644 index 0000000000000..805a45ecc2b3c Binary files /dev/null and b/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/hunger.png differ diff --git a/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/meta.json b/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/meta.json new file mode 100644 index 0000000000000..468367201da09 --- /dev/null +++ b/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/meta.json @@ -0,0 +1,88 @@ +{ + "version": 1, + "license": "CC-BY-SA-4.0", + "copyright": "created by Kandiyaki for Impstation", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "sight", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "hunger", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "rhythm", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "sword", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "shield", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "speech", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "dreams", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + } + ] +} diff --git a/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/rhythm.png b/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/rhythm.png new file mode 100644 index 0000000000000..3dd35338946f0 Binary files /dev/null and b/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/rhythm.png differ diff --git a/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/shield.png b/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/shield.png new file mode 100644 index 0000000000000..6e4f5b5000af5 Binary files /dev/null and b/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/shield.png differ diff --git a/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/sight.png b/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/sight.png new file mode 100644 index 0000000000000..8ef6c6022a457 Binary files /dev/null and b/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/sight.png differ diff --git a/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/speech.png b/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/speech.png new file mode 100644 index 0000000000000..d7ea8d88c8e33 Binary files /dev/null and b/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/speech.png differ diff --git a/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/sword.png b/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/sword.png new file mode 100644 index 0000000000000..19e30c1a4002e Binary files /dev/null and b/Resources/Textures/_Impstation/Heretic/soul_fragments.rsi/sword.png differ