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}