refactor: Add AllKnowing comp, separate paper and events

This commit is contained in:
Tornado Tech
2025-03-06 18:40:17 +10:00
parent 44f4c17266
commit 35e6bae5fe
7 changed files with 148 additions and 98 deletions

View File

@@ -0,0 +1,62 @@
using System.Text;
using Content.Shared._CP14.Knowledge.Components;
using Content.Shared.Paper;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.Knowledge;
public sealed class CP14KnowledgePaperTextSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly PaperSystem _paper = default!;
public override void Initialize()
{
SubscribeLocalEvent<CP14KnowledgePaperTextComponent, MapInitEvent>(OnPaperMapInit);
}
private void OnPaperMapInit(Entity<CP14KnowledgePaperTextComponent> ent, ref MapInitEvent args)
{
if (!TryComp<PaperComponent>(ent, out var paperComponent))
return;
var paper = new Entity<PaperComponent>(ent, paperComponent);
if (!TryComp<CP14KnowledgeLearningSourceComponent>(ent, out var knowledge))
return;
if (knowledge.Knowledge.Count == 0)
return;
var content = GenerateText(knowledge);
_paper.SetContent(paper, content);
paper.Comp.EditingDisabled = true;
// Yes we need to do synchronization after such changes,
// yes predict, but we need to
Dirty(paper);
}
private string GenerateText(CP14KnowledgeLearningSourceComponent source)
{
var stringBuilder = new StringBuilder();
// Header
stringBuilder.Append(Loc.GetString("cp14-knowledge-book-pre-text"));
// Main body
foreach (var prototypeId in source.Knowledge)
{
if (!_prototype.TryIndex(prototypeId, out var indexedKnowledge))
continue;
stringBuilder.Append($"\n{Loc.GetString(indexedKnowledge.Desc)}");
}
// Footer
stringBuilder.Append($"\n\n{Loc.GetString("cp14-knowledge-book-post-text")}");
return stringBuilder.ToString();
}
}