Есть две трудные проблемы в информатике. Именование вещей, аннулирование кэша и ошибки «один на один».
Это проблема аннулирования кэша.
Если у вас есть запись «is this inside», то всякий раз, когда блок помещается или удаляется, довольно легко обновить его и его область с помощью заливки.
Чтобы оптимизировать это, вы можете захотеть иметь набор уровней «внутренности».
«Ячейка» - это область, окруженная размещенными игроком блоками (до определенного размера).
«Комната» - это клетка с фоновыми плитками.
«Внутри» - комната с дверью, светом и стулом.
Когда вы размещаете размещенный игроком блок переднего плана, делайте обход по часовой стрелке / против часовой стрелки, чтобы увидеть, образовалась ли новая ячейка. Когда вы удалите размещенный игроком блок переднего плана, проверьте, не разбивает ли он какие-либо ячейки - если так, посмотрите, сформирована ли новая ячейка, объединяя их.
Когда новая ячейка сформирована или не сформирована, проверьте, является ли она комнатой или внутренней частью.
Клетки могут отслеживать, сколько фоновых плиток им нужно для помещения. Затем простой подсчет, когда ячейка сформирована, фоновая плитка добавлена или удалена из ячейки, может определить, является ли это комнатой.
Точно так же Клетки могут отслеживать, сколько стульев и источников света (и фактически объектов всех видов) находятся внутри них. Тогда внутренняя проверка тривиальна.
Подсчет входов также может быть сделано.
Таким образом, мы дополняем карту «ячейками». Когда плитки добавляются или удаляются, мы проверяем ячейку местоположения и увеличиваем / уменьшаем количество в ячейке.
Используйте ход по часовой стрелке / против часовой стрелки, чтобы определить внутреннюю и внешнюю часть ячейки при добавлении или удалении блока переднего плана. Поскольку размер ячеек ограничен, эта прогулка займет ограниченное количество шагов.
В качестве бонуса у вас теперь есть дешевый способ говорить о «роскошных» комнатах, или «комната благословлена святым фонтаном», или что-нибудь еще о комнате, так как комнаты имеют количество каждого типа объекта в них. (Или, поскольку комнаты ограничены по размеру, просто сделайте итерацию; это удалит кеш).
Каждое местоположение находится не более чем в одной ячейке, поэтому вы можете хранить идентификатор ячейки каждого местоположения на главной карте.