A game about forced loneliness, made by TACStudios
1using System;
2using UnityEngine;
3
4namespace Unity.VisualScripting
5{
6 public interface IMemberUnitOption : IUnitOption
7 {
8 Type targetType { get; }
9 Member member { get; }
10 Member pseudoDeclarer { get; }
11 }
12
13 public abstract class MemberUnitOption<TMemberUnit> : UnitOption<TMemberUnit>, IMemberUnitOption where TMemberUnit : MemberUnit
14 {
15 protected MemberUnitOption() : base() { }
16
17 protected MemberUnitOption(TMemberUnit unit) : base(unit)
18 {
19 sourceScriptGuids = UnitBase.GetScriptGuids(unit.member.targetType).ToHashSet();
20 }
21
22 private Member _member;
23
24 private Member _pseudoDeclarer;
25
26 public Member member
27 {
28 get => _member ?? unit.member;
29 set => _member = value;
30 }
31
32 public Member pseudoDeclarer
33 {
34 get => _pseudoDeclarer ?? member.ToPseudoDeclarer();
35 set => _pseudoDeclarer = value;
36 }
37
38 public bool isPseudoInherited => member == pseudoDeclarer;
39
40 protected abstract ActionDirection direction { get; }
41
42 public Type targetType { get; private set; }
43
44 protected override GUIStyle Style()
45 {
46 if (unit.member.isPseudoInherited)
47 {
48 return FuzzyWindow.Styles.optionWithIconDim;
49 }
50
51 return base.Style();
52 }
53
54 protected override string Label(bool human)
55 {
56 return unit.member.info.SelectedName(human, direction);
57 }
58
59 protected override string FavoriteKey()
60 {
61 return $"{member.ToUniqueString()}@{direction.ToString().ToLower()}";
62 }
63
64 protected override int Order()
65 {
66 if (member.isConstructor)
67 {
68 return 0;
69 }
70
71 return base.Order();
72 }
73
74 protected override string Haystack(bool human)
75 {
76 return $"{targetType.SelectedName(human)}{(human ? ": " : ".")}{Label(human)}";
77 }
78
79 protected override void FillFromUnit()
80 {
81 targetType = unit.member.targetType;
82 member = unit.member;
83 pseudoDeclarer = member.ToPseudoDeclarer();
84
85 base.FillFromUnit();
86 }
87
88 public override void Deserialize(UnitOptionRow row)
89 {
90 base.Deserialize(row);
91
92 targetType = Codebase.DeserializeType(row.tag1);
93
94 if (!string.IsNullOrEmpty(row.tag2))
95 {
96 member = Codebase.DeserializeMember(row.tag2);
97 }
98
99 if (!string.IsNullOrEmpty(row.tag3))
100 {
101 pseudoDeclarer = Codebase.DeserializeMember(row.tag3);
102 }
103 }
104
105 public override UnitOptionRow Serialize()
106 {
107 var row = base.Serialize();
108
109 row.tag1 = Codebase.SerializeType(targetType);
110 row.tag2 = Codebase.SerializeMember(member);
111 row.tag3 = Codebase.SerializeMember(pseudoDeclarer);
112
113 return row;
114 }
115
116 public override void OnPopulate()
117 {
118 // Members are late-reflected to speed up loading and search
119 // We only reflect them when we're just about to populate their node
120 // By doing it in OnPopulate instead of on-demand later, we ensure
121 // any error will be gracefully catched and shown as a warning by
122 // the fuzzy window
123
124 member.EnsureReflected();
125 pseudoDeclarer.EnsureReflected();
126
127 base.OnPopulate();
128 }
129 }
130}