private WeaveData MakeData(long id) { var data = new WeaveData(); data.Id = id; data.Turns = infos[id].Turns; data.Cooldown = infos[id].Cooldown; return(data); }
private static List <long> FindWeaveMemberIds(WeaveData hostData, List <WeaveData> memberData) { Debug.Assert(memberData.Count > 0); Debug.Assert(hostData.Cooldown == 0); Debug.Assert(hostData.Turns > 1); var partyIds = FindWeaveMemberIds(memberData); if (partyIds.Count > 0) { // Found. // Check if host is in hurry state. int hostTurns = hostData.Turns - 1; var minMemberTurns = ComputeMimimumTurns(memberData.Select(data => data.Turns).ToList()); if (hostTurns >= minMemberTurns) { // Hurry. partyIds.Add(hostData.Id); } else { // Not hurry. // Predict the next party. foreach (var id in partyIds) { var dt = memberData.Find(data => data.Id == id); --dt.Turns; dt.Cooldown = 1; } memberData = memberData.Where(data => data.Turns > 0).ToList(); var nextPartyIds = FindWeaveMemberIds(memberData); if (nextPartyIds.Count == 0) { // Can not find the next party. // The host will be in the current party. partyIds.Add(hostData.Id); } } } return(partyIds); }