diff options
Diffstat (limited to 'src/features/dungeonMap2/DungeonMapRoom.js')
-rw-r--r-- | src/features/dungeonMap2/DungeonMapRoom.js | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/src/features/dungeonMap2/DungeonMapRoom.js b/src/features/dungeonMap2/DungeonMapRoom.js new file mode 100644 index 0000000..d6ee014 --- /dev/null +++ b/src/features/dungeonMap2/DungeonMapRoom.js @@ -0,0 +1,256 @@ +import DungeonRoomStaticData from "./DungeonRoomStaticData" + +const Color = Java.type("java.awt.Color") + +class DungeonMapRoom { + + static TYPE_SPAWN = 0 + static TYPE_NORMAL = 1 + static TYPE_PUZZLE = 2 + static TYPE_MINIBOSS = 3 + static TYPE_FAIRY = 4 + static TYPE_BLOOD = 5 + static TYPE_TRAP = 7 + static TYPE_UNKNOWN = 6 + + static SHAPE_1X1 = 0 + static SHAPE_1X2 = 1 + static SHAPE_1X3 = 2 + static SHAPE_1X4 = 3 + static SHAPE_2X2 = 4 + static SHAPE_L = 5 + + static fromId(roomId, x, y, rotation) { + let data = DungeonRoomStaticData.getDataFromId(roomId) + let type = DungeonMapRoom.TYPE_NORMAL + switch (data.type) { + case "mobs": + type = DungeonMapRoom.TYPE_NORMAL + break + case "miniboss": + type = DungeonMapRoom.TYPE_NORMAL + break + case "spawn": + type = DungeonMapRoom.TYPE_SPAWN + break + case "puzzle": + type = DungeonMapRoom.TYPE_PUZZLE + break + case "gold": + type = DungeonMapRoom.TYPE_MINIBOSS + break + case "fairy": + type = DungeonMapRoom.TYPE_FAIRY + break + case "blood": + type = DungeonMapRoom.TYPE_BLOOD + break + case "trap": + type = DungeonMapRoom.TYPE_TRAP + break + } + + let shape = DungeonMapRoom.SHAPE_1X1 + switch (data.shape) { + case "1x1": + shape = DungeonMapRoom.SHAPE_1X1 + break + case "1x2": + shape = DungeonMapRoom.SHAPE_1X2 + break + case "1x3": + shape = DungeonMapRoom.SHAPE_1X3 + break + case "1x4": + shape = DungeonMapRoom.SHAPE_1X4 + break + case "2x2": + shape = DungeonMapRoom.SHAPE_2X2 + break + case "L": + shape = DungeonMapRoom.SHAPE_L + break + } + return new DungeonMapRoom(type, shape, rotation, x, y, roomId) + } + + /** + * + * @param {Number} type + * @param {Number} shape + * @param {Number} rotation 0-3 + * @param {Number} x + * @param {Number} y + * @param {String} roomId + */ + constructor(type, shape, rotation, x, y, roomId) { + this.type = type + this.shape = shape + this.rotation = rotation + this.roomId = roomId + this.maxSecrets = roomId ? DungeonRoomStaticData.getDataFromId(roomId).secrets : 0 + this.secrets = 0 + + this.checkedState = 0 + + this.location = [x, y] + } + + setSecrets(curr, max) { + if (this.maxSecrets === 0) return + this.maxSecrets = max + this.secrets = curr + } + + getSecrets() { + let checkColor = "&8" + if (this.checkedState === 1) checkColor = "&f" + if (this.checkedState === 2) checkColor = "&a" + return checkColor + this.secrets + "/" + this.maxSecrets + } + + setId(id) { + if (this.roomId !== id) { + this.roomId = id + + let newRoomData = DungeonMapRoom.fromId(id) + this.type = newRoomData.type + this.shape = newRoomData.shape + this.maxSecrets = newRoomData.maxSecrets + } + } + + setCheckedState(state) { } + + /** + * Renders this room onto the given Graphics2D + * @param {Graphics2D} graphics + */ + draw(graphics, renderTicks) { + + let [roomWidth, roomHeight] = this.getRoomWidthHeight() + + let translateX = this.location[0] + 3 + roomWidth / 2 + let translateY = this.location[1] + 3 + roomHeight / 2 + + graphics.translate(translateX, translateY) + + graphics.setColor(this.getRoomRenderColor()) + + switch (this.shape) { + case DungeonMapRoom.SHAPE_1X1: + case DungeonMapRoom.SHAPE_1X2: + case DungeonMapRoom.SHAPE_1X3: + case DungeonMapRoom.SHAPE_1X4: + case DungeonMapRoom.SHAPE_2X2: + graphics.fillRect(-roomWidth / 2 + 3, -roomHeight / 2 + 3, roomWidth - 6, roomHeight - 6) + break; + case DungeonMapRoom.SHAPE_L: + graphics.rotate(this.rotation * Math.PI / 2) + graphics.fillRect(-(26 + 32) / 2, -(26 + 32) / 2, 26, 26 + 32) + graphics.fillRect(-(26 + 32) / 2, -(26 + 32) / 2, 26 + 32, 26) + graphics.rotate(-this.rotation * Math.PI / 2) + break; + } + + graphics.translate(-translateX, -translateY) + + if (renderTicks || this.maxSecrets === 0) { + if (this.checkedState === 1) { + let loc = this.getIconLocation() + graphics.drawImage(whiteCheck, loc[0] - 2, loc[1] - 2, 10, 10, null) + } + if (this.checkedState === 2) { + let loc = this.getIconLocation() + graphics.drawImage(greenCheck, loc[0] - 2, loc[1] - 2, 10, 10, null) + } + } + } + + getRoomWidthHeight() { + let roomWidth = 32 + let roomHeight = 32 + + switch (this.shape) { + case DungeonMapRoom.SHAPE_1X2: + roomWidth = 64 + break; + case DungeonMapRoom.SHAPE_1X3: + roomWidth = 96 + break; + case DungeonMapRoom.SHAPE_1X4: + roomWidth = 128 + break; + case DungeonMapRoom.SHAPE_2X2: + case DungeonMapRoom.SHAPE_L: + roomWidth = 64 + roomHeight = 64 + break; + } + + if (this.rotation === 1 || this.rotation === 3) { + let tmp = roomWidth + roomWidth = roomHeight + roomHeight = tmp + } + + return [roomWidth, roomHeight] + } + + getRoomRenderColor() { + return roomColorMap.get(this.type) + } + + getIconLocation() { + let [width, height] = this.getRoomWidthHeight() + if (this.shape === DungeonMapRoom.SHAPE_L && this.rotation === 0) { + return [this.location[0] + 16, this.location[1] + 16] + } + if (this.shape === DungeonMapRoom.SHAPE_L && this.rotation === 1) { + return [this.location[0] + 16 + 32, this.location[1] + 16] + } + if (this.shape === DungeonMapRoom.SHAPE_L && this.rotation === 2) { + return [this.location[0] + 16 + 31, this.location[1] + 16 + 31] + } + if (this.shape === DungeonMapRoom.SHAPE_L && this.rotation === 2) { + return [this.location[0] + 16, this.location[1] + 16 + 32] + } + + return [this.location[0] + width / 2, this.location[1] + height / 2] + } + + static drawUnknownRoom(graphics, x, y) { + let roomWidth = 32 + let roomHeight = 32 + + let translateX = x + 3 + roomWidth / 2 + let translateY = y + 3 + roomHeight / 2 + + graphics.translate(translateX, translateY) + + graphics.setColor(roomColorMap.get(DungeonMapRoom.TYPE_UNKNOWN)) + + graphics.fillRect(-13, -13, 26, 26) + + graphics.drawImage(questionMark, -4, -7, 8, 14, null) + + graphics.translate(-translateX, -translateY) + } +} + +let roomColorMap = new Map() +roomColorMap.set(DungeonMapRoom.TYPE_SPAWN, new Color(Renderer.color(0, 124, 0, 255))) +roomColorMap.set(DungeonMapRoom.TYPE_NORMAL, new Color(Renderer.color(114, 67, 27, 255))) +roomColorMap.set(DungeonMapRoom.TYPE_PUZZLE, new Color(Renderer.color(178, 76, 216, 255))) +roomColorMap.set(DungeonMapRoom.TYPE_MINIBOSS, new Color(Renderer.color(229, 229, 51, 255))) +roomColorMap.set(DungeonMapRoom.TYPE_FAIRY, new Color(Renderer.color(242, 127, 165, 255))) +roomColorMap.set(DungeonMapRoom.TYPE_BLOOD, new Color(Renderer.color(255, 0, 0, 255))) +roomColorMap.set(DungeonMapRoom.TYPE_TRAP, new Color(Renderer.color(216, 127, 51, 255))) +roomColorMap.set(DungeonMapRoom.TYPE_UNKNOWN, new Color(Renderer.color(65, 65, 65, 255))) + +const greenCheck = new Image("greenCheckVanilla.png", "https://i.imgur.com/h2WM1LO.png").image +const whiteCheck = new Image("whiteCheckVanilla.png", "https://i.imgur.com/hwEAcnI.png").image +const failedRoom = new Image("failedRoomVanilla.png", "https://i.imgur.com/WqW69z3.png").image +const questionMark = new Image("questionMarkVanilla.png", "https://i.imgur.com/1jyxH9I.png").image + +export default DungeonMapRoom
\ No newline at end of file |