package net.torvald.terrarum.debuggerapp import net.torvald.terrarum.ActorValue import net.torvald.terrarum.Terrarum import net.torvald.terrarum.console.Echo import net.torvald.terrarum.console.SetAV import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.gameactors.ActorWithSprite import net.torvald.terrarum.mapdrawer.FeaturesDrawer import java.awt.BorderLayout import java.awt.GridLayout import java.awt.event.MouseAdapter import java.awt.event.MouseEvent import java.awt.event.MouseListener import javax.swing.* /** * Created by minjaesong on 2016-12-29. */ class ActorValueTracker constructor() : JFrame() { constructor(actor: Actor?) : this() { setTrackingActor(actor) } private val avInfoArea = JTextArea() private val avInfoScroller = JScrollPane(avInfoArea) private val avPosArea = JTextArea() private val avPosScroller = JScrollPane(avPosArea) private var actor: ActorWithSprite? = null private var actorValue: ActorValue? = null private val modavInputKey = JTextField() private val modavInputValue = JTextField() private val buttonAddAV = JButton("Add/Mod") private val buttonDelAV = JButton("Delete") //private val selectedActorLabel = JLabel("Selected actor: ") private val actorIDField = JTextField() private val buttonChangeActor = JButton("Change") init { title = "Actor value tracker" defaultCloseOperation = JFrame.DISPOSE_ON_CLOSE val divPanel = JPanel() divPanel.layout = BorderLayout(0, 2) avInfoArea.highlighter = null // prevent text-drag-crash avPosArea.highlighter = null // prevent text-drag-crash avInfoScroller.horizontalScrollBarPolicy = JScrollPane.HORIZONTAL_SCROLLBAR_NEVER avPosScroller.horizontalScrollBarPolicy = JScrollPane.HORIZONTAL_SCROLLBAR_NEVER if (actor != null) { actorIDField.text = "${actor!!.referenceID}" } // button listener for buttons buttonAddAV.addMouseListener(object : MouseAdapter() { override fun mousePressed(e: MouseEvent?) { if (actor != null && modavInputKey.text.isNotBlank() && modavInputValue.text.isNotBlank()) { SetAV.execute(( "setav;" + "${actor!!.referenceID};" + "${modavInputKey.text};" + "${modavInputValue.text}" ).split(';').toTypedArray()) } } }) buttonDelAV.addMouseListener(object : MouseAdapter() { override fun mousePressed(e: MouseEvent?) { if (actorValue != null && modavInputKey.text.isNotBlank()) { actorValue!!.remove(modavInputKey.text) Echo("${SetAV.ccW}Removed ${SetAV.ccM}${modavInputKey.text} ${SetAV.ccW}of ${SetAV.ccY}${actor!!.referenceID}") println("[ActorValueTracker] Removed ActorValue '${modavInputKey.text}' of $actor") } } }) buttonChangeActor.addMouseListener(object : MouseAdapter() { override fun mousePressed(e: MouseEvent?) { if (actorIDField.text.toLowerCase() == "player") { actor = Terrarum.ingame!!.player actorValue = actor!!.actorValue } else if (actorIDField.text.isNotBlank()) { actor = Terrarum.ingame!!.getActorByID(actorIDField.text.toInt()) as ActorWithSprite actorValue = actor!!.actorValue } } }) // panel elements val actorNameBar = JPanel() actorNameBar.layout = BorderLayout(2, 0) actorNameBar.add(JLabel("RefID: "), BorderLayout.LINE_START) actorNameBar.add(actorIDField, BorderLayout.CENTER) actorNameBar.add(buttonChangeActor, BorderLayout.LINE_END) val posAndAV = JPanel() posAndAV.layout = BorderLayout() posAndAV.add(avPosScroller, BorderLayout.PAGE_START) posAndAV.add(avInfoScroller, BorderLayout.CENTER) val toolbox = JPanel() toolbox.layout = BorderLayout() val toolpanel = JPanel() toolpanel.layout = GridLayout(1, 0) toolpanel.add(buttonAddAV) toolpanel.add(buttonDelAV) val modpanelLabels = JPanel() modpanelLabels.layout = BorderLayout(4, 0) modpanelLabels.add(JLabel("Key"), BorderLayout.PAGE_START) modpanelLabels.add(JLabel("Value"), BorderLayout.CENTER) val modpanelFields = JPanel() modpanelFields.layout = BorderLayout(4, 2) modpanelFields.add(modavInputKey, BorderLayout.PAGE_START) modpanelFields.add(modavInputValue, BorderLayout.CENTER) val modpanel = JPanel() modpanel.layout = BorderLayout(4, 2) modpanel.add(modpanelLabels, BorderLayout.LINE_START) modpanel.add(modpanelFields, BorderLayout.CENTER) modpanel.add(JLabel( "Messed-up type or careless delete will crash the game.
" + "Prepend two underscores for boolean literals." ), BorderLayout.PAGE_END) toolbox.add(toolpanel, BorderLayout.PAGE_START) toolbox.add(modpanel, BorderLayout.CENTER) divPanel.add(actorNameBar, BorderLayout.PAGE_START) divPanel.add(posAndAV, BorderLayout.CENTER) divPanel.add(toolbox, BorderLayout.PAGE_END) this.add(divPanel) this.setSize(300, 600) this.isVisible = true } fun setTrackingActor(actor: Actor?) { this.actorValue = actor?.actorValue this.title = "AVTracker — $actor" if (actor is ActorWithSprite) { this.actor = actor } update() } fun update() { val sb = StringBuilder() if (actor != null) { sb.append("toString: ${actor!!}\n") sb.append("X: ${actor!!.hitbox.pointedX} (${(actor!!.hitbox.pointedX / FeaturesDrawer.TILE_SIZE).toInt()})\n") sb.append("Y: ${actor!!.hitbox.pointedY} (${(actor!!.hitbox.pointedY / FeaturesDrawer.TILE_SIZE).toInt()})") avPosArea.text = "$sb" sb.setLength(0) // clear stringbuffer } if (actorValue != null) { for (key in actorValue!!.keySet) { val value = actorValue!![key.toString()]!! val type = value.javaClass.simpleName sb.append("$key = $value ($type)\n") } if (sb.isNotEmpty()) { sb.deleteCharAt(sb.length - 1) // delete trailing \n } avInfoArea.text = "$sb" } else { avInfoArea.text = "" } } } /* +--------------------------------+ | Actor: [5333533 ] [Change] | LBL TFL BTN +--------------------------------+ | X: 65532.655654747 (4095) | TAR | Y: 3050.4935465 (190) | | ... | +--------------------------------+ | [ Add/Mod ] [ Delete ] | BTN BTN +--------------------------------+ | Key [ ] | LBL TFL | Value [ ] | LBL TFL +--------------------------------+ */