Exemplo n.º 1
0
 public void mapMovement(int x, int y, int movement, UnitSpec.UnitMove movementType)
 {
     clear();
     cost [x, y] = -2;
     if (originx < 0)
     {
         originx = x;
         originy = y;
     }
     dijkstraTest(x, y + 1, movement, 0, OriginDirection.S, movementType, true);
     dijkstraTest(x, y - 1, movement, 0, OriginDirection.N, movementType, true);
     dijkstraTest(x + 1, y, movement, 0, OriginDirection.W, movementType, true);
     dijkstraTest(x - 1, y, movement, 0, OriginDirection.E, movementType, true);
     showHighlights();
 }
Exemplo n.º 2
0
    private void dijkstraTest(int x, int y, int debt, OriginDirection d, bool firstmove)
    {
        int movement = unit.getMovement();

        UnitSpec.UnitMove movementType = unit.getMovementType();
        if (x >= 0 && x < this.sizex && y >= 0 && y < this.sizey && // within boundaries
            cost[x, y] >= 0 &&                                      // permission to map
            (x != originx || y != originy)                          // Not unit origin
            )
        {
            TileSelect tile = PlayMap.Grid.getTileSpec(x, y);
            if (tile.HighLightColorType != TileSelect.HighlightType.EnemyRTargetable &&             //Ignore if there is a ranged marker
                ((UnitControl)PlayMap.GridController).HasSeenEnemyUnit(x, y, unit.playerFactionSpec))
            {
                if (UnitControlBattle.canTarget(unit, ((UnitControl)PlayMap.GridController).getUnitData(x, y), 1))
                {
                    tile.HighLightColorType = TileSelect.HighlightType.EnemyTargetable;
                }
                else
                {
                    tile.HighLightColorType = TileSelect.HighlightType.Enemy;
                }
                highlightedTiles.Add(tile);
            }
            else
            {
                int newcost = getMovementCost(movementType, tile.FloorType, unit.UnitBodySpec.isAmphibious());
                if (newcost != 0)
                {
                    newcost += debt;
                    if ((newcost < cost[x, y] || cost[x, y] <= 0) && (firstmove || newcost <= movement))
                    {
                        cost[x, y]      = newcost;
                        direction[x, y] = d;
                        //tile.HighLightColorType = TileSelect.HighlightType.Movement;
                        highlightedTiles.Add(tile);
                        dijkstraTest(x, y + 1, newcost, OriginDirection.S, false);
                        dijkstraTest(x, y - 1, newcost, OriginDirection.N, false);
                        dijkstraTest(x + 1, y, newcost, OriginDirection.W, false);
                        dijkstraTest(x - 1, y, newcost, OriginDirection.E, false);
                    }
                }
            }
        }
    }
Exemplo n.º 3
0
    private static int getMovementCost(UnitSpec.UnitMove unitMovementType, TileSelect.TileMovementType tileLandType, bool isAmphibious)
    {
        if (isAmphibious &&
            unitMovementType != UnitSpec.UnitMove.Dive &&
            unitMovementType != UnitSpec.UnitMove.Float &&
            unitMovementType != UnitSpec.UnitMove.Fly &&
            unitMovementType != UnitSpec.UnitMove.Heli &&
            unitMovementType != UnitSpec.UnitMove.Sail)
        {
            switch (tileLandType)
            {
            case TileSelect.TileMovementType.DeepWater:
                return(5);

            case TileSelect.TileMovementType.ShallowWater:
                return(5);

            default:
                return(getMovementCost(unitMovementType, tileLandType));
            }
        }
        return(getMovementCost(unitMovementType, tileLandType));
    }
Exemplo n.º 4
0
    private static int getMovementCost(UnitSpec.UnitMove unitMovementType, TileSelect.TileMovementType tileLandType)
    {
        switch (unitMovementType)
        {
        case UnitSpec.UnitMove.Fly:
            return(2);

        case UnitSpec.UnitMove.Heli:
            return(2);

        case UnitSpec.UnitMove.Dive:
            switch (tileLandType)
            {
            case TileSelect.TileMovementType.DeepWater:
                return(3);
            }
            break;

        case UnitSpec.UnitMove.Float:
            switch (tileLandType)
            {
            case TileSelect.TileMovementType.Normal:
                return(2);

            case TileSelect.TileMovementType.Sand:
                return(2);

            case TileSelect.TileMovementType.Concrete:
                return(2);

            case TileSelect.TileMovementType.Hill:
                return(3);

            case TileSelect.TileMovementType.Obstructed:
                return(5);

            case TileSelect.TileMovementType.Mountain:
                return(5);

            case TileSelect.TileMovementType.DeepWater:
                return(3);

            case TileSelect.TileMovementType.ShallowWater:
                return(3);
            }
            break;

        case UnitSpec.UnitMove.Sail:
            switch (tileLandType)
            {
            case TileSelect.TileMovementType.DeepWater:
                return(2);

            case TileSelect.TileMovementType.ShallowWater:
                return(3);
            }
            break;

        case UnitSpec.UnitMove.Thread:
            switch (tileLandType)
            {
            case TileSelect.TileMovementType.Normal:
                return(3);

            case TileSelect.TileMovementType.Sand:
                return(3);

            case TileSelect.TileMovementType.Concrete:
                return(2);

            case TileSelect.TileMovementType.Hill:
                return(10);

            case TileSelect.TileMovementType.Obstructed:
                return(6);
            }
            break;

        case UnitSpec.UnitMove.Walk:
            switch (tileLandType)
            {
            case TileSelect.TileMovementType.Normal:
                return(3);

            case TileSelect.TileMovementType.Sand:
                return(5);

            case TileSelect.TileMovementType.Concrete:
                return(2);

            case TileSelect.TileMovementType.Hill:
                return(4);

            case TileSelect.TileMovementType.Obstructed:
                return(4);

            case TileSelect.TileMovementType.Mountain:
                return(10);

            case TileSelect.TileMovementType.ShallowWater:
                return(5);
            }
            break;

        case UnitSpec.UnitMove.Wheel:
            switch (tileLandType)
            {
            case TileSelect.TileMovementType.Normal:
                return(3);

            case TileSelect.TileMovementType.Sand:
                return(4);

            case TileSelect.TileMovementType.Concrete:
                return(1);

            case TileSelect.TileMovementType.Hill:
                return(10);

            case TileSelect.TileMovementType.Obstructed:
                return(8);
            }
            break;
        }


        return(0);
    }
Exemplo n.º 5
0
 private void dijkstraTest(int x, int y, int movement, int debt, OriginDirection d, UnitSpec.UnitMove movementType, bool force)
 {
     if (x >= 0 && x < this.sizex && y >= 0 && y < this.sizey && cost[x, y] != -2)
     {
         TileSelect tile    = TilesSpec.getTileSpec(x, y);
         int        newcost = getMovementCost(movementType, tile.FloorType);
         if (newcost != 0)
         {
             newcost += debt;
             if ((newcost < cost[x, y] || cost[x, y] <= 0) && (force || newcost <= movement))
             {
                 cost[x, y]      = newcost;
                 direction[x, y] = d;
                 highlightedTiles.Add(tile);
                 dijkstraTest(x, y + 1, movement, newcost, OriginDirection.S, movementType, false);
                 dijkstraTest(x, y - 1, movement, newcost, OriginDirection.N, movementType, false);
                 dijkstraTest(x + 1, y, movement, newcost, OriginDirection.W, movementType, false);
                 dijkstraTest(x - 1, y, movement, newcost, OriginDirection.E, movementType, false);
             }
         }
     }
 }