public static List <DiscScript> GetSortedInRangeDiscs(int numberOfDiscsToRecall, DiscsOrder discsRecallOrder, bool canRecallUnthrowedDiscs, List <DiscScript> throwedDiscs, List <DiscScript> inRangeDiscs) { List <DiscScript> finalList = new List <DiscScript>(); int remainingNumberOfDiscsToRecall = numberOfDiscsToRecall; bool recallAll = remainingNumberOfDiscsToRecall == 0; int currentDiscIndex = (discsRecallOrder == DiscsOrder.FromNewestToOldest ? throwedDiscs.Count - 1 : 0); while ((recallAll || remainingNumberOfDiscsToRecall > 0) && throwedDiscs.Count > 0) { DiscScript currentDisc = throwedDiscs[currentDiscIndex]; if (!inRangeDiscs.Contains(currentDisc)) { currentDiscIndex += (discsRecallOrder == DiscsOrder.FromNewestToOldest ? -1 : 1); if (currentDiscIndex < 0 || currentDiscIndex >= throwedDiscs.Count) { break; } continue; } finalList.Add(currentDisc); currentDiscIndex += (discsRecallOrder == DiscsOrder.FromNewestToOldest ? -1 : 1); remainingNumberOfDiscsToRecall--; if (currentDiscIndex < 0 || currentDiscIndex >= throwedDiscs.Count) { break; } } if ((remainingNumberOfDiscsToRecall > 0 || recallAll) && canRecallUnthrowedDiscs) { foreach (DiscScript disc in inRangeDiscs) { if (throwedDiscs.Contains(disc)) { continue; } finalList.Add(disc); remainingNumberOfDiscsToRecall--; if (remainingNumberOfDiscsToRecall == 0) { break; } } } return(finalList); }
public GameObject GetTeleportationExchangeObject(TeleportationTarget teleportationTarget) { DiscsOrder order = (teleportationTarget == TeleportationTarget.NewestDisc ? DiscsOrder.FromNewestToOldest : teleportationTarget == TeleportationTarget.OldestDisc ? DiscsOrder.FromOldestToNewest : DiscsOrder.FromNewestToOldest); List <DiscScript> discs = DiscListingFactory.GetSortedInRangeDiscs(1, order, true, DiscManager.Instance.GetAllThrowedDiscs, DiscManager.Instance.GetInRangeDiscs); if (discs.Count == 0) { return(null); } return(discs[0].gameObject); }
public static DiscTrajectoryParameters GetTrajectory(CompetenceDisc competence, Vector3 startPosition, Vector3 targetPosition, List <DiscScript> throwedDiscs, List <DiscScript> inRangeDiscs, DiscScript currentDisc) { DiscTrajectoryParameters discTrajectoryParameters = new DiscTrajectoryParameters(); discTrajectoryParameters.disc = currentDisc; List <Vector3> trajectoryPositions = new List <Vector3>(); Vector3 totalDirection = (targetPosition - startPosition).normalized; List <TrajectoryModifier> trajectoryModifiers = competence.GetTrajectoryModifiers; DiscsOrder linkedDiscsTrajectory = DiscsOrder.None; TrajectoryModifierCurved curvedModifier = null; foreach (TrajectoryModifier modifier in trajectoryModifiers) { if (linkedDiscsTrajectory == DiscsOrder.None) { TrajectoryModifierLinkedDiscs linkedDiscModifier = modifier as TrajectoryModifierLinkedDiscs; if (linkedDiscModifier != null) { linkedDiscsTrajectory = linkedDiscModifier.GetLinkedDiscTrajectoryType; } } if (curvedModifier == null) { TrajectoryModifierCurved foundCurvedModifier = modifier as TrajectoryModifierCurved; if (foundCurvedModifier != null) { curvedModifier = foundCurvedModifier; } } } trajectoryPositions.Add(startPosition); #region Discs Link switch (linkedDiscsTrajectory) { case DiscsOrder.FromOldestToNewest: for (int i = 0; i < throwedDiscs.Count; i++) { DiscScript linkDisc = throwedDiscs[i]; if (linkDisc != currentDisc) { if (inRangeDiscs.Contains(linkDisc)) { trajectoryPositions.Add(linkDisc.transform.position); } } } break; case DiscsOrder.FromNewestToOldest: for (int i = throwedDiscs.Count - 1; i >= 0; i--) { DiscScript linkDisc = throwedDiscs[i]; if (linkDisc != currentDisc) { if (inRangeDiscs.Contains(linkDisc)) { trajectoryPositions.Add(linkDisc.transform.position); } } } break; } #endregion #region if (curvedModifier != null) { trajectoryPositions.Add(targetPosition); List <Vector3> curvedTrajectoryPositions = new List <Vector3>(); for (int i = 0; i < trajectoryPositions.Count - 1; i++) { curvedTrajectoryPositions.Add(trajectoryPositions[i]); AddCurvedTrajectoryBetweenTwoPoints(ref curvedTrajectoryPositions, trajectoryPositions[i], trajectoryPositions[i + 1], curvedModifier); } trajectoryPositions = curvedTrajectoryPositions; } #endregion trajectoryPositions.Add(targetPosition); discTrajectoryParameters.trajectoryPositions = trajectoryPositions; return(discTrajectoryParameters); }