private static TileCoords GetNewTileWhenLeavingPentagon(TileCoords currentPenta, TileCoords currentFacing, HexDirection hexDirection, PentagonTraversalStrategy strategy) { PentaDirection pentaDirection = PentaDirection.Forward;//default if (strategy == PentagonTraversalStrategy.LeanLeft) { switch (hexDirection) { case HexDirection.Forward: pentaDirection = PentaDirection.Forward; break; case HexDirection.ForwardRight: pentaDirection = PentaDirection.ForwardRight; break; case HexDirection.BackwardRight: pentaDirection = PentaDirection.BackwardRight; break; case HexDirection.Backward: case HexDirection.BackwardLeft: pentaDirection = PentaDirection.BackwardLeft; break; case HexDirection.ForwardLeft: pentaDirection = PentaDirection.ForwardLeft; break; } } else { pentaDirection = PentaDirection.Forward; } return(HexMapHelper.GetTileInPentaDirection(currentPenta, currentFacing, pentaDirection)); }
public static TileWithFacing Traverse(this TileWithFacing startVec, HexDirection direction, int steps = 1, PentagonTraversalStrategy strategy = PentagonTraversalStrategy.LeanLeft) { TileCoords currentTile = startVec.position; TileCoords currentFacing = startVec.facing; for (int step = 0; step < steps; step++) { TileCoords newTile; if (HexMapHelper.GetTileShape(currentTile) == TileShape.Hexagon) { newTile = HexMapHelper.GetTileInHexDirection(currentTile, currentFacing, direction); } else { //We're stepping out of a Pentagon using HexDirection. What do we do? newTile = GetNewTileWhenLeavingPentagon(currentTile, currentFacing, direction, strategy); } direction = HexDirection.Forward; if (HexMapHelper.GetTileShape(newTile) == TileShape.Hexagon) { currentFacing = HexMapHelper.GetTileInHexDirection(newTile, currentTile, HexDirection.Backward); } else { //We're stepping into a Pentagon with Hex Directions. What do we do? currentFacing = GetFacingWhenEnteringPentagon(currentTile, newTile, strategy); } currentTile = newTile; } return(new TileWithFacing() { position = currentTile, facing = currentFacing }); }
private static TileCoords GetFacingWhenEnteringPentagon(TileCoords currentHex, TileCoords newPenta, PentagonTraversalStrategy strategy) { if (strategy == PentagonTraversalStrategy.LeanLeft) { return(HexMapHelper.GetTileInPentaDirection(newPenta, currentHex, PentaDirection.BackwardRight)); } else { return(currentHex); //Face backwards as default } }