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(); }
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); } } } } }
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)); }
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); }
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); } } } }