// SPDX-FileCopyrightText: 2025 GoobBot // SPDX-FileCopyrightText: 2025 Solstice // SPDX-FileCopyrightText: 2025 SolsticeOfTheWinter // SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com> // SPDX-FileCopyrightText: 2025 gluesniffler // // SPDX-License-Identifier: AGPL-3.0-or-later using System.Linq; using Content.Shared._Goobstation.Devil; using Content.Server.Body.Components; using Content.Shared._Shitmed.Body.Events; using Content.Shared.Body.Components; using Content.Shared.Body.Part; using Robust.Shared.Random; namespace Content.Server._Goobstation.Devil.Contract; public sealed partial class DevilContractSystem { private void InitializeSpecialActions() { SubscribeLocalEvent(OnSoulOwnership); SubscribeLocalEvent(OnLoseHand); SubscribeLocalEvent(OnLoseLeg); SubscribeLocalEvent(OnLoseOrgan); SubscribeLocalEvent(OnChance); } private void OnSoulOwnership(DevilContractSoulOwnershipEvent args) { if (args.Contract?.ContractOwner is not { } contractOwner) return; TryTransferSouls(contractOwner, args.Target, 1); } private void OnLoseHand(DevilContractLoseHandEvent args) { if (!TryComp(args.Target, out var body)) return; // // var hands = _bodySystem.GetBodyChildrenOfType(args.Target, BodyPartType.Hand, body).ToList(); // // if (hands.Count <= 0) // return; // // var pick = _random.Pick(hands); // if (!TryComp(pick.Id, out var woundable) // || !woundable.ParentWoundable.HasValue) // return; // // _wounds.AmputateWoundableSafely(woundable.ParentWoundable.Value, pick.Id, woundable); // QueueDel(pick.Id); // // Dirty(args.Target, body); // _sawmill.Debug($"Removed part {ToPrettyString(pick.Id)} from {ToPrettyString(args.Target)}"); // QueueDel(pick.Id); var baseXform = Transform(args.Target); foreach (var part in _bodySystem.GetBodyChildrenOfType(args.Target, BodyPartType.Hand, body)) { _transform.AttachToGridOrMap(part.Id); break; } } private void OnLoseLeg(DevilContractLoseLegEvent args) { if (!TryComp(args.Target, out var body)) return; // var legs = _bodySystem.GetBodyChildrenOfType(args.Target, BodyPartType.Leg, body).ToList(); // // if (legs.Count <= 0) // return; // // var pick = _random.Pick(legs); // // if (!TryComp(pick.Id, out var woundable) // || !woundable.ParentWoundable.HasValue) // return; // // _wounds.AmputateWoundableSafely(woundable.ParentWoundable.Value, pick.Id, woundable); // // Dirty(args.Target, body); // _sawmill.Debug($"Removed part {ToPrettyString(pick.Id)} from {ToPrettyString(args.Target)}"); // QueueDel(pick.Id); var baseXform = Transform(args.Target); foreach (var part in _bodySystem.GetBodyChildrenOfType(args.Target, BodyPartType.Leg, body)) { _transform.AttachToGridOrMap(part.Id); break; } } private void OnLoseOrgan(DevilContractLoseOrganEvent args) { // don't remove the brain, as funny as that is. var eligibleOrgans = _bodySystem.GetBodyOrgans(args.Target) .Where(o => !HasComp(o.Id)) .ToList(); if (eligibleOrgans.Count <= 0) return; var pick = _random.Pick(eligibleOrgans); _bodySystem.RemoveOrgan(pick.Id, pick.Component); _sawmill.Debug($"Removed part {ToPrettyString(pick.Id)} from {ToPrettyString(args.Target)}"); QueueDel(pick.Id); } // LETS GO GAMBLING!!!!! private void OnChance(DevilContractChanceEvent args) { AddRandomClause(args.Target); } }