package ru.dbotthepony.kstarbound.world import ru.dbotthepony.kstarbound.world.api.BackgroundView import ru.dbotthepony.kstarbound.world.api.CHUNK_SIZE import ru.dbotthepony.kstarbound.world.api.CHUNK_SIZE_FF import ru.dbotthepony.kstarbound.world.api.ForegroundView import ru.dbotthepony.kstarbound.world.api.IChunk import ru.dbotthepony.kstarbound.world.api.IChunkCell /** * Предоставляет доступ к чанку и его соседям * * В основном для использования в местах, где нужен не мир, а определённый чанк мира, * и при этом координаты проверяются относительно чанка и могут спокойно выйти за его пределы, * с желанием получить тайл из соседнего чанка */ class CellView( override val pos: ChunkPos, val center: IChunk?, val right: IChunk?, val top: IChunk?, val topRight: IChunk?, val topLeft: IChunk?, val left: IChunk?, val bottom: IChunk?, val bottomLeft: IChunk?, val bottomRight: IChunk?, ) : IChunk { val backgroundView = BackgroundView(this) val foregroundView = ForegroundView(this) override fun getCell(x: Int, y: Int): IChunkCell { if (x in 0 ..CHUNK_SIZE_FF) { if (y in 0 ..CHUNK_SIZE_FF) { return center?.getCell(x, y) ?: IChunkCell.Companion } if (y < 0) { return bottom?.getCell(x, y + CHUNK_SIZE) ?: IChunkCell.Companion } else { return top?.getCell(x, y - CHUNK_SIZE) ?: IChunkCell.Companion } } if (x < 0) { if (y in 0 ..CHUNK_SIZE_FF) { return left?.getCell(x + CHUNK_SIZE, y) ?: IChunkCell.Companion } if (y < 0) { return bottomLeft?.getCell(x + CHUNK_SIZE, y + CHUNK_SIZE) ?: IChunkCell.Companion } else { return topLeft?.getCell(x + CHUNK_SIZE, y - CHUNK_SIZE) ?: IChunkCell.Companion } } else { if (y in 0 ..CHUNK_SIZE_FF) { return right?.getCell(x - CHUNK_SIZE, y) ?: IChunkCell.Companion } if (y < 0) { return bottomRight?.getCell(x - CHUNK_SIZE, y + CHUNK_SIZE) ?: IChunkCell.Companion } else { return topRight?.getCell(x - CHUNK_SIZE, y - CHUNK_SIZE) ?: IChunkCell.Companion } } } }