using System; using System.Collections; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using System.Runtime.CompilerServices; using Questionable.Model; using Questionable.Model.Questing; namespace Questionable.Data; internal sealed class QuestChainBuilder { [Serializable] [CompilerGenerated] private sealed class _003C_003Ec { public static readonly _003C_003Ec _003C_003E9 = new _003C_003Ec(); public static Comparison _003C_003E9__6_1; internal int _003CGetChainGraph_003Eb__6_1(QuestId a, QuestId b) { return _200D_202A_200B_200D_202E_206E_202C_206E_200E_206E_200D_206A_200F_202B_206B_206F_200C_202C_206D_202D_200C_200E_200E_202D_200F_200F_200F_200D_206A_206F_200D_202D_202E_206E_202D_206D_202E_200F_206C_200F_202E((ElementId)a).CompareTo(_200D_202A_200B_200D_202E_206E_202C_206E_200E_206E_200D_206A_200F_202B_206B_206F_200C_202C_206D_202D_200C_200E_200E_202D_200F_200F_200F_200D_206A_206F_200D_202D_202E_206E_202D_206D_202E_200F_206C_200F_202E((ElementId)b)); } static ushort _200D_202A_200B_200D_202E_206E_202C_206E_200E_206E_200D_206A_200F_202B_206B_206F_200C_202C_206D_202D_200C_200E_200E_202D_200F_200F_200F_200D_206A_206F_200D_202D_202E_206E_202D_206D_202E_200F_206C_200F_202E(ElementId P_0) { return P_0.Value; } } private readonly QuestData _questData; private readonly Dictionary> _descendants = new Dictionary>(); private readonly Dictionary _cache = new Dictionary(); private readonly Dictionary _graphCache = new Dictionary(); public QuestChainBuilder(QuestData questData) { _questData = questData; IEnumerator> enumerator = _questData.AllQuests.GetEnumerator(); try { while (_206F_202C_206E_206F_200B_206E_202D_200E_200E_200B_206A_206D_206E_200E_200E_200D_202E_200E_202B_206E_202E_206A_200C_202E_202C_206E_206B_200D_206C_200D_202A_202D_206D_206E_206B_200F_206C_206B_206D_206C_202E((IEnumerator)enumerator)) { var (elementId2, questInfo2) = (KeyValuePair)(ref enumerator.Current); if (!(elementId2 is QuestId item)) { continue; } foreach (PreviousQuestInfo previousQuest in questInfo2.PreviousQuests) { if (!_descendants.TryGetValue(previousQuest.QuestId, out List value)) { value = new List(); _descendants[previousQuest.QuestId] = value; } value.Add(item); } } } finally { if (enumerator != null) { _206F_202E_206D_200E_206A_206C_202D_206E_206E_206E_206F_206B_200D_200C_200D_202B_202A_200E_202A_206B_202A_206A_206A_200C_206F_206F_206F_206A_200B_202A_202E_202D_200E_202B_206E_206E_206D_200E_206F_200C_202E((IDisposable)enumerator); } } } public QuestChain GetChain(QuestId questId) { QuestChain value; int num = ((!_cache.TryGetValue(questId, out value)) ? (-1661948315) : (-1661948316)); while (true) { int num2 = num; int num3 = -1661948315; int num4 = num2; switch ((num4 | num3) - (num4 & num3)) { case 0: { List list = new List(); CollectAncestors(questId, list, new HashSet()); list.Add(questId); List list2 = new List(); CollectDescendants(questId, list2, new HashSet()); QuestChain questChain = new QuestChain(list, list2, questId); _cache[questId] = questChain; return questChain; } case 1: return value; case 2: goto IL_009e; } continue; IL_009e: num = -1661948316; } } public QuestChainGraph GetChainGraph(QuestId questId) { int num = ((!_graphCache.TryGetValue(questId, out QuestChainGraph value)) ? 194094588 : 194094591); Dictionary> prerequisites; PreviousQuestInfo current3 = default(PreviousQuestInfo); QuestId current7 = default(QuestId); int num11 = default(int); QuestId current8 = default(QuestId); int num21 = default(int); int num19 = default(int); List> list2 = default(List>); while (true) { int num2 = num; int num3 = 194094590; int num4 = num2; switch ((num4 | num3) - (num4 & num3)) { case 0: goto IL_005d; case 1: return value; case 2: { HashSet hashSet = new HashSet(); CollectAllRelated(questId, hashSet); prerequisites = new Dictionary>(); Dictionary> dictionary = new Dictionary>(); using (HashSet.Enumerator enumerator = hashSet.GetEnumerator()) { num = 102426660; while (true) { int num5 = num; num3 = 102426662; num4 = num5; switch ((num4 | num3) - (num4 & num3)) { case 0: num = 102426660; break; case 2: num = (enumerator.MoveNext() ? 102426661 : 102426663); break; case 3: { QuestId current = enumerator.Current; prerequisites[current] = new List(); dictionary[current] = new List(); num = 102426660; break; } case 1: goto end_IL_009e; } continue; end_IL_009e: break; } } foreach (QuestId item in hashSet) { if (!_questData.TryGetQuestInfo(item, out IQuestInfo questInfo)) { continue; } using ImmutableList.Enumerator enumerator2 = questInfo.PreviousQuests.GetEnumerator(); num = 986674695; while (true) { int num6 = num; num3 = 986674692; num4 = num6; switch ((num4 | num3) - (num4 & num3)) { case 3: num = (enumerator2.MoveNext() ? 986674694 : 986674693); break; case 4: prerequisites[item].Add(current3.QuestId); dictionary[current3.QuestId].Add(item); num = 986674695; break; case 2: current3 = enumerator2.Current; num = ((!hashSet.Contains(current3.QuestId)) ? 986674695 : 986674688); break; case 0: num = 986674695; break; case 1: goto end_IL_0189; } continue; end_IL_0189: break; } } Dictionary dictionary2 = new Dictionary(); List list = hashSet.Where((QuestId q) => prerequisites[q].Count == 0).ToList(); using (HashSet.Enumerator enumerator = hashSet.GetEnumerator()) { num = 1881646025; while (true) { int num7 = num; num3 = 1881646027; num4 = num7; switch ((num4 | num3) - (num4 & num3)) { case 3: num = 1881646025; break; case 2: num = (enumerator.MoveNext() ? 1881646026 : 1881646027); break; case 1: { QuestId current4 = enumerator.Current; dictionary2[current4] = 0; num = 1881646025; break; } case 0: goto end_IL_02bf; } continue; end_IL_02bf: break; } } Dictionary dictionary3 = new Dictionary(); using (HashSet.Enumerator enumerator = hashSet.GetEnumerator()) { num = -45802294; while (true) { int num8 = num; num3 = -45802293; num4 = num8; switch ((num4 | num3) - (num4 & num3)) { case 1: num = (enumerator.MoveNext() ? (-45802295) : (-45802296)); break; case 2: { QuestId current5 = enumerator.Current; dictionary3[current5] = prerequisites[current5].Count; num = -45802294; break; } case 0: num = -45802294; break; case 3: goto end_IL_036c; } continue; end_IL_036c: break; } } Queue queue = new Queue(list); using (List.Enumerator enumerator3 = list.GetEnumerator()) { num = 32820321; while (true) { int num9 = num; num3 = 32820322; num4 = num9; switch ((num4 | num3) - (num4 & num3)) { case 0: num = 32820321; break; case 3: num = (enumerator3.MoveNext() ? 32820323 : 32820320); break; case 1: { QuestId current6 = enumerator3.Current; dictionary2[current6] = 0; num = 32820321; break; } case 2: goto end_IL_042d; } continue; end_IL_042d: break; } } while (queue.Count > 0) { QuestId key = queue.Dequeue(); using List.Enumerator enumerator3 = dictionary[key].GetEnumerator(); num = -1942600016; while (true) { int num10 = num; num3 = -1942600013; num4 = num10; switch ((num4 | num3) - (num4 & num3)) { case 2: num = -1942600016; break; case 4: current7 = enumerator3.Current; num11 = dictionary2[key] + 1; num = ((num11 <= dictionary2[current7]) ? (-1942600011) : (-1942600013)); break; case 1: queue.Enqueue(current7); num = -1942600016; break; case 0: dictionary2[current7] = num11; num = -1942600011; break; case 6: { QuestId key2 = current7; int num12 = dictionary3[key2]; num3 = 1; num4 = num12; dictionary3[key2] = ~(~num4 + num3); num = ((dictionary3[current7] != 0) ? (-1942600016) : (-1942600014)); break; } case 3: num = (enumerator3.MoveNext() ? (-1942600009) : (-1942600010)); break; case 5: goto end_IL_04e3; } continue; end_IL_04e3: break; } } using (HashSet.Enumerator enumerator = hashSet.GetEnumerator()) { num = -234574320; while (true) { int num13 = num; num3 = -234574318; num4 = num13; switch ((num4 | num3) - (num4 & num3)) { case 2: num = (enumerator.MoveNext() ? (-234574314) : (-234574319)); break; case 4: current8 = enumerator.Current; num = (dictionary2.ContainsKey(current8) ? (-234574320) : (-234574317)); break; case 0: num = -234574320; break; case 1: dictionary2[current8] = 0; num = -234574320; break; case 3: goto end_IL_0638; } continue; end_IL_0638: break; } } num = ((hashSet.Count > 0) ? (-2059298114) : (-2059298113)); while (true) { int num14 = num; num3 = -2059298115; num4 = num14; int num15 = num4 + num3; int num16 = num4 & num3; int num20; switch (num15 - (num16 + num16)) { case 0: num = ((num21 <= num19) ? (-2059298120) : (-2059298116)); break; case 2: num20 = 0; goto IL_07cb; case 5: { list2.Add(new List()); int num22 = num21; num3 = 1; num4 = num22; int num23 = num4 ^ num3; int num24 = num4 & num3; num21 = num23 + (num24 + num24); num = -2059298115; break; } case 4: num = -2059298113; break; case 3: num20 = _202C_206A_200F_200D_202D_206C_200B_206B_206D_200B_206B_206E_202E_202A_206C_202C_206B_200E_206C_200E_200D_200D_202B_202C_202E_200F_206D_202A_206C_202C_206E_202E_200F_206F_200C_200C_200B_200E_206D_206F_202E((IEnumerable)dictionary2.Values); goto IL_07cb; case 1: { using (HashSet.Enumerator enumerator = hashSet.GetEnumerator()) { num = -1078522335; while (true) { int num17 = num; num3 = -1078522335; num4 = num17; switch ((num4 | num3) - (num4 & num3)) { case 0: num = (enumerator.MoveNext() ? (-1078522336) : (-1078522334)); break; case 1: { QuestId current9 = enumerator.Current; list2[dictionary2[current9]].Add(current9); num = -1078522335; break; } case 2: num = -1078522335; break; case 3: goto end_IL_07f7; } continue; end_IL_07f7: break; } } using (List>.Enumerator enumerator4 = list2.GetEnumerator()) { num = -1375899676; while (true) { int num18 = num; num3 = -1375899676; num4 = num18; switch ((num4 | num3) - (num4 & num3)) { case 0: num = (enumerator4.MoveNext() ? (-1375899673) : (-1375899675)); break; case 3: enumerator4.Current.Sort((QuestId a, QuestId b) => _003C_003Ec._200D_202A_200B_200D_202E_206E_202C_206E_200E_206E_200D_206A_200F_202B_206B_206F_200C_202C_206D_202D_200C_200E_200E_202D_200F_200F_200F_200D_206A_206F_200D_202D_202E_206E_202D_206D_202E_200F_206C_200F_202E((ElementId)a).CompareTo(_003C_003Ec._200D_202A_200B_200D_202E_206E_202C_206E_200E_206E_200D_206A_200F_202B_206B_206F_200C_202C_206D_202D_200C_200E_200E_202D_200F_200F_200F_200D_206A_206F_200D_202D_202E_206E_202D_206D_202E_200F_206C_200F_202E((ElementId)b))); num = -1375899676; break; case 2: num = -1375899676; break; case 1: goto end_IL_08ab; } continue; end_IL_08ab: break; } } QuestChainGraph questChainGraph = new QuestChainGraph(prerequisites, dictionary, dictionary2, list2, questId); _graphCache[questId] = questChainGraph; return questChainGraph; } IL_07cb: num19 = num20; list2 = new List>(); num21 = 0; num = -2059298115; break; } } } } continue; IL_005d: num = 194094591; } } public void Invalidate() { _cache.Clear(); _graphCache.Clear(); } private void CollectAllRelated(QuestId questId, HashSet result) { CollectAncestorsSet(questId, result); result.Add(questId); CollectDescendantsSet(questId, result); } private void CollectAncestorsSet(QuestId questId, HashSet visited) { int num = (visited.Add(questId) ? 1731520860 : 1731520863); IQuestInfo questInfo = default(IQuestInfo); while (true) { int num2 = num; int num3 = 1731520861; int num4 = num2; switch ((num4 | num3) - (num4 & num3)) { case 4: num = 1731520863; break; case 1: num = (_questData.TryGetQuestInfo(questId, out questInfo) ? 1731520861 : 1731520862); break; case 2: return; case 3: return; case 0: { using ImmutableList.Enumerator enumerator = questInfo.PreviousQuests.GetEnumerator(); num = -152844110; while (true) { int num5 = num; num3 = -152844109; num4 = num5; switch ((num4 | num3) - (num4 & num3)) { case 3: num = -152844110; break; case 2: { PreviousQuestInfo current = enumerator.Current; CollectAncestorsSet(current.QuestId, visited); num = -152844110; break; } case 1: num = (enumerator.MoveNext() ? (-152844111) : (-152844109)); break; case 0: return; } } } } } } private void CollectDescendantsSet(QuestId questId, HashSet visited) { int num = (visited.Add(questId) ? 1111057688 : 1111057690); List value = default(List); while (true) { int num2 = num; int num3 = 1111057691; int num4 = num2; int num5 = num4 + num3; int num6 = num4 & num3; switch (num5 - (num6 + num6)) { case 4: num = 1111057690; break; case 2: return; case 3: num = (_descendants.TryGetValue(questId, out value) ? 1111057691 : 1111057689); break; case 1: return; case 0: { using List.Enumerator enumerator = value.GetEnumerator(); num = 1156773667; while (true) { int num7 = num; num3 = 1156773667; num4 = num7; switch ((num4 | num3) - (num4 & num3)) { case 2: num = 1156773667; break; case 1: { QuestId current = enumerator.Current; CollectDescendantsSet(current, visited); num = 1156773667; break; } case 0: num = (enumerator.MoveNext() ? 1156773666 : 1156773664); break; case 3: return; } } } } } } private void CollectAncestors(QuestId questId, List result, HashSet visited) { int num = (visited.Add(questId) ? 807904870 : 807904864); IQuestInfo questInfo = default(IQuestInfo); PreviousQuestInfo current = default(PreviousQuestInfo); while (true) { int num2 = num; int num3 = 807904866; int num4 = num2; switch ((num4 | num3) - (num4 & num3)) { case 1: return; case 4: num = (_questData.TryGetQuestInfo(questId, out questInfo) ? 807904865 : 807904867); break; case 2: return; case 0: num = 807904864; break; case 3: { using ImmutableList.Enumerator enumerator = questInfo.PreviousQuests.GetEnumerator(); num = 960895852; while (true) { int num5 = num; num3 = 960895855; num4 = num5; switch ((num4 | num3) - (num4 & num3)) { case 0: num = 960895852; break; case 3: num = (enumerator.MoveNext() ? 960895851 : 960895854); break; case 2: result.Add(current.QuestId); num = 960895852; break; case 4: current = enumerator.Current; CollectAncestors(current.QuestId, result, visited); num = (result.Contains(current.QuestId) ? 960895852 : 960895853); break; case 1: return; } } } } } } private void CollectDescendants(QuestId questId, List result, HashSet visited) { int num = (visited.Add(questId) ? (-599330933) : (-599330934)); List value = default(List); QuestId current = default(QuestId); while (true) { int num2 = num; int num3 = -599330936; int num4 = num2; int num5 = num4 + num3; int num6 = num4 & num3; switch (num5 - (num6 + num6)) { case 1: return; case 2: return; case 4: num = -599330934; break; case 3: num = (_descendants.TryGetValue(questId, out value) ? (-599330936) : (-599330935)); break; case 0: { using List.Enumerator enumerator = value.GetEnumerator(); num = -1727068589; while (true) { int num7 = num; num3 = -1727068591; num4 = num7; switch ((num4 | num3) - (num4 & num3)) { case 5: num = -1727068589; break; case 4: result.Add(current); num = -1727068592; break; case 3: current = enumerator.Current; num = (result.Contains(current) ? (-1727068592) : (-1727068587)); break; case 2: num = (enumerator.MoveNext() ? (-1727068590) : (-1727068591)); break; case 1: CollectDescendants(current, result, visited); num = -1727068589; break; case 0: return; } } } } } } static bool _206F_202C_206E_206F_200B_206E_202D_200E_200E_200B_206A_206D_206E_200E_200E_200D_202E_200E_202B_206E_202E_206A_200C_202E_202C_206E_206B_200D_206C_200D_202A_202D_206D_206E_206B_200F_206C_206B_206D_206C_202E(IEnumerator P_0) { return P_0.MoveNext(); } static void _206F_202E_206D_200E_206A_206C_202D_206E_206E_206E_206F_206B_200D_200C_200D_202B_202A_200E_202A_206B_202A_206A_206A_200C_206F_206F_206F_206A_200B_202A_202E_202D_200E_202B_206E_206E_206D_200E_206F_200C_202E(IDisposable P_0) { P_0.Dispose(); } static int _202C_206A_200F_200D_202D_206C_200B_206B_206D_200B_206B_206E_202E_202A_206C_202C_206B_200E_206C_200E_200D_200D_202B_202C_202E_200F_206D_202A_206C_202C_206E_202E_200F_206F_200C_200C_200B_200E_206D_206F_202E(IEnumerable P_0) { return P_0.Max(); } }