// 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.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.CanSever) return; _bodySystem.RemovePart(new(args.Target, body), pick, _bodySystem.GetSlotFromBodyPart(pick.Component)); QueueDel(pick.Id); Dirty(args.Target, body); Log.Debug($"Removed part {ToPrettyString(pick.Id)} from {ToPrettyString(args.Target)}"); // DeltaV - Use EntitySystem Logger intead of _sawmill QueueDel(pick.Id); } 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.CanSever) return; _bodySystem.RemovePart(new(args.Target, body), pick, _bodySystem.GetSlotFromBodyPart(pick.Component)); Dirty(args.Target, body); Log.Debug($"Removed part {ToPrettyString(pick.Id)} from {ToPrettyString(args.Target)}"); // DeltaV - Use EntitySystem Logger intead of _sawmill QueueDel(pick.Id); } 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); Log.Debug($"Removed part {ToPrettyString(pick.Id)} from {ToPrettyString(args.Target)}"); // DeltaV - Use EntitySystem Logger intead of _sawmill QueueDel(pick.Id); } // LETS GO GAMBLING!!!!! private void OnChance(DevilContractChanceEvent args) { AddRandomClause(args.Target); } }