Client LuaCsForBarotrauma
TagLString.cs
1 #nullable enable
2 using System;
3 using System.Collections.Generic;
4 using System.Collections.Immutable;
5 using System.Linq;
7 
8 namespace Barotrauma
9 {
10  public class TagLString : LocalizedString
11  {
12  private readonly ImmutableArray<Identifier> tags;
13 
17  public bool UsingDefaultLanguageAsFallback { get; private set; }
18 
19  public TagLString(params Identifier[] tags)
20  {
21  this.tags = tags.ToImmutableArray();
22  }
23 
24  private LoadedSuccessfully loadedSuccessfully = LoadedSuccessfully.Unknown;
25 
26  public override bool Loaded
27  {
28  get
29  {
30  if (loadedSuccessfully == LoadedSuccessfully.Unknown) { RetrieveValue(); }
31  return loadedSuccessfully == LoadedSuccessfully.Yes;
32  }
33  }
34 
35  public override void RetrieveValue()
36  {
38 
40 
41  (string value, bool loaded) tryLoad(LanguageIdentifier lang)
42  {
43  IReadOnlyList<TextPack.Text> candidates = Array.Empty<TextPack.Text>();
44  int tagIndex = 0;
45 
46  if (TextManager.TextPacks.TryGetValue(lang, out var packs))
47  {
48  while (candidates.Count == 0 && tagIndex < tags.Length)
49  {
50  foreach (var pack in packs)
51  {
52  if (pack.Texts.TryGetValue(tags[tagIndex], out var texts))
53  {
54  candidates = candidates.ListConcat(texts);
55  }
56  }
57  tagIndex++;
58  }
59  }
60 
61  if (candidates.Count == 0) { return (string.Empty, loaded: false); }
62  var firstOverride = candidates.FirstOrDefault(c => c.IsOverride);
63  if (firstOverride != default)
64  {
65  //if there's overrides defined, choose from the first pack that defines overrides
66  return (candidates.Where(static c => c.IsOverride).Where(c => c.TextPack == firstOverride.TextPack).GetRandomUnsynced().String, loaded: true);
67  }
68  else
69  {
70  return (candidates.GetRandomUnsynced().String, loaded: true);
71  }
72  }
73 
74  var (value, loaded) = tryLoad(Language);
75  loadedSuccessfully = loaded ? LoadedSuccessfully.Yes : LoadedSuccessfully.No;
76  cachedValue = value;
77  if (!loaded && Language != TextManager.DefaultLanguage)
78  {
79  (value, bool fallbackLoaded) = tryLoad(TextManager.DefaultLanguage);
80  cachedValue = value;
81  UsingDefaultLanguageAsFallback = fallbackLoaded;
82  //Notice how we don't set loadedSuccessfully again here.
83  //This is by design; falling back to English means that
84  //this text did NOT load successfully, so Loaded must
85  //return false.
86  }
87  }
88  }
89 }
LanguageIdentifier Language
override void RetrieveValue()
Definition: TagLString.cs:35
bool UsingDefaultLanguageAsFallback
Did we end up using the text in the default language (English) due to the text not being found in the...
Definition: TagLString.cs:17
TagLString(params Identifier[] tags)
Definition: TagLString.cs:19
override bool Loaded
Definition: TagLString.cs:27
readonly record struct Text(string String, bool IsOverride, TextPack TextPack)