public static void CreateCircuit(IntentionGrid grid, Random random) { var groundLevels = grid.GetByMeaning(Meaning.GroundLevel).Select(x => x.Y).Distinct().ToArray(); var verticals = new int[2]; verticals[0] = (int)Math.Floor(grid.Width / 4.0f); verticals[1] = (int)Math.Floor(3.0f * grid.Width / 4.0f); for (var x = 0; x < grid.Width; x++) { for (var y = 0; y < grid.Height; y++) { if ( !( y >= groundLevels.Min() && y <= groundLevels.Max() && x >= verticals[0] && x <= verticals[1] ) ) { continue; } if ( (y == groundLevels.Min() || y == groundLevels.Max()) || (x == verticals[0] || x == verticals[1]) ) { grid.Positions[x, y].Intentions.Add(Intention.CircuitIntention()); } if (x == verticals[0] || x == verticals[1]) { grid.Positions[x, y].Intentions.Add(Intention.LadderIntention()); } } } //Debug DebugPrintMeaning(grid, Meaning.Circuit); }
public static void CreateCircuitFractured(IntentionGrid grid, Random random) { var groundLevels = grid.GetByMeaning(Meaning.GroundLevel).Select(x => x.Y).Distinct().ToArray(); var verticals = new int[2]; verticals[0] = (int)Math.Floor(grid.Width / 4.0f); verticals[1] = (int)Math.Floor(3.0f * grid.Width / 4.0f); var numberOfShiftedLevels = 1;//random.Next(0, groundLevels.Count()); List <int> shiftedLevels = new List <int>(); List <int> shiftedAmount = new List <int>(); for (var i = 0; i < numberOfShiftedLevels; i++) { var shiftLevel = groundLevels.Where(gl => !shiftedLevels.Any(sl => sl == gl)).GetRandomOrDefault(random); shiftedLevels.Add(shiftLevel); shiftedAmount.Add((new List <int>() { 1, -1 }).GetRandomOrDefault(random)); } bool onNormalCircuit = false; bool onFracturedVertical = false; bool[,] bufferGrid = new bool[grid.Width, grid.Height]; for (var x = 0; x < grid.Width; x++) { for (var y = 0; y < grid.Height; y++) { if ( !( y >= groundLevels.Min() && y <= groundLevels.Max() && x >= verticals[0] && x <= verticals[1] ) ) { continue; } if ( (y == groundLevels.Min() || y == groundLevels.Max()) || (x == verticals[0] || x == verticals[1]) ) { bufferGrid[x, y] = true; } if (x == verticals[0] || x == verticals[1]) { bufferGrid[x, y] = true; } } } //shift for (var y = 0; y < grid.Height; y++) { var index = shiftedLevels.IndexOf(y); if (index == -1 && groundLevels.ToList().IndexOf(y) == -1) { index = shiftedLevels.IndexOf(y + 1); } if (index == -1) { continue; } var xStart = (int)Math.Round((Math.Sign(shiftedAmount[index]) / 2.0) + 0.5) * (bufferGrid.GetLength(0) - 1); var xDir = Math.Sign(shiftedAmount[index]) * -1; var xStop = grid.Width; if (Math.Sign(shiftedAmount[index]) == 1) { xStop = -1; } for (var x = xStart; x != xStop; x += xDir) { bool readValues = false; int readFrom = x - shiftedAmount[index]; if (readFrom >= 0 && readFrom < grid.Width) { readValues = bufferGrid[readFrom, y]; } bufferGrid[x, y] = readValues; } } ////debug //Console.WriteLine("shift debug"); //for (var y = 0; y < grid.Height; y++) //{ // var str = ""; // for (var x = 0; x < grid.Width; x++) // { // if (bufferGrid[x, y]) // str += "X"; // else // str += "-"; // } // Console.WriteLine(str); //} //Console.WriteLine(); //corners for (var y = 0; y < groundLevels.Max() - 1; y++) { for (var x = 0; x < grid.Width; x++) { if ( bufferGrid[x, y] == false && ( (x >= 1 && bufferGrid[x - 1, y]) || (x < grid.Width - 1 && bufferGrid[x + 1, y]) ) && ( y < grid.Height - 1 && bufferGrid[x, y + 1] ) ) { bufferGrid[x, y] = true; } } } for (var y = 0; y < grid.Height; y++) { for (var x = 0; x < grid.Width; x++) { if (!bufferGrid[x, y]) { continue; } bool isLadder = false; if ( ( y > 0 && bufferGrid[x, y - 1] ) || ( y < grid.Height - 1 && bufferGrid[x, y + 1] ) ) { isLadder = true; } if (isLadder) { grid.Positions[x, y].Intentions.Add(Intention.LadderIntention()); } grid.Positions[x, y].Intentions.Add(Intention.CircuitIntention()); } } //Debug DebugPrintMeaning(grid, Meaning.Circuit); DebugPrintMeaning(grid, Meaning.Ladder); }