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] = '#';
}
}
}
}