Пример #1
0
        public Vector2 Interpolate(float t)
        {
            if (character == null)
            {
                return(Vector2.zero);
            }

            switch (moveType)
            {
            case MoveType.Cross:
                character.transform.position = MoveTypeMath.EvaluateLine(fromMark.transform.position, toMark.transform.position, t);
                break;

            case MoveType.DoSiDo:
                character.transform.position = MoveTypeMath.EvaluateCircle(fromMark.transform.position, toMark.transform.position, circleCenter.position, t, true);
                break;

            case MoveType.Shift:
                character.transform.position = MoveTypeMath.EvaluateCircle(fromMark.transform.position, toMark.transform.position, circleCenter.position, t, false);
                break;
            }

            return(character.transform.position);
        }
Пример #2
0
    private void UpdateMoveState()
    {
        HandleRound();

        MoveType  type      = MoveType.None;
        Direction direction = Direction.Clockwise;

        var startIndex = GetIndexOfCharacter(mainCharacter);
        var endIndex   = highlightedIndex;

        var a = startIndex >= 0 && startIndex < characterMarks.Count ? characterMarks[startIndex] : null;
        var b = endIndex >= 0 && endIndex < characterMarks.Count ? characterMarks[endIndex] : null;

        if (a != null && b != null)
        {
            var difference = GetIndexDifference(startIndex, endIndex);
            var absDiff    = Mathf.Abs(difference);
            Debug.Log(string.Format("Difference: {0}, {1} = {2}", startIndex, endIndex, difference));

            if (absDiff == 1)
            {
                type      = MoveType.Shift;
                direction = difference > 0 ? Direction.Clockwise : Direction.CounterClockwise;

                if (a != null && b != null)
                {
                    SetIncantationPreview(t => MoveTypeMath.EvaluateCircle(a.transform.position, b.transform.position, circleCenter.position, t, false));
                }
            }
            else if (absDiff == characterMarks.Count / 2)
            {
                type = MoveType.Cross;

                if (a != null && b != null)
                {
                    SetIncantationPreview(t => MoveTypeMath.EvaluateLine(a.transform.position, b.transform.position, t));
                }
            }
            else if (absDiff > 1)
            {
                type = MoveType.DoSiDo;

                if (a != null && b != null)
                {
                    SetIncantationPreview(t => MoveTypeMath.EvaluateCircle(a.transform.position, b.transform.position, circleCenter.position, t, true));
                }
            }
            else
            {
                ClearIncantationPreview();
            }
        }
        else
        {
            ClearIncantationPreview();
        }

        if (Input.GetButton("Cross"))
        {
            switch (type)
            {
            case MoveType.Shift:
                RunEvent(DoRotate(direction));
                break;

            case MoveType.DoSiDo:
                RunEvent(DoSwap(a, b, true));
                break;

            case MoveType.Cross:
                RunEvent(DoSwap(a, b, false));
                break;
            }

            if (type != MoveType.None)
            {
                roundTurns--;
            }
        }
        else if (Input.GetButton("Incant"))
        {
            RunEvent(DoIncant(endIndex));
        }
    }