Esempio n. 1
0
    IEnumerator TravelPath()
    {
        Vector3 lookTowards = new Vector3(0, 0, 0);

        if (!currentTravelLocation)
        {
            currentTravelLocation = pathToTravel[0];
        }
        int currentColumn = currentTravelLocation.ColumnIndex;
        int nextColumn;

        if (Location.IsVisible == true || HexVision.HasVision)
        {
            Vector3 a, b, c = pathToTravel[0].Position;
            yield return(LookAt(pathToTravel[1].Position));

            animator.SetBool("Walking", true);

            HexVision.ClearCells();


            float t = Time.deltaTime * travelSpeed;
            for (int i = 1; i < pathToTravel.Count; i++)
            {
                currentTravelLocation = pathToTravel[i];
                a = c;
                b = pathToTravel[i - 1].Position;

                nextColumn = currentTravelLocation.ColumnIndex;
                if (currentColumn != nextColumn)
                {
                    if (nextColumn < currentColumn - 1)
                    {
                        a.x -= HexMetrics.innerDiameter * HexMetrics.wrapSize;
                        b.x -= HexMetrics.innerDiameter * HexMetrics.wrapSize;
                    }
                    else if (nextColumn > currentColumn + 1)
                    {
                        a.x += HexMetrics.innerDiameter * HexMetrics.wrapSize;
                        b.x += HexMetrics.innerDiameter * HexMetrics.wrapSize;
                    }
                    Grid.MakeChildOfColumn(transform, nextColumn);
                    currentColumn = nextColumn;
                }

                c = (b + currentTravelLocation.Position) * 0.5f;

                //if(pathToTravel[i].IsVisible)
                //{
                //    EnableMesh(true);
                //}
                //else
                //{
                //    EnableMesh(false);
                //}
                HexVision.AddCells(Grid.GetVisibleCells(pathToTravel[i], VisionRange));
                if (currentTravelLocation.IsVisible == true)
                {
                    for (; t < 1f; t += Time.deltaTime * travelSpeed)
                    {
                        transform.localPosition = Bezier.GetPoint(a, b, c, t);
                        Vector3 d = Bezier.GetDerivative(a, b, c, t);
                        d.y = 0f;
                        transform.localRotation = Quaternion.LookRotation(d);
                        yield return(null);
                    }

                    t -= 1f;
                }
                HexVision.ClearCells();
            }
            a = c;
            b = Location.Position;
            c = b;

            HexVision.AddCells(Grid.GetVisibleCells(location, VisionRange));

            //if (location.IsVisible)
            //{
            //    EnableMesh(true);
            //}


            if (unit.IsSomethingToAttack())
            {
                if (unit.AttackCity)
                {
                    City city = unit.AttackCity;
                    lookTowards = city.GetHexCell().Position;
                    float attackTime = 0;
                    animator.SetBool("Attacking", true);
                    for (; attackTime < fightSpeed; attackTime += Time.deltaTime)
                    {
                        yield return(null);
                    }
                    animator.SetBool("Attacking", false);

                    if (city.HitPoints <= 0)
                    {
                        city.GetCityState().KillLocalUnits(city);
                        city.SetCityState(GetComponent <Unit>().CityState);
                    }
                    city.UpdateUI();
                }
                else if (unit.AttackUnit)
                {
                    HexUnit unitToFight = unit.AttackUnit;
                    lookTowards = unitToFight.Location.Position;
                    yield return(unitToFight.LookAt(location.Position));

                    if (unitToFight)
                    {
                        float attackTime = 0;
                        animator.SetBool("Attacking", true);
                        unitToFight.animator.SetBool("Attacking", true);
                        for (; attackTime < fightSpeed; attackTime += Time.deltaTime)
                        {
                            yield return(null);
                        }
                        animator.SetBool("Attacking", false);
                        unitToFight.animator.SetBool("Attacking", false);
                        Unit unitToFightUnitComp = unitToFight.GetComponent <Unit>();
                        unitToFightUnitComp.ShowHealthChange(unitToFightUnitComp.GetLastHitPointChange());
                        unitToFightUnitComp.UpdateUI();
                        if (unitToFightUnitComp.HitPoints <= 0)
                        {
                            unitToFight.DieAnimationAndRemove();
                        }
                    }
                }
                Unit unitComp = GetComponent <Unit>();
                unitComp.ShowHealthChange(unitComp.GetLastHitPointChange());
                unitComp.UpdateUI();
                if (unitComp.HitPoints <= 0)
                {
                    DieAnimationAndRemove();
                }



                nextColumn = Location.ColumnIndex;

                if (currentColumn != nextColumn)
                {
                    if (nextColumn < currentColumn - 1)
                    {
                        a.x -= HexMetrics.innerDiameter * HexMetrics.wrapSize;
                    }
                    else if (nextColumn > currentColumn + 1)
                    {
                        a.x += HexMetrics.innerDiameter * HexMetrics.wrapSize;
                    }
                    Grid.MakeChildOfColumn(transform, nextColumn);
                    currentColumn = nextColumn;
                }
            }



            currentTravelLocation = null;

            for (; t < 1f; t += Time.deltaTime * (travelSpeed * 2))
            {
                transform.localPosition = Bezier.GetPoint(a, b, c, t);
                Vector3 d = Bezier.GetDerivative(a, b, c, t);
                d.y = 0f;
                transform.localRotation = Quaternion.LookRotation(d);
                yield return(null);
            }
        }
        else
        {
            currentTravelLocation = null;
            nextColumn            = Location.ColumnIndex;
            if (currentColumn != nextColumn)
            {
                Grid.MakeChildOfColumn(transform, nextColumn);
                currentColumn = nextColumn;
            }
        }

        transform.localPosition = location.Position;
        location.UpdateVision();
        orientation = transform.localRotation.eulerAngles.y;
        if (unit.IsSomethingToAttack())
        {
            yield return(LookAt(lookTowards));
        }
        ListPool <HexCell> .Add(pathToTravel);

        pathToTravel = null;
        animator.SetBool("Walking", false);
    }