using Marro.PacManUdon; using UdonSharp; using UnityEngine; using UnityEngine.UIElements; using VRC.SDKBase; using VRC.Udon; public class MazeDefinitionGenerator : UdonSharpBehaviour { public BonusFruit bonusFruit; public PelletManager pelletManager; void Start() { PrintPelletMap(); PrintMazeMap(); } private void PrintPelletMap() { var width = 28; var height = 31; var pellets = pelletManager.gameObject.GetComponentsInChildren(includeInactive: true); int[] map = new int[width * height]; int[] pelletLocations = new int[pellets.Length]; for (int i = 0; i < map.Length; i++) { map[i] = -1; } for (int i = 0; i < pellets.Length; i++) { Pellet pellet = pellets[i]; var position = GridMover.PositionToGrid(new Vector2(pellet.transform.localPosition.x, -pellet.transform.localPosition.y)); var index = (int)position.x + (int)position.y * width; map[index] = i; pelletLocations[i] = index; } WriteBonusFruitTiles(map); PrintMap(map, width); PrintMap(pelletLocations, 16); } private void WriteBonusFruitTiles(int[] map) { var position = bonusFruit.transform.localPosition; var leftTileIndex = PelletManager.GetTilemapIndex(new Vector2(position.x - 0.5f, position.y)); map[leftTileIndex] = (int)PacManConsumableType.FruitLeft; var rightTileIndex = PelletManager.GetTilemapIndex(new Vector2(position.x + 0.5f, position.y)); map[rightTileIndex] = (int)PacManConsumableType.FruitRight; } private void PrintMazeMap() { var width = 28; var height = 31; int[] map = new int[width * height]; var collisionMap = GetCollisionMap(); for (int i = 0; i < map.Length; i++) { if (collisionMap[i]) { map[i] = (int)PacManCollisionType.Wall; continue; } map[i] = GetGhostTurnInformation(collisionMap, i, width, height); } PrintMap(map, width); } private int GetGhostTurnInformation(bool[] collisionMap, int i, int width, int height) { var availableDirections = 0; var totalAvailableDirections = 0; if (!collisionMap[GetTilemapIndex(i, Vector2.up, width, height)]) { availableDirections |= 0b0001; totalAvailableDirections += 1; } if (!collisionMap[GetTilemapIndex(i, Vector2.down, width, height)]) { availableDirections |= 0b0010; totalAvailableDirections += 1; } if (!collisionMap[GetTilemapIndex(i, Vector2.left, width, height)]) { availableDirections |= 0b0100; totalAvailableDirections += 1; } if (!collisionMap[GetTilemapIndex(i, Vector2.right, width, height)]) { availableDirections |= 0b1000; totalAvailableDirections += 1; } if (totalAvailableDirections < 2) { return (int)PacManCollisionType.Empty; } if (availableDirections == 0b0011 || availableDirections == 0b1100) { return (int)PacManCollisionType.Empty; } return availableDirections; } private int GetTilemapIndex(int index, Vector2 direction, int width, int height) { var position = new Vector2(index % width, index / width) + direction; position = Clamp(position, 0, width - 1, 0, height - 1); var result = (int)position.x + (int)position.y * width; return result; } private static Vector2 Clamp(Vector2 vector, float xMin, float xMax, float yMin, float yMax) { if (vector.x < xMin) { vector.x = xMin; } if (vector.x > xMax) { vector.x = xMax; } if (vector.y < yMin) { vector.y = yMin; } if (vector.y > yMax) { vector.y = yMax; } return vector; } private void PrintMap(int[] map, int width) { var result = ""; for (int i = 0; i < map.Length; i++) { if (map[i] < 0) { result += $"{map[i]:00}, "; } else { result += $"{map[i]:000}, "; } if (i % width == width - 1) { result += "\n"; } } Debug.Log(result); } public static bool[] GetCollisionMap() => new bool[] { true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true , true, false, false, false, false, false, false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false, true , true, false, true, true, true, true, false, true, true, true, true, true, false, true, true, false, true, true, true, true, true, false, true, true, true, true, false, true , true, false, true, false, false, true, false, true, false, false, false, true, false, true, true, false, true, false, false, false, true, false, true, false, false, true, false, true , true, false, true, true, true, true, false, true, true, true, true, true, false, true, true, false, true, true, true, true, true, false, true, true, true, true, false, true , true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true , true, false, true, true, true, true, false, true, true, false, true, true, true, true, true, true, true, true, false, true, true, false, true, true, true, true, false, true , true, false, true, true, true, true, false, true, true, false, true, true, true, true, true, true, true, true, false, true, true, false, true, true, true, true, false, true , true, false, false, false, false, false, false, true, true, false, false, false, false, true, true, false, false, false, false, true, true, false, false, false, false, false, false, true , true, true, true, true, true, true, false, true, true, true, true, true, false, true, true, false, true, true, true, true, true, false, true, true, true, true, true, true , false, false, false, false, false, true, false, true, true, true, true, true, false, true, true, false, true, true, true, true, true, false, true, false, false, false, false, false , false, false, false, false, false, true, false, true, true, false, false, false, false, false, false, false, false, false, false, true, true, false, true, false, false, false, false, false , false, false, false, false, false, true, false, true, true, false, true, true, true, true, true, true, true, true, false, true, true, false, true, false, false, false, false, false , true, true, true, true, true, true, false, true, true, false, true, false, false, false, false, false, false, true, false, true, true, false, true, true, true, true, true, true , false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false , true, true, true, true, true, true, false, true, true, false, true, false, false, false, false, false, false, true, false, true, true, false, true, true, true, true, true, true , false, false, false, false, false, true, false, true, true, false, true, true, true, true, true, true, true, true, false, true, true, false, true, false, false, false, false, false , false, false, false, false, false, true, false, true, true, false, false, false, false, false, false, false, false, false, false, true, true, false, true, false, false, false, false, false , false, false, false, false, false, true, false, true, true, false, true, true, true, true, true, true, true, true, false, true, true, false, true, false, false, false, false, false , true, true, true, true, true, true, false, true, true, false, true, true, true, true, true, true, true, true, false, true, true, false, true, true, true, true, true, true , true, false, false, false, false, false, false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false, true , true, false, true, true, true, true, false, true, true, true, true, true, false, true, true, false, true, true, true, true, true, false, true, true, true, true, false, true , true, false, true, true, true, true, false, true, true, true, true, true, false, true, true, false, true, true, true, true, true, false, true, true, true, true, false, true , true, false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, false, false, false, true , true, true, true, false, true, true, false, true, true, false, true, true, true, true, true, true, true, true, false, true, true, false, true, true, false, true, true, true , true, true, true, false, true, true, false, true, true, false, true, true, true, true, true, true, true, true, false, true, true, false, true, true, false, true, true, true , true, false, false, false, false, false, false, true, true, false, false, false, false, true, true, false, false, false, false, true, true, false, false, false, false, false, false, true , true, false, true, true, true, true, true, true, true, true, true, true, false, true, true, false, true, true, true, true, true, true, true, true, true, true, false, true , true, false, true, true, true, true, true, true, true, true, true, true, false, true, true, false, true, true, true, true, true, true, true, true, true, true, false, true , true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true , true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true }; }