protected Hexigon.Layout ChooseLegalLayout(int hash, Vector3 worldPosition) { Hexigon.Layout target = layoutRequirements[hash]; List <Hexigon.Layout> layouts = target.FindMatchingLayouts(); for (int i = 0; i < layouts.Count; i++) { Hexigon.Layout layout = layouts[i]; foreach (Hexigon.ConnectorType connection in layout.connections) { if (connection == Hexigon.ConnectorType.OUTPUT) { int h = PositionToHash(worldPosition, (int)connection); if (layoutRequirements.ContainsKey(h)) { if (!layoutRequirements[h].isFringe) { layouts.RemoveAt(i); break; } } } } } return(layouts[Random.Range(0, layouts.Count)]); }
protected Hexigon ApplyLayoutConstraints(Hexigon hexigon) { hexigon.layout.isFringe = false; layoutRequirements[hexigon.Hash] = hexigon.layout; // Surrounding tiles need rules for (int i = 0; i < hexigon.layout.connections.Length; i++) { Hexigon.ConnectorType connectionType = hexigon.layout.connections[i]; if (!CheckLegalOutput(i, connectionType)) { continue; } Vector3 worldPosition = GenerateHexigonWorldPosition(hexigon, i); int hash = PositionToHash(worldPosition); if (!layoutRequirements.ContainsKey(hash)) { layoutRequirements[hash] = new Hexigon.Layout(-1, new[] { 0, 0, 0, 0, 0, 0 }); } Hexigon.Layout result = layoutRequirements[hash]; if (result.isFringe) { result.AddConnection((i + 3) % 6, Hexigon.ConnectorType.INPUT); layoutRequirements[hash] = result; } Debug.DrawLine(hexigon.WorldPosition, worldPosition, Color.red, 100); Debug.DrawRay(worldPosition, Vector3.up, Color.green, 100); Debug.DrawRay(worldPosition, Vector3.up * 50, Color.white, 5); } return(hexigon); }