private int ApplyStoreFailstackEx(EnhancementState state, int toGrade) { if (state.JustFailedGrade < 0 || state.FailStack <= 10) { return(-1); } var numEmptySlots = state.StoredFailstacks.Count(f => f == 0); if (TargetFailstack > 0 && state.FailStack > TargetFailstack - MaxFailstackShift && state.StoredFailstacks.Max(f => f) > TargetFailstack - MaxFailstackShift) { return(-1); } if (toGrade == 2 && numEmptySlots <= 1) { return(-1); } var emptySlot = -1; foreach (var failstack in state.StoredFailstacks) { emptySlot++; if (failstack == 0) { break; } } if (emptySlot < 0) { return(emptySlot); } if (!MaxFailstacks.TryGetValue(toGrade - 1, out var maxFailstack)) { maxFailstack = Failstacks[toGrade - 1]; } // if (toGrade == 2 && numEmptySlots < 4) // maxFailstack /= 2; if (state.FailStack > maxFailstack) // && toGrade < _targetGrade) { return(emptySlot); } return(-1); }
private int ApplyRestoreFailstackEx(EnhancementState state, int toGrade) { if (state.FailStack != 0 || toGrade < 2) { return(-1); } if (!MaxFailstacks.TryGetValue(toGrade - 1, out var maxFailstack)) { maxFailstack = Failstacks[toGrade]; } if (!MinFailstacks.TryGetValue(toGrade - 1, out var minFailstack)) { minFailstack = 1; } if (toGrade == 3 && state.StoredFailstacks.Count(f => f > 0) > 1 && state.StoredFailstacks.Where(f => f > 0).Min() > maxFailstack) { maxFailstack += 12; } if (toGrade == 2 && state.StoredFailstacks.Count(f => f > 0) > 2 && state.StoredFailstacks.Where(f => f > 0).Min() > maxFailstack) { maxFailstack += 12; } var failstackToTake = state.StoredFailstacks.Where(f => f >= minFailstack && f <= maxFailstack) .OrderByDescending(f => f) .FirstOrDefault(); //.Skip(_targetGrade - toGrade).FirstOrDefault(); var slot = -1; if (failstackToTake > 0) { for (var i = 0; i < state.StoredFailstacks.Length; ++i) { if (state.StoredFailstacks[i] != failstackToTake) { continue; } slot = i; break; } } return(slot); }