Offbrand medical (#3366)
* Offbrand medical * what if we regrade * zombies are mostly there thats it thats a wrap xd * here's changeling * some bonus gut punches * start working on the guidebook * fix rsi and yaml lints * my agrichem so fits * we stay rejuvenated * my china so laked * debrute * fix suicide * fix the suicide tests * my surgery so requires laying down * the guidebook continues * READ KEB PAGES * keb vascular recoupler * read keb medicine * fix yaml lint * fix the EntityRemoveConstructionGraphStep * fix overlay init * scalpels are not a food tool * return of the programmer art * my line so nieuw * boxes deserve veins too * mrrrp yaml * what if we redid brain damage alerts * bloot pressure * kill mannitol drowsiness * get licensed * my read so me * get feedbacked nerd * fine-tune the heart stoppage conditions * cryostasis adjustments, guidebook adjustments, fix negative strain issues * my surgery so table * fix heart surgery and guidebook * medicine & defibrillator pass * iv bags and stands * prefills * janet gets very sidetracked * mostly finished iv stuff * what if we fixed the guidebook * halve decapoid cryostasis * my medicines so IV * finetune cryostasis * less logspam * metabolism-aware iv stands and cryopods * give people painkillers * yaml lint real * fix blood build * finish rebase * tidy up localization * clean up my yaml beasties... * soft curve after exceeding maximum damage * husks/bonedeaths Grabbag of Offmed fixes & improvements (#3461) * CPR moment * Mob AI fix * Fix brain oxygenation not updating on regeneration * sorry gamers you cannot resist the pull * Troll combat abilities more in softcrit praying rn (#3467) dont have CPR be 50% (#3468) Make offbrand murder easier to contend with (#3473) * e * disrupt people in softcrit when attacking them * ok gamers we're gaming * forgor Hopefully final pass before Offbrand merge (#3475) First pass of Offbrand adjustments (#3477) Swap blood pressure values in health analyzer (#3476) Systolic over diastolic Co-authored-by: Kip <32859367+kipdotnet@users.noreply.github.com> Offbrand pass 2: Mostly bugfixes (#3480) Fix zeds causing PVS reloads (#3482) Offbrand pass 3: I hate surgery I hate surgery I hate surgery I (#3481) * set up surgery ui * test fail real Pain/braingasps (#3487) Offmed bundle 5 - the evil one (#3489) * Evil cavity surgery * les borgues * nicotine moment * epinephrine RNG * legalese * test fail real * ok jamers cope with c4 Pass 6
This commit is contained in:
committed by
Janet Blackquill
parent
398c8df343
commit
8894eca118
150
Content.Client/_Offbrand/Surgery/SurgeryGuideMenu.xaml.cs
Normal file
150
Content.Client/_Offbrand/Surgery/SurgeryGuideMenu.xaml.cs
Normal file
@@ -0,0 +1,150 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
using Content.Client.Construction;
|
||||
using Content.Client.UserInterface.Controls;
|
||||
using Content.Shared.Construction.Prototypes;
|
||||
using Robust.Client.AutoGenerated;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
using Robust.Client.UserInterface.XAML;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Client._Offbrand.Surgery;
|
||||
|
||||
public record SurgeryListData(ConstructionPrototype Construction) : ListData;
|
||||
|
||||
[GenerateTypedNameReferences]
|
||||
public sealed partial class SurgeryGuideMenu : FancyWindow
|
||||
{
|
||||
[Dependency] private readonly IEntityManager _entityManager = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
|
||||
private readonly ConstructionSystem _construction = default!;
|
||||
private readonly SpriteSystem _sprite = default!;
|
||||
|
||||
public event Action<ProtoId<ConstructionPrototype>>? OnSurgerySelected;
|
||||
public event Action? OnCleanUp;
|
||||
|
||||
private ConstructionPrototype? _selectedSurgery;
|
||||
|
||||
public SurgeryGuideMenu()
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
IoCManager.InjectDependencies(this);
|
||||
|
||||
_sprite = _entityManager.System<SpriteSystem>();
|
||||
_construction = _entityManager.System<ConstructionSystem>();
|
||||
|
||||
_construction.ConstructionGuideAvailable += GuideAvailable;
|
||||
|
||||
BackButton.OnPressed += _ =>
|
||||
{
|
||||
SurgeriesContainer.Visible = true;
|
||||
StepsContainer.Visible = false;
|
||||
};
|
||||
PerformButton.OnPressed += _ =>
|
||||
{
|
||||
if (_selectedSurgery is not { } surgery)
|
||||
return;
|
||||
|
||||
OnSurgerySelected?.Invoke(surgery.ID);
|
||||
};
|
||||
CleanUp.OnPressed += _ => OnCleanUp?.Invoke();
|
||||
|
||||
PossibleSurgeries.GenerateItem += GenerateButton;
|
||||
PossibleSurgeries.ItemKeyBindDown += OnSelectSurgery;
|
||||
|
||||
Populate();
|
||||
}
|
||||
|
||||
protected override void ExitedTree()
|
||||
{
|
||||
_construction.ConstructionGuideAvailable -= GuideAvailable;
|
||||
}
|
||||
|
||||
private void GuideAvailable(object? sender, string id)
|
||||
{
|
||||
if (_selectedSurgery?.ID != id)
|
||||
return;
|
||||
|
||||
RefreshSteps();
|
||||
}
|
||||
|
||||
private void OnSelectSurgery(GUIBoundKeyEventArgs args, ListData data)
|
||||
{
|
||||
if (data is not SurgeryListData entry)
|
||||
return;
|
||||
|
||||
SurgeriesContainer.Visible = false;
|
||||
StepsContainer.Visible = true;
|
||||
|
||||
_selectedSurgery = entry.Construction;
|
||||
|
||||
SurgeryName.Text = Loc.GetString(entry.Construction.SetName!.Value);
|
||||
SurgeryDescription.Text = Loc.GetString(entry.Construction.SetDescription!.Value);
|
||||
|
||||
RefreshSteps();
|
||||
}
|
||||
|
||||
private void RefreshSteps()
|
||||
{
|
||||
StepsList.Clear();
|
||||
|
||||
if (_selectedSurgery is null || _construction.GetGuide(_selectedSurgery) is not { } guide)
|
||||
return;
|
||||
|
||||
foreach (var entry in guide.Entries)
|
||||
{
|
||||
var text = entry.Arguments != null
|
||||
? Loc.GetString(entry.Localization, entry.Arguments)
|
||||
: Loc.GetString(entry.Localization);
|
||||
|
||||
if (entry.EntryNumber is { } number)
|
||||
{
|
||||
text = Loc.GetString("construction-presenter-step-wrapper",
|
||||
("step-number", number),
|
||||
("text", text));
|
||||
}
|
||||
|
||||
text = text.PadLeft(text.Length + entry.Padding);
|
||||
|
||||
var icon = entry.Icon != null ? _sprite.Frame0(entry.Icon) : Texture.Transparent;
|
||||
StepsList.AddItem(text, icon, false);
|
||||
}
|
||||
}
|
||||
|
||||
private void GenerateButton(ListData data, ListContainerButton button)
|
||||
{
|
||||
if (data is not SurgeryListData entry)
|
||||
return;
|
||||
|
||||
button.AddChild(new Label() { Text = Loc.GetString(entry.Construction.SetName!.Value) });
|
||||
button.ToolTip = Loc.GetString(entry.Construction.SetDescription!.Value);
|
||||
button.AddStyleClass("ButtonSquare");
|
||||
}
|
||||
|
||||
public void Populate()
|
||||
{
|
||||
var listData = new List<SurgeryListData>();
|
||||
|
||||
foreach (var proto in _prototypeManager.EnumeratePrototypes<ConstructionPrototype>())
|
||||
{
|
||||
if (proto.Category != "Surgery")
|
||||
continue;
|
||||
|
||||
listData.Add(new SurgeryListData(proto));
|
||||
}
|
||||
|
||||
listData.Sort((
|
||||
a, b) => string.Compare(Loc.GetString(a.Construction.SetName!.Value), Loc.GetString(b.Construction.SetName!.Value), StringComparison.InvariantCulture));
|
||||
|
||||
PossibleSurgeries.PopulateList(listData);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user