コード例 #1
0
    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);
    }
コード例 #2
0
    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);
    }
コード例 #3
0
    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);
    }