Grid/Base/HousePlacer.cs
using System;
using System.Collections.Generic;

namespace Sandbox.Grid.Base
{
    /// <summary>
    /// HousePlacer – vastaa talojen ja huoneiden sijoittelusta gridille.
    /// Sisältää talojen luomisen, huoneiden täyttämisen, sijoituskelpoisuuden tarkistuksen
    /// sekä huoneiden reunojen vaurioittamisen.
    /// </summary>
    internal class HousePlacer
    {
        private readonly char[,] grid;
        private readonly Random rng;
        private readonly int W;
        private readonly int H;
        private readonly List<(int x, int y)> roomCenters;

        public HousePlacer(char[,] grid, Random rng, int w, int h, List<(int x, int y)> roomCenters)
        {
            this.grid = grid;
            this.rng = rng;
            this.W = w;
            this.H = h;
            this.roomCenters = roomCenters;
        }

        /// <summary>
        /// Luo talon, joka koostuu 1–2 huoneesta leveys- ja korkeussuunnassa.
        /// </summary>
        public void CreateHouse(int x, int y, int w, int h)
        {
            int roomsX = rng.Next(1, 3); // 1–2 huonetta leveys
            int roomsY = rng.Next(1, 3); // 1–2 huonetta korkeus

            int roomW = w / roomsX;
            int roomH = h / roomsY;

            for (int ry = 0; ry < roomsY; ry++)
            {
                for (int rx = 0; rx < roomsX; rx++)
                {
                    CreateRoom(
                        x + rx * roomW,
                        y + ry * roomH,
                        roomW,
                        roomH
                    );
                }
            }
        }

        /// <summary>
        /// Luo yksittäisen huoneen (täyttää alueen sisä lattialla ',' ).
        /// </summary>
        public void CreateRoom(int x, int y, int w, int h)
        {
            for (int iy = y; iy < y + h; iy++)
                for (int ix = x; ix < x + w; ix++)
                    grid[ix, iy] = ','; // huoneen sisälattia
        }

        /// <summary>
        /// Tarkistaa, voiko huoneen sijoittaa annettuun kohtaan (alueen täytyy olla tyhjä).
        /// </summary>
        public bool CanPlaceRoom(int x, int y, int w, int h)
        {
            for (int iy = y - 1; iy < y + h + 1; iy++)
                for (int ix = x - 1; ix < x + w + 1; ix++)
                    if (grid[ix, iy] != ' ')
                        return false;

            return true;
        }

        /// <summary>
        /// Luo satunnaisesti huoneita gridille (ei käytössä pääluokassa, säilytetään).
        /// </summary>
        public void CreateRooms()
        {
            int attempts = 0;
            int rooms = 0;

            while (rooms < 8 && attempts < 50)
            {
                attempts++;

                int w = rng.Next(6, 16);
                int h = rng.Next(6, 16);
                int x = rng.Next(2, W - w - 2);
                int y = rng.Next(2, H - h - 2);

                if (!CanPlaceRoom(x, y, w, h))
                    continue;

                CreateRoom(x, y, w, h);

                // 👇 TÄSSÄ KOHTAA
                DamageRoomEdges(x, y, w, h);
                roomCenters.Add((x + w / 2, y + h / 2));
                rooms++;
            }
        }

        /// <summary>
        /// Vaurioittaa huoneen reunoja satunnaisilla seinäpalasilla.
        /// </summary>
        public void DamageRoomEdges(int x, int y, int w, int h)
        {
            for (int i = 0; i < 10; i++)
            {
                int rx = rng.Next(x + 1, x + w - 1);
                int ry = rng.Next(y + 1, y + h - 1);

                if (rng.NextDouble() < 0.3)
                    grid[rx, ry] = '#';
            }
        }
    }
}