mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-16 08:36:07 +09:00
new debugging tool ActorValueTracker
Former-commit-id: f30d2a859521082609425722edb91d3c366fbc58 Former-commit-id: 1486ad6b0a85415124c87522f07c012d4a335567
This commit is contained in:
48
src/net/torvald/terrarum/console/AVTracker.kt
Normal file
48
src/net/torvald/terrarum/console/AVTracker.kt
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
package net.torvald.terrarum.console
|
||||||
|
|
||||||
|
import net.torvald.terrarum.Terrarum
|
||||||
|
import net.torvald.terrarum.debuggerapp.ActorValueTracker
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by SKYHi14 on 2016-12-29.
|
||||||
|
*/
|
||||||
|
object AVTracker : ConsoleCommand {
|
||||||
|
private val jPanelInstances = ArrayList<ActorValueTracker>()
|
||||||
|
|
||||||
|
override fun execute(args: Array<String>) {
|
||||||
|
if (args.size < 2) {
|
||||||
|
jPanelInstances.add(ActorValueTracker(Terrarum.ingame.player))
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
try {
|
||||||
|
val actorID = args[1].toInt()
|
||||||
|
|
||||||
|
if (Terrarum.ingame.hasActor(actorID)) {
|
||||||
|
jPanelInstances.add(ActorValueTracker(Terrarum.ingame.getActorByID(actorID)))
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw IllegalArgumentException()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (e: NumberFormatException) {
|
||||||
|
EchoError("Illegal actor ID input")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
catch (e1: IllegalArgumentException) {
|
||||||
|
EchoError("No such actor with specified ID")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun printUsage() {
|
||||||
|
Echo("Pops up new window that provides real-time information about the actor's actor value")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun update() {
|
||||||
|
jPanelInstances.forEach {
|
||||||
|
it.setInfoLabel()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
201
src/net/torvald/terrarum/debuggerapp/ActorValueTracker.kt
Normal file
201
src/net/torvald/terrarum/debuggerapp/ActorValueTracker.kt
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
package net.torvald.terrarum.debuggerapp
|
||||||
|
|
||||||
|
import net.torvald.terrarum.console.Echo
|
||||||
|
import net.torvald.terrarum.console.SetAV
|
||||||
|
import net.torvald.terrarum.gameactors.AVKey
|
||||||
|
import net.torvald.terrarum.gameactors.Actor
|
||||||
|
import net.torvald.terrarum.gameactors.ActorValue
|
||||||
|
import net.torvald.terrarum.gameactors.ActorWithBody
|
||||||
|
import net.torvald.terrarum.mapdrawer.MapDrawer
|
||||||
|
import java.awt.BorderLayout
|
||||||
|
import java.awt.Color
|
||||||
|
import java.awt.Dimension
|
||||||
|
import java.awt.GridLayout
|
||||||
|
import java.awt.event.MouseEvent
|
||||||
|
import java.awt.event.MouseListener
|
||||||
|
import javax.swing.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by SKYHi14 on 2016-12-29.
|
||||||
|
*/
|
||||||
|
class ActorValueTracker constructor() : JFrame() {
|
||||||
|
|
||||||
|
constructor(actor: Actor) : this() {
|
||||||
|
setTrackingActor(actor)
|
||||||
|
}
|
||||||
|
|
||||||
|
private val selectedActorLabel = JLabel("Actor not selected")
|
||||||
|
private val avInfoArea = JTextArea()
|
||||||
|
private val avInfoScroller = JScrollPane(avInfoArea)
|
||||||
|
private val avPosArea = JTextArea()
|
||||||
|
private val avPosScroller = JScrollPane(avPosArea)
|
||||||
|
private var actor: ActorWithBody? = 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")
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
// button listener for buttons
|
||||||
|
buttonAddAV.addMouseListener(object : MouseListener {
|
||||||
|
override fun mouseEntered(e: MouseEvent?) { }
|
||||||
|
override fun mouseClicked(e: MouseEvent?) { }
|
||||||
|
override fun mouseReleased(e: MouseEvent?) { }
|
||||||
|
override fun mouseExited(e: MouseEvent?) { }
|
||||||
|
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 : MouseListener {
|
||||||
|
override fun mouseEntered(e: MouseEvent?) { }
|
||||||
|
override fun mouseClicked(e: MouseEvent?) { }
|
||||||
|
override fun mouseReleased(e: MouseEvent?) { }
|
||||||
|
override fun mouseExited(e: MouseEvent?) { }
|
||||||
|
override fun mousePressed(e: MouseEvent?) {
|
||||||
|
if (actorValue != null && modavInputKey.text.isNotBlank()) {
|
||||||
|
actorValue!!.remove(modavInputKey.text)
|
||||||
|
Echo("${SetAV.ccW}Removed key ${SetAV.ccG}${modavInputKey.text} ${SetAV.ccW}of ${SetAV.ccY}${actor!!.referenceID}")
|
||||||
|
println("[ActorValueTracker] Removed key '${modavInputKey.text}' of $actor")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
// panel elements
|
||||||
|
divPanel.add(selectedActorLabel, BorderLayout.PAGE_START)
|
||||||
|
val posAndAV = JPanel()
|
||||||
|
posAndAV.layout = BorderLayout()
|
||||||
|
posAndAV.add(avPosScroller, BorderLayout.PAGE_START)
|
||||||
|
posAndAV.add(avInfoScroller, BorderLayout.CENTER)
|
||||||
|
|
||||||
|
divPanel.add(posAndAV, 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)
|
||||||
|
|
||||||
|
toolbox.add(toolpanel, BorderLayout.PAGE_START)
|
||||||
|
toolbox.add(modpanel, BorderLayout.CENTER)
|
||||||
|
modpanel.add(JLabel(
|
||||||
|
"<html>Messed-up type or careless delete will crash the game.</html>"
|
||||||
|
), BorderLayout.PAGE_END)
|
||||||
|
|
||||||
|
divPanel.add(toolbox, BorderLayout.PAGE_END)
|
||||||
|
|
||||||
|
|
||||||
|
this.add(divPanel)
|
||||||
|
this.setSize(300, 600)
|
||||||
|
this.isVisible = true
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setTrackingActor(actor: Actor) {
|
||||||
|
this.actorValue = actor.actorValue
|
||||||
|
|
||||||
|
selectedActorLabel.text = "Actor: $actor"
|
||||||
|
this.title = "AVTracker — $actor"
|
||||||
|
|
||||||
|
if (actor is ActorWithBody) {
|
||||||
|
this.actor = actor
|
||||||
|
}
|
||||||
|
|
||||||
|
setInfoLabel()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setInfoLabel() {
|
||||||
|
val sb = StringBuilder()
|
||||||
|
|
||||||
|
if (actor != null) {
|
||||||
|
sb.append("X: ${actor!!.hitbox.pointedX} (${(actor!!.hitbox.pointedX / MapDrawer.TILE_SIZE).toInt()})\n")
|
||||||
|
sb.append("Y: ${actor!!.hitbox.pointedY} (${(actor!!.hitbox.pointedY / MapDrawer.TILE_SIZE).toInt()})")
|
||||||
|
|
||||||
|
avPosArea.text = "$sb"
|
||||||
|
sb.setLength(0) // clear stringbuffer
|
||||||
|
}
|
||||||
|
|
||||||
|
if (actorValue != null) {
|
||||||
|
for (key in actorValue!!.keySet) {
|
||||||
|
val value = actorValue!![key.toString()]
|
||||||
|
|
||||||
|
sb.append("$key = ${
|
||||||
|
if (value is String)
|
||||||
|
"\"$value\"" // name = "Sigrid"
|
||||||
|
else if (value is Boolean)
|
||||||
|
"_$value" // intelligent = __true
|
||||||
|
else
|
||||||
|
"$value" // scale = 1.0
|
||||||
|
}\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.deleteCharAt(sb.length - 1) // delete trailing \n
|
||||||
|
|
||||||
|
avInfoArea.text = "$sb"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
avInfoArea.text = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
|
||||||
|
+--------------------------------+
|
||||||
|
| Actor: 5333533 (Sigrid) LBL |
|
||||||
|
+--------------------------------+
|
||||||
|
| X: 65532.655654747 (4095) LBL |
|
||||||
|
| Y: 3050.4935465 (190) LBL |
|
||||||
|
| ... |
|
||||||
|
+--------------------------------+
|
||||||
|
| < TOOLBOX > BTN |
|
||||||
|
+--------------------------------+
|
||||||
|
| Key [ ] |
|
||||||
|
| Value [ ] |
|
||||||
|
+--------------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
@@ -22,11 +22,11 @@ abstract class Actor : Comparable<Actor>, Runnable {
|
|||||||
|
|
||||||
override fun equals(other: Any?) = referenceID == (other as Actor).referenceID
|
override fun equals(other: Any?) = referenceID == (other as Actor).referenceID
|
||||||
override fun hashCode() = referenceID
|
override fun hashCode() = referenceID
|
||||||
override fun toString() = "Actor, " +
|
override fun toString() =
|
||||||
if (actorValue.getAsString(AVKey.NAME).isNullOrEmpty())
|
if (actorValue.getAsString(AVKey.NAME).isNullOrEmpty())
|
||||||
"ID: ${hashCode()}"
|
"${hashCode()}"
|
||||||
else
|
else
|
||||||
"ID: ${hashCode()} (${actorValue.getAsString(AVKey.NAME)})"
|
"${hashCode()} (${actorValue.getAsString(AVKey.NAME)})"
|
||||||
override fun compareTo(other: Actor): Int = (this.referenceID - other.referenceID).sign()
|
override fun compareTo(other: Actor): Int = (this.referenceID - other.referenceID).sign()
|
||||||
|
|
||||||
fun Int.sign(): Int = if (this > 0) 1 else if (this < 0) -1 else 0
|
fun Int.sign(): Int = if (this > 0) 1 else if (this < 0) -1 else 0
|
||||||
|
|||||||
Reference in New Issue
Block a user