Lines 100.00% 18 / 18
Methods 100.00% 4 / 4
Classes 100.00% 1 / 1
Name Lines Methods CRAP
 __construct 100.00% 1 / 1 100.00% 1 / 1 1
 placed 100.00% 1 / 1 100.00% 1 / 1 1
 described 100.00% 1 / 1 100.00% 1 / 1 1
 cells 100.00% 15 / 15 100.00% 1 / 1 5
10final readonly class MapLayout
11{
12    /**
13     * @param list<MonsterPlacement> $placements
14     * @param list<MapMonster> $monsters
15     */
16    public function __construct(
17        private array $placements = [],
18        private array $monsters = [],
19    ) {}
20
21    /** @param list<MonsterPlacement> $placements */
22    public function placed(array $placements): self
23    {
24        return new self($placements, $this->monsters);
25    }
26
27    /** @param list<MapMonster> $monsters */
28    public function described(array $monsters): self
29    {
30        return new self($this->placements, $monsters);
31    }
32
33    /** @return list<MapCell> */
34    public function cells(): array
35    {
36        $monsters = [];
37        foreach ($this->monsters as $monster) {
38            $monsters[$monster->id->value] = $monster;
39        }
40
41        $cells = [];
42        $spawns = [];
43        foreach ($this->placements as $placement) {
44            $monster = $monsters[$placement->monster->value] ?? null;
45            if ($monster === null) {
46                continue;
47            }
48
49            $cells[$placement->cell->value] ??= $placement->cell;
50            $spawns[$placement->cell->value][] = new Spawn($placement->id, $monster);
51        }
52
53        $layout = [];
54        foreach ($cells as $name => $cell) {
55            $layout[] = new MapCell($cell, $spawns[$name] ?? []);
56        }
57
58        return $layout;
59    }
60}