diff --git a/src/net/torvald/terrarum/StateInGame.kt b/src/net/torvald/terrarum/StateInGame.kt index e72f4c869..9cb0a6b52 100644 --- a/src/net/torvald/terrarum/StateInGame.kt +++ b/src/net/torvald/terrarum/StateInGame.kt @@ -43,8 +43,7 @@ import java.util.concurrent.locks.ReentrantLock /** * Created by minjaesong on 15-12-30. */ -class StateInGame @Throws(SlickException::class) -constructor() : BasicGameState() { +class StateInGame : BasicGameState() { private val ACTOR_UPDATE_RANGE = 4096 internal var game_mode = 0 diff --git a/src/net/torvald/terrarum/console/CommandDict.kt b/src/net/torvald/terrarum/console/CommandDict.kt index 116d06494..0fe001a00 100644 --- a/src/net/torvald/terrarum/console/CommandDict.kt +++ b/src/net/torvald/terrarum/console/CommandDict.kt @@ -53,7 +53,8 @@ object CommandDict { Pair("spawnball", SpawnPhysTestBall), Pair("spawntorch", SpawnTikiTorch), Pair("musictest", MusicTest), - Pair("spawntapestry", SpawnTapestry) + Pair("spawntapestry", SpawnTapestry), + Pair("imtest", JavaIMTest) ) operator fun get(commandName: String): ConsoleCommand { diff --git a/src/net/torvald/terrarum/console/JavaIMTest.kt b/src/net/torvald/terrarum/console/JavaIMTest.kt new file mode 100644 index 000000000..dfc1bb95a --- /dev/null +++ b/src/net/torvald/terrarum/console/JavaIMTest.kt @@ -0,0 +1,24 @@ +package net.torvald.terrarum.console + +import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.swingapp.IMStringReader +import javax.swing.JFrame + +/** + * Created by SKYHi14 on 2017-02-05. + */ + +object JavaIMTest : ConsoleCommand { + + override fun execute(args: Array) { + IMStringReader( + Terrarum.appgc, + { Echo("[JavaIMTest -> IMStringReader] $it") }, // send input to Echo + "JavaIMTest" + ) + } + + override fun printUsage() { + Echo("Tests Swing input window to get non-English text input") + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/swingapp/IMStringReader.kt b/src/net/torvald/terrarum/swingapp/IMStringReader.kt new file mode 100644 index 000000000..10da1fb5b --- /dev/null +++ b/src/net/torvald/terrarum/swingapp/IMStringReader.kt @@ -0,0 +1,103 @@ +package net.torvald.terrarum.swingapp + +import net.torvald.terrarum.langpack.Lang +import org.newdawn.slick.GameContainer +import java.awt.BorderLayout +import java.awt.FlowLayout +import java.awt.event.* +import javax.swing.* + + +/** + * Multilingual string input + * + * This kind of hack was often used in retro games that does not support multilingual input per se, + * so it would give you a pop-up with text field to get the string input from user, using resources + * provided by the OS. + * + * This hack is still alive, for example: "Princess Maker 2 Refine" on Steam, when installed in + * Chinese/Japanese/Korean Language. Although the game was released in 2016 via Steam (hence the "Refine"), + * the original game were released on 1995. + * + * Although admittedly, Korean input does not require this hack, you can just write the Input Method + * out of Java/Kotlin as the language does not need conversion (jp. Henkan) exists in Chinese and Japanese. + * + * Created by SKYHi14 on 2017-02-05. + */ +class IMStringReader(gc: GameContainer, feedInput: (String) -> Unit, message: String? = null) : JFrame() { + + private val inputArea = JTextField() + private val buttonOkay = JButton(Lang["MENU_LABEL_OK"]) + private val buttonCancel = JButton(Lang["MENU_LABEL_CANCEL"]) + + private val labelTitle = message ?: "Enter some text" + + + var userInput: String = ""//null + private set + + + init { + this.title = labelTitle + defaultCloseOperation = JFrame.DISPOSE_ON_CLOSE + + gc.pause() + + buttonOkay.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?) { + userInput = inputArea.text + isVisible = false + gc.isPaused = false + + feedInput(userInput) + + dispose() + } + }) + + buttonCancel.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?) { + userInput = ""//null + isVisible = false + gc.isPaused = false + + dispose() + } + }) + + this.addKeyListener(object : KeyListener { + override fun keyTyped(e: KeyEvent?) { } + override fun keyReleased(e: KeyEvent?) { } + override fun keyPressed(e: KeyEvent?) { + userInput = inputArea.text + isVisible = false + gc.isPaused = false + + feedInput(userInput) + + dispose() + } + }) + + val buttonsArea = JPanel() + buttonsArea.layout = FlowLayout() + buttonsArea.add(buttonOkay) + buttonsArea.add(buttonCancel) + + this.layout = BorderLayout(2, 2) + this.add(JLabel(labelTitle), BorderLayout.PAGE_START) + this.add(inputArea, BorderLayout.CENTER) + this.add(buttonsArea, BorderLayout.PAGE_END) + this.isVisible = true + this.setSize(240, 118) + } + +} \ No newline at end of file