|
| 1 | +package me.owdding.mortem.core.catacombs |
| 2 | + |
| 3 | +import me.owdding.ktcodecs.FieldName |
| 4 | +import me.owdding.ktcodecs.GenerateCodec |
| 5 | +import me.owdding.mortem.core.Instance |
| 6 | +import me.owdding.mortem.core.InstanceType |
| 7 | +import me.owdding.mortem.core.catacombs.nodes.CatacombNodeType |
| 8 | +import me.owdding.mortem.core.catacombs.nodes.CatacombsNode |
| 9 | +import me.owdding.mortem.utils.Utils |
| 10 | +import me.owdding.mortem.utils.Utils.unsafeCast |
| 11 | +import net.minecraft.core.Direction |
| 12 | +import org.joml.Vector2i |
| 13 | +import org.joml.minus |
| 14 | +import org.joml.plus |
| 15 | +import tech.thatgravyboat.skyblockapi.api.area.dungeon.DungeonFloor |
| 16 | +import tech.thatgravyboat.skyblockapi.utils.extentions.filterValuesNotNull |
| 17 | +import java.util.concurrent.ConcurrentHashMap |
| 18 | + |
| 19 | +data class Catacomb( |
| 20 | + val floor: DungeonFloor, |
| 21 | +) : Instance { |
| 22 | + var size: CatacombSize = CatacombSize.forFloor(floor) |
| 23 | + |
| 24 | + var mapTopLeft: Vector2i? = null |
| 25 | + var mapRoomSize: Int = 0 |
| 26 | + set(value) { |
| 27 | + mapRoomAndDoorSize = value + DOOR_WIDTH |
| 28 | + field = value |
| 29 | + } |
| 30 | + var mapRoomAndDoorSize: Int = 0 |
| 31 | + |
| 32 | + val grid: MutableMap<Vector2i, CatacombsNode<*>> = ConcurrentHashMap() |
| 33 | + |
| 34 | + fun <T : CatacombsNode<T>> getOrCreateNode(position: Vector2i, type: CatacombNodeType<T>) : T = grid.getOrPut(position, type.constructor).unsafeCast() |
| 35 | + |
| 36 | + inline fun <reified T : CatacombsNode<T>> getNeighbours(position: Vector2i): Map<Vector2i, T> = buildList { |
| 37 | + add(position + Utils.vectorOneZero) |
| 38 | + add(position + Utils.vectorZeroOne) |
| 39 | + add(position - Utils.vectorOneZero) |
| 40 | + add(position - Utils.vectorZeroOne) |
| 41 | + }.associateWith { grid[it] as? T }.filterValuesNotNull() |
| 42 | + |
| 43 | + override val instance: InstanceType get() = InstanceType.CATACOMBS |
| 44 | +} |
| 45 | + |
| 46 | +fun interface CatacombsColorProvider { |
| 47 | + fun getColor(): Int |
| 48 | +} |
| 49 | + |
| 50 | +enum class CatacombRoomType(val provider: CatacombsColorProvider) : CatacombsColorProvider by provider { |
| 51 | + NORMAL({ 0xAb6b00 }), |
| 52 | + TRAP({ 0xFF7F0F }), |
| 53 | + FAIRY({ 0xF080FF }), |
| 54 | + PUZZLE({ 0xe050F0 }), |
| 55 | + MINIBOSS({ 0xFFFF00 }), |
| 56 | + BLOOD({ 0xFF0000 }), |
| 57 | + START({ 0x00FF00 }), |
| 58 | + UNKNOWN({ 0xababab }), |
| 59 | + DEFAULT({ 0x000000 }), |
| 60 | + ; |
| 61 | + |
| 62 | + companion object { |
| 63 | + fun getByColor(color: CatacombMapColor): CatacombRoomType? = when (color) { |
| 64 | + CatacombMapColor.COMPLETE -> START |
| 65 | + CatacombMapColor.UNKNOWN -> UNKNOWN |
| 66 | + CatacombMapColor.FAILED -> BLOOD |
| 67 | + CatacombMapColor.PUZZLE -> PUZZLE |
| 68 | + CatacombMapColor.TRAP -> TRAP |
| 69 | + CatacombMapColor.MINIBOSS -> MINIBOSS |
| 70 | + CatacombMapColor.FAIRY -> FAIRY |
| 71 | + CatacombMapColor.NORMAL -> NORMAL |
| 72 | + else -> null |
| 73 | + } |
| 74 | + } |
| 75 | + |
| 76 | +} |
| 77 | + |
| 78 | +enum class CatacombDoorType(val provider: CatacombsColorProvider) : CatacombsColorProvider by provider { |
| 79 | + WITHER({ 0x4f4f4f }), |
| 80 | + BLOOD({ 0xFF0000 }), |
| 81 | + NORMAL({ 0xab6b00 }), |
| 82 | + TRAP({ 0xff7f0f }), |
| 83 | + MINIBOSS({ 0xFFFF00 }), |
| 84 | + PUZZLE({ 0xe060f0 }), |
| 85 | + FAIRY({ 0xf080ff }), |
| 86 | + DEFAULT({ 0x000000 }), |
| 87 | +; |
| 88 | + |
| 89 | + companion object { |
| 90 | + fun getByColor(color: CatacombMapColor): CatacombDoorType? = when (color) { |
| 91 | + CatacombMapColor.FAILED -> BLOOD |
| 92 | + CatacombMapColor.NORMAL -> NORMAL |
| 93 | + CatacombMapColor.WITHER -> WITHER |
| 94 | + CatacombMapColor.FAIRY -> FAIRY |
| 95 | + CatacombMapColor.PUZZLE -> PUZZLE |
| 96 | + CatacombMapColor.TRAP -> TRAP |
| 97 | + CatacombMapColor.MINIBOSS -> MINIBOSS |
| 98 | + CatacombMapColor.UNKNOWN -> DEFAULT |
| 99 | + else -> null |
| 100 | + } |
| 101 | + } |
| 102 | +} |
| 103 | + |
| 104 | +@GenerateCodec |
| 105 | +data class StoredCatacombRoom( |
| 106 | + var name: String, |
| 107 | + var id: String, |
| 108 | + var secrets: Int, |
| 109 | + @FieldName("center") val centerHash: String, |
| 110 | + @FieldName("directions") val directionalHashes: Map<String, Direction>, |
| 111 | +) { |
| 112 | + var shouldSerialize = false |
| 113 | + |
| 114 | + fun markChange() { |
| 115 | + shouldSerialize = true |
| 116 | + } |
| 117 | +} |
0 commit comments