SurgeryToolExamineSystem.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // SPDX-FileCopyrightText: 2024 deltanedas <39013340+deltanedas@users.noreply.github.com>
  2. // SPDX-FileCopyrightText: 2024 deltanedas <@deltanedas:kde.org>
  3. // SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
  4. // SPDX-FileCopyrightText: 2025 Piras314 <p1r4s@proton.me>
  5. // SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
  6. //
  7. // SPDX-License-Identifier: AGPL-3.0-or-later
  8. using Content.Shared.Body.Organ;
  9. using Content.Shared.Body.Part;
  10. using Content.Shared.Examine;
  11. using Content.Shared.Verbs;
  12. using Robust.Shared.Utility;
  13. namespace Content.Shared._Shitmed.Medical.Surgery.Tools;
  14. /// <summary>
  15. /// Examining a surgical or ghetto tool shows everything it can be used for.
  16. /// </summary>
  17. public sealed class SurgeryToolExamineSystem : EntitySystem
  18. {
  19. [Dependency] private readonly ExamineSystemShared _examine = default!;
  20. public override void Initialize()
  21. {
  22. SubscribeLocalEvent<SurgeryToolComponent, GetVerbsEvent<ExamineVerb>>(OnGetVerbs);
  23. SubscribeLocalEvent<BoneGelComponent, SurgeryToolExaminedEvent>(OnExamined);
  24. SubscribeLocalEvent<BoneSawComponent, SurgeryToolExaminedEvent>(OnExamined);
  25. SubscribeLocalEvent<CauteryComponent, SurgeryToolExaminedEvent>(OnExamined);
  26. SubscribeLocalEvent<HemostatComponent, SurgeryToolExaminedEvent>(OnExamined);
  27. SubscribeLocalEvent<RetractorComponent, SurgeryToolExaminedEvent>(OnExamined);
  28. SubscribeLocalEvent<ScalpelComponent, SurgeryToolExaminedEvent>(OnExamined);
  29. SubscribeLocalEvent<DrillComponent, SurgeryToolExaminedEvent>(OnExamined);
  30. SubscribeLocalEvent<TendingComponent, SurgeryToolExaminedEvent>(OnExamined);
  31. SubscribeLocalEvent<TweezersComponent, SurgeryToolExaminedEvent>(OnExamined);
  32. SubscribeLocalEvent<BoneSetterComponent, SurgeryToolExaminedEvent>(OnExamined);
  33. SubscribeLocalEvent<BodyPartComponent, SurgeryToolExaminedEvent>(OnExamined);
  34. SubscribeLocalEvent<OrganComponent, SurgeryToolExaminedEvent>(OnExamined);
  35. }
  36. private void OnGetVerbs(Entity<SurgeryToolComponent> ent, ref GetVerbsEvent<ExamineVerb> args)
  37. {
  38. if (!args.CanInteract || !args.CanAccess)
  39. return;
  40. var msg = FormattedMessage.FromMarkupOrThrow(Loc.GetString("surgery-tool-header"));
  41. msg.PushNewline();
  42. var ev = new SurgeryToolExaminedEvent(msg);
  43. RaiseLocalEvent(ent, ref ev);
  44. _examine.AddDetailedExamineVerb(args, ent.Comp, ev.Message,
  45. Loc.GetString("surgery-tool-examinable-verb-text"), "/Textures/Objects/Specific/Medical/Surgery/scalpel.rsi/scalpel.png",
  46. Loc.GetString("surgery-tool-examinable-verb-message"));
  47. }
  48. private void OnExamined(EntityUid uid, ISurgeryToolComponent comp, ref SurgeryToolExaminedEvent args)
  49. {
  50. var msg = args.Message;
  51. var color = comp.Speed switch
  52. {
  53. < 1f => "red",
  54. > 1f => "green",
  55. _ => "white"
  56. };
  57. var key = "surgery-tool-" + (comp.Used == true ? "used" : "unlimited");
  58. var speed = comp.Speed.ToString("N2"); // 2 decimal places to not get trolled by float
  59. msg.PushMarkup(Loc.GetString(key, ("tool", comp.ToolName), ("speed", speed), ("color", color)));
  60. }
  61. }
  62. [ByRefEvent]
  63. public record struct SurgeryToolExaminedEvent(FormattedMessage Message);