From 186d6a8cb9e75729b003fcba83f1e014784b27f0 Mon Sep 17 00:00:00 2001 From: Song Minjae Date: Wed, 6 Jul 2016 20:17:51 +0900 Subject: [PATCH] monitor adjustment screen, changed "calibrate" to "adjust" (NOT the STRING_ID of langpack) Former-commit-id: ffae41e5876e54e2e0aedb5a93092db8e8f75d01 Former-commit-id: 65883b385a205d47b76c60f18a91186c2be922b2 --- res/locales/en/configurator.json | 13 ++ res/locales/en/game.json | 2 +- res/locales/fiFI/game.json | 2 +- res/locales/frFR/game.json | 2 +- res/locales/isIC/Polyglot-100_isIC.json | 26 +-- res/locales/koKR/configurator.json | 13 ++ res/locales/koKR/game.json | 2 +- src/net/torvald/serialise/WriteGameMapData.kt | 2 +- .../spriteanimation/SpriteAnimation.kt | 8 +- src/net/torvald/terrarum/StateFontTester.kt | 2 +- .../terrarum/{StateGame.kt => StateInGame.kt} | 16 +- src/net/torvald/terrarum/StateMonitorCheck.kt | 153 ++++++++++++++++++ src/net/torvald/terrarum/Terrarum.kt | 44 ++--- .../torvald/terrarum/console/Authenticator.kt | 2 +- .../torvald/terrarum/console/CodexEdictis.kt | 2 +- .../torvald/terrarum/console/CommandDict.kt | 2 +- .../terrarum/console/CommandInterpreter.kt | 2 +- src/net/torvald/terrarum/console/Echo.kt | 4 +- src/net/torvald/terrarum/console/Error.kt | 2 +- src/net/torvald/terrarum/console/ExportAV.kt | 2 +- src/net/torvald/terrarum/console/ExportMap.kt | 6 +- src/net/torvald/terrarum/console/GetAV.kt | 20 +-- .../torvald/terrarum/console/GetFactioning.kt | 2 +- src/net/torvald/terrarum/console/GetTime.kt | 2 +- src/net/torvald/terrarum/console/GsonTest.kt | 2 +- src/net/torvald/terrarum/console/Seed.kt | 2 +- src/net/torvald/terrarum/console/SetAV.kt | 6 +- .../torvald/terrarum/console/SetBulletin.kt | 2 +- .../terrarum/console/SetGlobalLightLevel.kt | 4 +- src/net/torvald/terrarum/console/SetTime.kt | 6 +- .../torvald/terrarum/console/SetTimeDelta.kt | 6 +- .../terrarum/console/SpawnPhysTestBall.kt | 2 +- .../terrarum/console/TeleportPlayer.kt | 4 +- .../torvald/terrarum/console/ToggleNoClip.kt | 6 +- src/net/torvald/terrarum/console/Zoom.kt | 10 +- src/net/torvald/terrarum/gameactors/Actor.kt | 2 +- .../terrarum/gameactors/ActorWithBody.kt | 12 +- .../terrarum/gameactors/NPCIntelligentBase.kt | 4 +- .../terrarum/gameactors/ThreadActorUpdate.kt | 2 +- .../physicssolver/CollisionSolver.kt | 4 +- .../terrarum/gamecontroller/GameController.kt | 34 ++-- .../terrarum/itemproperties/ItemPropCodex.kt | 2 +- .../terrarum/mapdrawer/LightmapRenderer.kt | 46 +++--- .../torvald/terrarum/mapdrawer/MapCamera.kt | 12 +- .../torvald/terrarum/mapdrawer/MapDrawer.kt | 2 +- .../terrarum/realestate/RealEstateUtility.kt | 6 +- .../terrarum/tileproperties/TilePropUtil.kt | 4 +- .../torvald/terrarum/tilestats/TileStats.kt | 4 +- .../terrarum/ui/BasicDebugInfoWindow.kt | 24 +-- src/net/torvald/terrarum/ui/ConsoleWindow.kt | 2 +- src/net/torvald/terrarum/ui/Typesetter.kt | 15 ++ src/net/torvald/terrarum/ui/UIHandler.kt | 84 ++++++---- work_files/Controls.numbers | Bin 241824 -> 242389 bytes 53 files changed, 425 insertions(+), 215 deletions(-) create mode 100644 res/locales/en/configurator.json create mode 100644 res/locales/koKR/configurator.json rename src/net/torvald/terrarum/{StateGame.kt => StateInGame.kt} (97%) create mode 100644 src/net/torvald/terrarum/StateMonitorCheck.kt create mode 100644 src/net/torvald/terrarum/ui/Typesetter.kt diff --git a/res/locales/en/configurator.json b/res/locales/en/configurator.json new file mode 100644 index 000000000..2e3cfff53 --- /dev/null +++ b/res/locales/en/configurator.json @@ -0,0 +1,13 @@ +{ + "MENU_MONITOR_CALI_TITLE": "Display check", + "MENU_MONITOR_CALI_LABEL_1": "You should be able to see bar 1 from the background", + "MENU_MONITOR_CALI_LABEL_2": "and clearly distinguish bar 30, 31 and 32", + "MENU_MONITOR_CALI_LABEL_3": " ", + "MENU_MONITOR_CALI_LABEL_4": "A bad monitor will not show few leftmost bars, will not show a difference", + "MENU_MONITOR_CALI_LABEL_5": "between the rightmost few, or shows a relatively large jump between 31 and 32", + "MENU_MONITOR_CALI_LABEL_6": " ", + "MENU_MONITOR_CALI_LABEL_7": "On a good monitor, you should see roughly equal steps in brightness", + "MENU_MONITOR_CALI_LABEL_8": "over the full 1 to 32 range", + "MENU_MONITOR_CALI_LABEL_9": " ", + "MENU_MONITOR_CALI_LABEL_10": "Adjust the contrast and brightness setting of the monitor to improve the image" +} \ No newline at end of file diff --git a/res/locales/en/game.json b/res/locales/en/game.json index e3b7d48ba..cbe190931 100644 --- a/res/locales/en/game.json +++ b/res/locales/en/game.json @@ -2,5 +2,5 @@ "MENU_LABEL_NEW_WORLD": "New World", "COPYRIGHT_PROPRIETARY": "All rights reserved.", - "APP_CALIBRATE_YOUR_MONITOR": "Best player experience can be achieved with properly calibrated monitor. If you have not, please do it before you play." + "APP_CALIBRATE_YOUR_MONITOR": "Best player experience can be achieved with properly adjusted monitor. If you have not, please do it before you play." } \ No newline at end of file diff --git a/res/locales/fiFI/game.json b/res/locales/fiFI/game.json index 6df6baff3..00d47ee08 100644 --- a/res/locales/fiFI/game.json +++ b/res/locales/fiFI/game.json @@ -2,5 +2,5 @@ "MENU_LABEL_NEW_WORLD": "Uusi Maailma", "COPYRIGHT_PROPRIETARY": "Kaikki oikeudet pidätetään", - "APP_CALIBRATE_YOUR_MONITOR": "Paras pelikokemus saavutetaan on oikealla kalibroitu näytöllä. Jos et ole ollut, kalibroi ennen pelaamista." + "APP_CALIBRATE_YOUR_MONITOR": "Paras pelikokemus saavutetaan on oikealla säädetty näytöllä. Jos et ole ollut, säädä ennen pelaamista." } \ No newline at end of file diff --git a/res/locales/frFR/game.json b/res/locales/frFR/game.json index 661436e1d..d3859b7ad 100644 --- a/res/locales/frFR/game.json +++ b/res/locales/frFR/game.json @@ -2,5 +2,5 @@ "MENU_LABEL_NEW_WORLD": "Nouveau Monde", "COPYRIGHT_PROPRIETARY": "Tous les droits sont réservés.", - "APP_CALIBRATE_YOUR_MONITOR": "Meilleure expérience de joueur peut être réalisé avec écran correctement calibré. Si vous ne l'avez pas, s.v.p. le calibrez avant de jouer." + "APP_CALIBRATE_YOUR_MONITOR": "Meilleure expérience de joueur peut être réalisé avec écran correctement réglé. Si vous ne l'avez pas, s.v.p. le réglez avant de jouer." } \ No newline at end of file diff --git a/res/locales/isIC/Polyglot-100_isIC.json b/res/locales/isIC/Polyglot-100_isIC.json index 09d1f1c89..1b7d98156 100644 --- a/res/locales/isIC/Polyglot-100_isIC.json +++ b/res/locales/isIC/Polyglot-100_isIC.json @@ -2107,19 +2107,19 @@ }, { "n": "MENU_LABEL_PRESS_ANYKEY", - "s": "Press any key" + "s": "Ýttu á takka" }, { "n": "MENU_LABEL_PRESS_ANYKEY_CONTINUE", - "s": "Press any key to continue" + "s": "Ýttu á takka til að halda áfram" }, { "n": "MENU_LABEL_PRESS_START", - "s": "Press Start" + "s": "Ýttu „Start“" }, { "n": "MENU_LABEL_PRESS_START_CONTINUE", - "s": "Press Start to continue" + "s": "Ýttu „Start“ til að halda áfram" }, { "n": "MENU_LABEL_PREVIOUS", @@ -2227,11 +2227,11 @@ }, { "n": "MENU_LANGUAGE_THIS", - "s": "English" + "s": "Íslenska" }, { "n": "MENU_LANGUAGE_THIS_EN", - "s": "English" + "s": "Icelandic" }, { "n": "MENU_LOGIN", @@ -2319,19 +2319,19 @@ }, { "n": "MENU_NAME", - "s": "Name" + "s": "Nafn" }, { "n": "MENU_NAME_FIRST", - "s": "First Name" + "s": "Fornafn" }, { "n": "MENU_NAME_LAST", - "s": "Last Name" + "s": "Eftirnafn" }, { "n": "MENU_NAME_USER", - "s": "Username" + "s": "Notandanafn" }, { "n": "MENU_OPTIONS", @@ -2351,7 +2351,7 @@ }, { "n": "MENU_OPTIONS_CONTROLS", - "s": "Controls" + "s": "Stýringar" }, { "n": "MENU_OPTIONS_DIFFICULTY", @@ -2359,7 +2359,7 @@ }, { "n": "MENU_OPTIONS_DISPLAY", - "s": "Display" + "s": "Skjár" }, { "n": "MENU_OPTIONS_EFFECT_DETAIL", @@ -2447,7 +2447,7 @@ }, { "n": "MENU_OPTIONS_SIZE", - "s": "Size" + "s": "Stærð" }, { "n": "MENU_OPTIONS_SOUND", diff --git a/res/locales/koKR/configurator.json b/res/locales/koKR/configurator.json new file mode 100644 index 000000000..cf87f15ff --- /dev/null +++ b/res/locales/koKR/configurator.json @@ -0,0 +1,13 @@ +{ + "MENU_MONITOR_CALI_TITLE": "모니터 확인", + "MENU_MONITOR_CALI_LABEL_1": "1번 막대가 배경에서 눈에 띄어야 하고", + "MENU_MONITOR_CALI_LABEL_2": "30·31·32번 막대가 확실히 구분되어야 합니다", + "MENU_MONITOR_CALI_LABEL_3": " ", + "MENU_MONITOR_CALI_LABEL_4": "부적절한 모니터에서는 왼쪽 끝의 막대 몇 개가 보이지 않거나", + "MENU_MONITOR_CALI_LABEL_5": "오른쪽 끝의 막대 몇 개가 똑같게 보이거나", + "MENU_MONITOR_CALI_LABEL_6": "31번과 32번의 차이가 크게 보일 것입니다", + "MENU_MONITOR_CALI_LABEL_7": " ", + "MENU_MONITOR_CALI_LABEL_8": "적절한 모니터에서는 1번 막대에서 32번 막대까지 거의 일정하게 밝아지는 것으로 보입니다", + "MENU_MONITOR_CALI_LABEL_9": " ", + "MENU_MONITOR_CALI_LABEL_10": "모니터의 대비와 밝기 설정을 조절해 모니터를 조정해 주십시오" +} \ No newline at end of file diff --git a/res/locales/koKR/game.json b/res/locales/koKR/game.json index d986608a3..2a8cba4ef 100644 --- a/res/locales/koKR/game.json +++ b/res/locales/koKR/game.json @@ -2,5 +2,5 @@ "MENU_LABEL_NEW_WORLD": "새 세계", "COPYRIGHT_PROPRIETARY": "모든 권리 보유.", - "APP_CALIBRATE_YOUR_MONITOR": "본 게임은 적절히 보정된 모니터에서 최상으로 즐길 수 있습니다. 보정하지 않았다면 플레이하기 전에 보정해 주십시오." + "APP_CALIBRATE_YOUR_MONITOR": "본 게임은 적절히 조정된 모니터에서 최상으로 즐길 수 있습니다. 조정하지 않았다면 플레이하기 전에 조정해 주십시오." } \ No newline at end of file diff --git a/src/net/torvald/serialise/WriteGameMapData.kt b/src/net/torvald/serialise/WriteGameMapData.kt index ed6b7787d..de29491c3 100644 --- a/src/net/torvald/serialise/WriteGameMapData.kt +++ b/src/net/torvald/serialise/WriteGameMapData.kt @@ -29,7 +29,7 @@ object WriteGameMapData { val path = Paths.get("${Terrarum.defaultSaveDir}" + "/$saveDirectoryName/${WriteMeta.META_FILENAME}") val tempPath = Files.createTempFile(path.toString(), "_temp") - val map = Terrarum.game.map + val map = Terrarum.ingame.map // TODO gzip diff --git a/src/net/torvald/spriteanimation/SpriteAnimation.kt b/src/net/torvald/spriteanimation/SpriteAnimation.kt index a2efd78e6..75f5201d6 100644 --- a/src/net/torvald/spriteanimation/SpriteAnimation.kt +++ b/src/net/torvald/spriteanimation/SpriteAnimation.kt @@ -4,7 +4,7 @@ package net.torvald.spriteanimation -import net.torvald.terrarum.StateGame +import net.torvald.terrarum.StateInGame import net.torvald.terrarum.Terrarum import com.jme3.math.FastMath import org.newdawn.slick.Graphics @@ -121,7 +121,7 @@ constructor() { */ @JvmOverloads fun render(g: Graphics, posX: Float, posY: Float, scale: Float = 1f) { var scale = scale - scale *= Terrarum.game.screenZoom + scale *= Terrarum.ingame.screenZoom // Null checking if (currentImage == null) { @@ -139,8 +139,8 @@ constructor() { flippedImage.startUse() flippedImage.drawEmbedded( - Math.round(posX * Terrarum.game.screenZoom).toFloat(), - Math.round(posY * Terrarum.game.screenZoom).toFloat(), + Math.round(posX * Terrarum.ingame.screenZoom).toFloat(), + Math.round(posY * Terrarum.ingame.screenZoom).toFloat(), FastMath.floor(width * scale).toFloat(), FastMath.floor(height * scale).toFloat() ) diff --git a/src/net/torvald/terrarum/StateFontTester.kt b/src/net/torvald/terrarum/StateFontTester.kt index d3aaa68b7..2a8a552fc 100644 --- a/src/net/torvald/terrarum/StateFontTester.kt +++ b/src/net/torvald/terrarum/StateFontTester.kt @@ -27,5 +27,5 @@ class StateFontTester : BasicGameState() { } - override fun getID(): Int = 666 + override fun getID(): Int = Terrarum.SCENE_ID_TEST_FONT } \ No newline at end of file diff --git a/src/net/torvald/terrarum/StateGame.kt b/src/net/torvald/terrarum/StateInGame.kt similarity index 97% rename from src/net/torvald/terrarum/StateGame.kt rename to src/net/torvald/terrarum/StateInGame.kt index 777b719a0..bd58f3f12 100644 --- a/src/net/torvald/terrarum/StateGame.kt +++ b/src/net/torvald/terrarum/StateInGame.kt @@ -35,7 +35,7 @@ import java.util.* /** * Created by minjaesong on 15-12-30. */ -class StateGame @Throws(SlickException::class) +class StateInGame @Throws(SlickException::class) constructor() : BasicGameState() { private val ACTOR_UPDATE_RANGE = 4096 @@ -128,7 +128,7 @@ constructor() : BasicGameState() { notifier = UIHandler(Notification()) notifier.setPosition( (Terrarum.WIDTH - notifier.UI.width) / 2, Terrarum.HEIGHT - notifier.UI.height) - notifier.setVisibility(true) + notifier.visible = true // set smooth lighting as in config KeyToggler.forceSet(KEY_LIGHTMAP_SMOOTH, Terrarum.getConfigBoolean("smoothlighting")) @@ -251,10 +251,10 @@ constructor() : BasicGameState() { // draw UIs run { - uiContainer.forEach { ui -> ui.render(gc, g) } - debugWindow.render(gc, g) - consoleHandler.render(gc, g) - notifier.render(gc, g) + uiContainer.forEach { ui -> ui.render(gc, sbg, g) } + debugWindow.render(gc, sbg, g) + consoleHandler.render(gc, sbg, g) + notifier.render(gc, sbg, g) } } @@ -415,8 +415,8 @@ constructor() : BasicGameState() { (a.hitbox.centeredX - p.hitbox.centeredX).sqr() + (a.hitbox.centeredY - p.hitbox.centeredY).sqr() /** whether the actor is within screen */ private fun Visible.inScreen() = distToActorSqr(this, player) <= - (Terrarum.WIDTH.plus(this.hitbox.width.div(2)).times(1 / Terrarum.game.screenZoom).sqr() + - Terrarum.HEIGHT.plus(this.hitbox.height.div(2)).times(1 / Terrarum.game.screenZoom).sqr()) + (Terrarum.WIDTH.plus(this.hitbox.width.div(2)).times(1 / Terrarum.ingame.screenZoom).sqr() + + Terrarum.HEIGHT.plus(this.hitbox.height.div(2)).times(1 / Terrarum.ingame.screenZoom).sqr()) /** whether the actor is within update range */ private fun Visible.inUpdateRange() = distToActorSqr(this, player) <= ACTOR_UPDATE_RANGE.sqr() /** diff --git a/src/net/torvald/terrarum/StateMonitorCheck.kt b/src/net/torvald/terrarum/StateMonitorCheck.kt new file mode 100644 index 000000000..1be2ec2bf --- /dev/null +++ b/src/net/torvald/terrarum/StateMonitorCheck.kt @@ -0,0 +1,153 @@ +package net.torvald.terrarum + +import net.torvald.terrarum.langpack.Lang +import net.torvald.terrarum.ui.Typesetter +import net.torvald.terrarum.ui.UICanvas +import net.torvald.terrarum.ui.UIHandler +import net.torvald.terrarum.ui.UITypable +import org.newdawn.slick.Color +import org.newdawn.slick.GameContainer +import org.newdawn.slick.Graphics +import org.newdawn.slick.Input +import org.newdawn.slick.state.BasicGameState +import org.newdawn.slick.state.StateBasedGame + +/** + * Created by minjaesong on 16-07-06. + */ +class StateMonitorCheck : BasicGameState() { + private lateinit var uiMonitorCheck: UIHandler + + override fun init(gc: GameContainer, g: StateBasedGame) { + uiMonitorCheck = UIHandler(MonitorCheckUI()) + uiMonitorCheck.visible = true + } + + override fun update(gc: GameContainer, sbg: StateBasedGame, delta: Int) { + uiMonitorCheck.update(gc, delta) + } + + override fun render(gc: GameContainer, sbg: StateBasedGame, g: Graphics) { + uiMonitorCheck.render(gc, sbg, g) + } + + override fun keyPressed(key: Int, c: Char) { + //uiMonitorCheck.setAsClosing() + } + + override fun getID(): Int = Terrarum.SCENE_ID_CONFIG_CALIBRATE + + class MonitorCheckUI : UICanvas { + override var width = Terrarum.WIDTH + override var height = Terrarum.HEIGHT + override var openCloseTime = 150 + + private val colourLUT = arrayOf( + 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38, 0x40, + 0x48, 0x50, 0x58, 0x60, 0x68, 0x70, 0x78, 0x80, + 0x88, 0x90, 0x98, 0xA0, 0xA8, 0xB0, 0xB8, 0xC0, + 0xC8, 0xD0, 0xD8, 0xE0, 0xE8, 0xF0, 0xF8, 0xFF + ) + + override fun update(gc: GameContainer, delta: Int) { + } + + override fun render(gc: GameContainer, g: Graphics) { + val titleY = Terrarum.HEIGHT * 7 / 16 + val instructionY = Terrarum.HEIGHT * 9 / 16 + val anykeyY = Terrarum.HEIGHT * 15 / 16 + + val barWidthAll = Terrarum.WIDTH.div(100).times(100) * 9 / 10 + val barWidth: Int = barWidthAll / 32 + 1 + val barHeight = 90 + + val yCentre = Terrarum.HEIGHT.shr(1) + + val barNumberGap = 5 + + g.background = Color.black + // draw bars + for (i in 0..31) { + val labelW = g.font.getWidth(i.plus(1).toString()) + val labelH = g.font.lineHeight + val barXstart = center(Terrarum.WIDTH, barWidthAll) + i.times(barWidth) + val barYstart = center(yCentre, barHeight) + + // bar start point indicator + if (i == 0) { + g.color = Color(0x404040) + g.drawLine( + barXstart.toFloat(), barYstart - barNumberGap - labelH.toFloat(), + barXstart.toFloat(), barYstart - barNumberGap.toFloat() + ) + } + + // bar numbers + if (i.plus(1) and 0x1 == 0 || i.plus(1) == 1) { + g.color = Color.white + g.drawString( + i.plus(1).toString(), + barXstart + center(barWidth, labelW).toFloat(), + barYstart - barNumberGap - labelH.toFloat() + ) + } + + // actual bar + g.color = Color(colourLUT[i], colourLUT[i], colourLUT[i]) + g.fillRect( + barXstart.toFloat(), + barYstart.toFloat(), + barWidth.toFloat(), + barHeight.toFloat() + ) + } + + // messages background + g.color = Color(0x404040) + g.fillRect( + 0f, Terrarum.HEIGHT.shr(1).toFloat(), + Terrarum.WIDTH.toFloat(), Terrarum.HEIGHT.shr(1).plus(1).toFloat() + ) + + // labels + g.color = Color.white + Typesetter.printCentered( + Lang["MENU_MONITOR_CALI_TITLE"], + titleY, + this, g + ) + + (1..10).forEach { + Typesetter.printCentered( + Lang["MENU_MONITOR_CALI_LABEL_$it"], + instructionY + it.minus(2).times(g.font.lineHeight), + this, g + ) + } + + Typesetter.printCentered( + Lang["MENU_LABEL_PRESS_ANYKEY_CONTINUE"], + anykeyY, + this, g + ) + + } + + override fun processInput(input: Input) { + } + + override fun doOpening(gc: GameContainer, delta: Int) { + } + + override fun doClosing(gc: GameContainer, delta: Int) { + } + + override fun endOpening(gc: GameContainer, delta: Int) { + } + + override fun endClosing(gc: GameContainer, delta: Int) { + } + + private fun center(x1: Int, x2: Int) = x1.minus(x2).div(2) + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index ba17a3d67..f4dd2a7f9 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -47,6 +47,8 @@ constructor(gamename: String) : StateBasedGame(gamename) { @Throws(SlickException::class) override fun initStatesList(gc: GameContainer) { + gc.input.enableKeyRepeat() + gameFont = GameFontWhite() smallNumbers = TinyAlphNum() @@ -57,14 +59,20 @@ constructor(gamename: String) : StateBasedGame(gamename) { } } - appgc.input.enableKeyRepeat() - - game = StateGame() - addState(game) + //game = StateGame() + //addState(game) + addState(StateMonitorCheck()) } companion object { + val sysLang: String + get() { + val lan = System.getProperty("user.language") + val country = System.getProperty("user.country") + return lan + country + } + /** * To be used with physics simulator */ @@ -86,7 +94,7 @@ constructor(gamename: String) : StateBasedGame(gamename) { var VSYNC = true val VSYNC_TRIGGER_THRESHOLD = 56 - lateinit var game: StateGame + lateinit var ingame: StateInGame lateinit var gameConfig: GameConfig lateinit var OSName: String @@ -101,7 +109,7 @@ constructor(gamename: String) : StateBasedGame(gamename) { private set private val localeSimple = arrayOf("de", "en", "es", "it") - var gameLocale = "en" // locale override + var gameLocale = "####" // locale override set(value) { if (localeSimple.contains(value.substring(0..1))) field = value.substring(0..1) @@ -114,8 +122,14 @@ constructor(gamename: String) : StateBasedGame(gamename) { lateinit var smallNumbers: Font private set - val SCENE_ID_HOME = 1 - val SCENE_ID_GAME = 3 + // 0x0 - 0xF: Game-related + // 0x10 - 0x1F: Config + // 0x100 and onward: unit tests for dev + val SCENE_ID_HOME = 0x1 + val SCENE_ID_GAME = 0x3 + val SCENE_ID_CONFIG_CALIBRATE = 0x11 + + val SCENE_ID_TEST_FONT = 0x100 var hasController = false val CONTROLLER_DEADZONE = 0.1f @@ -258,20 +272,6 @@ constructor(gamename: String) : StateBasedGame(gamename) { } - // exception handling - val sysLang: String - get() { - val lan = System.getProperty("user.language") - var country = System.getProperty("user.country") - if (lan == "en") country = "US" - else if (lan == "fr") country = "FR" - else if (lan == "de") country = "DE" - else if (lan == "ko") country = "KR" - - return lan + country - } - - /** * Return config from config set. If the config does not exist, default value will be returned. * @param key diff --git a/src/net/torvald/terrarum/console/Authenticator.kt b/src/net/torvald/terrarum/console/Authenticator.kt index fb272f874..b63c375c3 100644 --- a/src/net/torvald/terrarum/console/Authenticator.kt +++ b/src/net/torvald/terrarum/console/Authenticator.kt @@ -22,7 +22,7 @@ class Authenticator : ConsoleCommand { Echo().execute(msg) println("[Authenticator] " + msg) a = !a - (Terrarum.game.consoleHandler.UI as ConsoleWindow).reset() + (Terrarum.ingame.consoleHandler.UI as ConsoleWindow).reset() } else { printUsage() // thou shalt not pass! diff --git a/src/net/torvald/terrarum/console/CodexEdictis.kt b/src/net/torvald/terrarum/console/CodexEdictis.kt index 5dbc94fef..df13052ef 100644 --- a/src/net/torvald/terrarum/console/CodexEdictis.kt +++ b/src/net/torvald/terrarum/console/CodexEdictis.kt @@ -1,6 +1,6 @@ package net.torvald.terrarum.console -import net.torvald.terrarum.StateGame +import net.torvald.terrarum.StateInGame import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.ui.ConsoleWindow diff --git a/src/net/torvald/terrarum/console/CommandDict.kt b/src/net/torvald/terrarum/console/CommandDict.kt index 2b3b80e47..259a6df5b 100644 --- a/src/net/torvald/terrarum/console/CommandDict.kt +++ b/src/net/torvald/terrarum/console/CommandDict.kt @@ -29,7 +29,7 @@ object CommandDict { Pair("exportav", ExportAV()), Pair("setgl", SetGlobalLightLevel()), Pair("getfaction", GetFactioning()), - Pair("auth", Terrarum.game.auth), + Pair("auth", Terrarum.ingame.auth), Pair("spawnball", SpawnPhysTestBall()), Pair("batch", Batch()), Pair("settime", SetTime()), diff --git a/src/net/torvald/terrarum/console/CommandInterpreter.kt b/src/net/torvald/terrarum/console/CommandInterpreter.kt index 6e6d6056c..78a73bdd9 100644 --- a/src/net/torvald/terrarum/console/CommandInterpreter.kt +++ b/src/net/torvald/terrarum/console/CommandInterpreter.kt @@ -43,7 +43,7 @@ object CommandInterpreter { commandObj = CommandDict.getCommand(single_command.name.toLowerCase()) } else { - if (Terrarum.game.auth.b()) { + if (Terrarum.ingame.auth.b()) { commandObj = CommandDict.getCommand( single_command.name.toLowerCase()) } diff --git a/src/net/torvald/terrarum/console/Echo.kt b/src/net/torvald/terrarum/console/Echo.kt index c2e78ed72..8a7a40ab8 100644 --- a/src/net/torvald/terrarum/console/Echo.kt +++ b/src/net/torvald/terrarum/console/Echo.kt @@ -19,13 +19,13 @@ internal class Echo : ConsoleCommand { val sb = StringBuilder() for (ch in single_line) { if (ch == '\n') { - (Terrarum.game.consoleHandler.UI as ConsoleWindow).sendMessage(sb.toString()) + (Terrarum.ingame.consoleHandler.UI as ConsoleWindow).sendMessage(sb.toString()) sb.delete(0, sb.length - 1) } else sb.append(ch) } - (Terrarum.game.consoleHandler.UI as ConsoleWindow).sendMessage(sb.toString()) + (Terrarum.ingame.consoleHandler.UI as ConsoleWindow).sendMessage(sb.toString()) } override fun printUsage() { diff --git a/src/net/torvald/terrarum/console/Error.kt b/src/net/torvald/terrarum/console/Error.kt index 38c1820d2..d75f7f68b 100644 --- a/src/net/torvald/terrarum/console/Error.kt +++ b/src/net/torvald/terrarum/console/Error.kt @@ -14,7 +14,7 @@ class Error : ConsoleCommand { } fun execute(single_line: String) { - (Terrarum.game.consoleHandler.UI as ConsoleWindow).sendMessage("${GameFontBase.colToCode["r"]}$single_line") + (Terrarum.ingame.consoleHandler.UI as ConsoleWindow).sendMessage("${GameFontBase.colToCode["r"]}$single_line") } override fun printUsage() { diff --git a/src/net/torvald/terrarum/console/ExportAV.kt b/src/net/torvald/terrarum/console/ExportAV.kt index 73100ed57..00241431a 100644 --- a/src/net/torvald/terrarum/console/ExportAV.kt +++ b/src/net/torvald/terrarum/console/ExportAV.kt @@ -13,7 +13,7 @@ class ExportAV : ConsoleCommand { if (args.size == 2) { try { JsonWriter.writeToFile( - Terrarum.game.player.actorValue, + Terrarum.ingame.player.actorValue, Terrarum.defaultDir + "/Exports/" + args[1] + ".json") Echo().execute("ExportAV: exported to " + args[1] + ".json") diff --git a/src/net/torvald/terrarum/console/ExportMap.kt b/src/net/torvald/terrarum/console/ExportMap.kt index 24e1644ca..644a42ec2 100644 --- a/src/net/torvald/terrarum/console/ExportMap.kt +++ b/src/net/torvald/terrarum/console/ExportMap.kt @@ -22,10 +22,10 @@ class ExportMap : ConsoleCommand { if (args.size == 2) { buildColorTable() - var mapData = ByteArray(Terrarum.game.map.width * Terrarum.game.map.height * 3) + var mapData = ByteArray(Terrarum.ingame.map.width * Terrarum.ingame.map.height * 3) var mapDataPointer = 0 - for (tile in Terrarum.game.map.terrainIterator()) { + for (tile in Terrarum.ingame.map.terrainIterator()) { val colArray = (colorTable as Map) .getOrElse(tile, { Col4096(0xFFF) }).toByteArray() @@ -44,7 +44,7 @@ class ExportMap : ConsoleCommand { try { RasterWriter.writePNG_RGB( - Terrarum.game.map.width, Terrarum.game.map.height, mapData, dir + args[1] + ".png") + Terrarum.ingame.map.width, Terrarum.ingame.map.height, mapData, dir + args[1] + ".png") Echo().execute("ExportMap: exported to " + args[1] + ".png") } diff --git a/src/net/torvald/terrarum/console/GetAV.kt b/src/net/torvald/terrarum/console/GetAV.kt index 295a1ec5b..8160ccc73 100644 --- a/src/net/torvald/terrarum/console/GetAV.kt +++ b/src/net/torvald/terrarum/console/GetAV.kt @@ -23,7 +23,7 @@ class GetAV : ConsoleCommand { try { if (args.size == 1) { // print all actorvalue of player - val av = Terrarum.game.player.actorValue + val av = Terrarum.ingame.player.actorValue val keyset = av.keySet echo.execute("$ccW== ActorValue list for ${ccY}player $ccW==") @@ -41,19 +41,19 @@ class GetAV : ConsoleCommand { if (!args[1].isNum()) { // args[1] is ActorValue name echo.execute("${ccW}player.$ccM${args[1]} $ccW= " + ccG + - Terrarum.game.player.actorValue[args[1]] + + Terrarum.ingame.player.actorValue[args[1]] + " $ccO" + - Terrarum.game.player.actorValue[args[1]]!!.javaClass.simpleName + Terrarum.ingame.player.actorValue[args[1]]!!.javaClass.simpleName ) println("[GetAV] player.${args[1]} = " + - Terrarum.game.player.actorValue[args[1]] + + Terrarum.ingame.player.actorValue[args[1]] + " " + - Terrarum.game.player.actorValue[args[1]]!!.javaClass.simpleName + Terrarum.ingame.player.actorValue[args[1]]!!.javaClass.simpleName ) } else { // args[1] is actor ID - val actor = Terrarum.game.getActorByID(args[1].toInt()) + val actor = Terrarum.ingame.getActorByID(args[1].toInt()) val av = actor.actorValue val keyset = av.keySet @@ -75,14 +75,14 @@ class GetAV : ConsoleCommand { val id = args[1].toInt() val av = args[2] echo.execute("$ccW$id.$ccM$av $ccW= $ccG" + - Terrarum.game.getActorByID(id).actorValue[av] + + Terrarum.ingame.getActorByID(id).actorValue[av] + " $ccO" + - Terrarum.game.getActorByID(id).actorValue[av]!!.javaClass.simpleName + Terrarum.ingame.getActorByID(id).actorValue[av]!!.javaClass.simpleName ) println("id.av = " + - Terrarum.game.getActorByID(id).actorValue[av] + + Terrarum.ingame.getActorByID(id).actorValue[av] + " " + - Terrarum.game.getActorByID(id).actorValue[av]!!.javaClass.simpleName + Terrarum.ingame.getActorByID(id).actorValue[av]!!.javaClass.simpleName ) } } diff --git a/src/net/torvald/terrarum/console/GetFactioning.kt b/src/net/torvald/terrarum/console/GetFactioning.kt index 32b64b484..61b957dd6 100644 --- a/src/net/torvald/terrarum/console/GetFactioning.kt +++ b/src/net/torvald/terrarum/console/GetFactioning.kt @@ -25,7 +25,7 @@ class GetFactioning : ConsoleCommand { val error = Error() fun printOutFactioning(id: Int) { - val a = Terrarum.game.getActorByID(id) + val a = Terrarum.ingame.getActorByID(id) if (a is Factionable) { echo.execute("$ccW== Faction assignment for $ccY${if (id == Player.PLAYER_REF_ID) "player" else id.toString()} $ccW==") println("[GetFactioning] == Faction assignment for '${if (id == Player.PLAYER_REF_ID) "player" else id.toString()}' ==") diff --git a/src/net/torvald/terrarum/console/GetTime.kt b/src/net/torvald/terrarum/console/GetTime.kt index 876f749d0..41ad3a0eb 100644 --- a/src/net/torvald/terrarum/console/GetTime.kt +++ b/src/net/torvald/terrarum/console/GetTime.kt @@ -8,7 +8,7 @@ import net.torvald.terrarum.Terrarum class GetTime : ConsoleCommand { override fun execute(args: Array) { val echo = Echo() - val worldTime = Terrarum.game.map.worldTime + val worldTime = Terrarum.ingame.map.worldTime echo.execute("Year ${worldTime.years}, Month ${worldTime.months}, " + "Day ${worldTime.days} (${worldTime.getDayNameShort()}), " + "${worldTime.getFormattedTime()}" diff --git a/src/net/torvald/terrarum/console/GsonTest.kt b/src/net/torvald/terrarum/console/GsonTest.kt index 30be0adf0..90fc817ad 100644 --- a/src/net/torvald/terrarum/console/GsonTest.kt +++ b/src/net/torvald/terrarum/console/GsonTest.kt @@ -14,7 +14,7 @@ import java.io.IOException class GsonTest : ConsoleCommand { override fun execute(args: Array) { if (args.size == 2) { - val avelem = Gson().toJsonTree(Terrarum.game.player) + val avelem = Gson().toJsonTree(Terrarum.ingame.player) val jsonString = avelem.toString() diff --git a/src/net/torvald/terrarum/console/Seed.kt b/src/net/torvald/terrarum/console/Seed.kt index 12f508375..16129563b 100644 --- a/src/net/torvald/terrarum/console/Seed.kt +++ b/src/net/torvald/terrarum/console/Seed.kt @@ -13,7 +13,7 @@ class Seed : ConsoleCommand { // tsalagi override fun execute(args: Array) { - Echo().execute("${ccY}Map$ccW: $ccG${Terrarum.game.map.generatorSeed}") + Echo().execute("${ccY}Map$ccW: $ccG${Terrarum.ingame.map.generatorSeed}") // TODO display randomiser seed } diff --git a/src/net/torvald/terrarum/console/SetAV.kt b/src/net/torvald/terrarum/console/SetAV.kt index 9d04eb3c7..c2e44be33 100644 --- a/src/net/torvald/terrarum/console/SetAV.kt +++ b/src/net/torvald/terrarum/console/SetAV.kt @@ -1,7 +1,7 @@ package net.torvald.terrarum.console import net.torvald.imagefont.GameFontBase -import net.torvald.terrarum.StateGame +import net.torvald.terrarum.StateInGame import net.torvald.terrarum.Terrarum /** @@ -70,7 +70,7 @@ internal class SetAV : ConsoleCommand { return } - Terrarum.game.player.actorValue[args[1]] = `val` + Terrarum.ingame.player.actorValue[args[1]] = `val` echo.execute("${ccW}Set $ccM${args[1]} ${ccW}for ${ccY}player ${ccW}to $ccG$`val`") println("[SetAV] set ActorValue '${args[1]}' for player to '$`val`'.") } @@ -78,7 +78,7 @@ internal class SetAV : ConsoleCommand { try { val id = args[1].toInt() val `val` = parseAVInput(args[3]) - val actor = Terrarum.game.getActorByID(id) + val actor = Terrarum.ingame.getActorByID(id) // check if av is number if (args[2].isNum()) { diff --git a/src/net/torvald/terrarum/console/SetBulletin.kt b/src/net/torvald/terrarum/console/SetBulletin.kt index c6d8d2d76..0ba147190 100644 --- a/src/net/torvald/terrarum/console/SetBulletin.kt +++ b/src/net/torvald/terrarum/console/SetBulletin.kt @@ -25,7 +25,7 @@ class SetBulletin : ConsoleCommand { * @param message real message */ fun send(message: Array) { - Terrarum.game.sendNotification(message) + Terrarum.ingame.sendNotification(message) println("sent notifinator") } } diff --git a/src/net/torvald/terrarum/console/SetGlobalLightLevel.kt b/src/net/torvald/terrarum/console/SetGlobalLightLevel.kt index 876737413..b6d4f7405 100644 --- a/src/net/torvald/terrarum/console/SetGlobalLightLevel.kt +++ b/src/net/torvald/terrarum/console/SetGlobalLightLevel.kt @@ -15,7 +15,7 @@ class SetGlobalLightLevel : ConsoleCommand { val b = args[3].toInt() val GL = LightmapRenderer.constructRGBFromInt(r, g, b) - Terrarum.game.map.globalLight = GL + Terrarum.ingame.map.globalLight = GL } catch (e: NumberFormatException) { Echo().execute("Wrong number input.") @@ -33,7 +33,7 @@ class SetGlobalLightLevel : ConsoleCommand { Echo().execute("Range: 0-" + (LightmapRenderer.COLOUR_RANGE_SIZE - 1)) } else { - Terrarum.game.map.globalLight = GL + Terrarum.ingame.map.globalLight = GL } } catch (e: NumberFormatException) { diff --git a/src/net/torvald/terrarum/console/SetTime.kt b/src/net/torvald/terrarum/console/SetTime.kt index 2ce141601..617801f91 100644 --- a/src/net/torvald/terrarum/console/SetTime.kt +++ b/src/net/torvald/terrarum/console/SetTime.kt @@ -11,10 +11,10 @@ class SetTime : ConsoleCommand { if (args.size == 2) { val timeToSet = WorldTime.parseTime(args[1]) - Terrarum.game.map.worldTime.setTime(timeToSet) + Terrarum.ingame.map.worldTime.setTime(timeToSet) - Echo().execute("Set time to ${Terrarum.game.map.worldTime.elapsedSeconds()} " + - "(${Terrarum.game.map.worldTime.hours}h${formatMin(Terrarum.game.map.worldTime.minutes)})") + Echo().execute("Set time to ${Terrarum.ingame.map.worldTime.elapsedSeconds()} " + + "(${Terrarum.ingame.map.worldTime.hours}h${formatMin(Terrarum.ingame.map.worldTime.minutes)})") } else { printUsage() diff --git a/src/net/torvald/terrarum/console/SetTimeDelta.kt b/src/net/torvald/terrarum/console/SetTimeDelta.kt index ca5db408d..1a74ecb32 100644 --- a/src/net/torvald/terrarum/console/SetTimeDelta.kt +++ b/src/net/torvald/terrarum/console/SetTimeDelta.kt @@ -14,11 +14,11 @@ class SetTimeDelta : ConsoleCommand { if (args[1].toInt() > HARD_LIMIT) Error().execute("Delta too large -- acceptable delta is 0-60.") - Terrarum.game.map.worldTime.setTimeDelta(args[1].toInt()) - if (Terrarum.game.map.worldTime.timeDelta == 0) + Terrarum.ingame.map.worldTime.setTimeDelta(args[1].toInt()) + if (Terrarum.ingame.map.worldTime.timeDelta == 0) Echo().execute("時間よ止まれ!ザ・ワルド!!") else - Echo().execute("Set time delta to ${Terrarum.game.map.worldTime.timeDelta}") + Echo().execute("Set time delta to ${Terrarum.ingame.map.worldTime.timeDelta}") } else { printUsage() diff --git a/src/net/torvald/terrarum/console/SpawnPhysTestBall.kt b/src/net/torvald/terrarum/console/SpawnPhysTestBall.kt index e2973e73d..a76c8737f 100644 --- a/src/net/torvald/terrarum/console/SpawnPhysTestBall.kt +++ b/src/net/torvald/terrarum/console/SpawnPhysTestBall.kt @@ -25,7 +25,7 @@ class SpawnPhysTestBall : ConsoleCommand { ) ball.elasticity = elasticity - Terrarum.game.addActor(ball) + Terrarum.ingame.addActor(ball) } else { printUsage() diff --git a/src/net/torvald/terrarum/console/TeleportPlayer.kt b/src/net/torvald/terrarum/console/TeleportPlayer.kt index a97f43c08..a62cb333a 100644 --- a/src/net/torvald/terrarum/console/TeleportPlayer.kt +++ b/src/net/torvald/terrarum/console/TeleportPlayer.kt @@ -1,6 +1,6 @@ package net.torvald.terrarum.console -import net.torvald.terrarum.StateGame +import net.torvald.terrarum.StateInGame import net.torvald.terrarum.mapdrawer.MapDrawer import net.torvald.terrarum.Terrarum @@ -26,7 +26,7 @@ class TeleportPlayer : ConsoleCommand { return } - Terrarum.game.player.setPosition(x.toDouble(), y.toDouble()) + Terrarum.ingame.player.setPosition(x.toDouble(), y.toDouble()) } } diff --git a/src/net/torvald/terrarum/console/ToggleNoClip.kt b/src/net/torvald/terrarum/console/ToggleNoClip.kt index c81ecae8b..b21ec788f 100644 --- a/src/net/torvald/terrarum/console/ToggleNoClip.kt +++ b/src/net/torvald/terrarum/console/ToggleNoClip.kt @@ -1,6 +1,6 @@ package net.torvald.terrarum.console -import net.torvald.terrarum.StateGame +import net.torvald.terrarum.StateInGame import net.torvald.terrarum.Terrarum /** @@ -8,9 +8,9 @@ import net.torvald.terrarum.Terrarum */ class ToggleNoClip : ConsoleCommand { override fun execute(args: Array) { - val status = Terrarum.game.player.isNoClip() + val status = Terrarum.ingame.player.isNoClip() - Terrarum.game.player.setNoClip(!status) + Terrarum.ingame.player.setNoClip(!status) Echo().execute("Set no-clip status to " + (!status).toString()) } diff --git a/src/net/torvald/terrarum/console/Zoom.kt b/src/net/torvald/terrarum/console/Zoom.kt index 47e482e18..a23b65c51 100644 --- a/src/net/torvald/terrarum/console/Zoom.kt +++ b/src/net/torvald/terrarum/console/Zoom.kt @@ -18,14 +18,14 @@ class Zoom : ConsoleCommand { return } - if (zoom < Terrarum.game.ZOOM_MIN) { - zoom = Terrarum.game.ZOOM_MIN + if (zoom < Terrarum.ingame.ZOOM_MIN) { + zoom = Terrarum.ingame.ZOOM_MIN } - else if (zoom > Terrarum.game.ZOOM_MAX) { - zoom = Terrarum.game.ZOOM_MAX + else if (zoom > Terrarum.ingame.ZOOM_MAX) { + zoom = Terrarum.ingame.ZOOM_MAX } - Terrarum.game.screenZoom = zoom + Terrarum.ingame.screenZoom = zoom System.gc() diff --git a/src/net/torvald/terrarum/gameactors/Actor.kt b/src/net/torvald/terrarum/gameactors/Actor.kt index 64e2141d5..1b4916951 100644 --- a/src/net/torvald/terrarum/gameactors/Actor.kt +++ b/src/net/torvald/terrarum/gameactors/Actor.kt @@ -40,7 +40,7 @@ abstract class Actor : Comparable, Runnable { var ret: Int do { ret = HQRNG().nextInt().and(0x7FFFFFFF) // set new ID - } while (Terrarum.game.hasActor(ret) || ret < ItemPropCodex.ITEM_UNIQUE_MAX) // check for collision + } while (Terrarum.ingame.hasActor(ret) || ret < ItemPropCodex.ITEM_UNIQUE_MAX) // check for collision return ret } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt index 607de530c..e8f3b9368 100644 --- a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt +++ b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt @@ -24,7 +24,7 @@ open class ActorWithBody : Actor(), Visible { @Transient var sprite: SpriteAnimation? = null @Transient var spriteGlow: SpriteAnimation? = null - @Transient private val map: GameMap = Terrarum.game.map + @Transient private val map: GameMap = Terrarum.ingame.map var hitboxTranslateX: Double = 0.0// relative to spritePosX var hitboxTranslateY: Double = 0.0// relative to spritePosY @@ -234,7 +234,7 @@ open class ActorWithBody : Actor(), Visible { baseHitboxH * scale) } - override fun run() = update(Terrarum.appgc, Terrarum.game.UPDATE_DELTA) + override fun run() = update(Terrarum.appgc, Terrarum.ingame.UPDATE_DELTA) /** * Add vector value to the velocity, in the time unit of single frame. @@ -929,8 +929,8 @@ open class ActorWithBody : Actor(), Visible { private fun div16TruncateToMapWidth(x: Int): Int { if (x < 0) return 0 - else if (x >= Terrarum.game.map.width shl 4) - return Terrarum.game.map.width - 1 + else if (x >= Terrarum.ingame.map.width shl 4) + return Terrarum.ingame.map.width - 1 else return x and 0x7FFFFFFF shr 4 } @@ -938,8 +938,8 @@ open class ActorWithBody : Actor(), Visible { private fun div16TruncateToMapHeight(y: Int): Int { if (y < 0) return 0 - else if (y >= Terrarum.game.map.height shl 4) - return Terrarum.game.map.height - 1 + else if (y >= Terrarum.ingame.map.height shl 4) + return Terrarum.ingame.map.height - 1 else return y and 0x7FFFFFFF shr 4 } diff --git a/src/net/torvald/terrarum/gameactors/NPCIntelligentBase.kt b/src/net/torvald/terrarum/gameactors/NPCIntelligentBase.kt index 3afef06c9..e15cf3222 100644 --- a/src/net/torvald/terrarum/gameactors/NPCIntelligentBase.kt +++ b/src/net/torvald/terrarum/gameactors/NPCIntelligentBase.kt @@ -75,11 +75,11 @@ open class NPCIntelligentBase : ActorWithBody() } override fun addHouseTile(x: Int, y: Int) { - houseTiles.add(Terrarum.game.map.width * y + x) + houseTiles.add(Terrarum.ingame.map.width * y + x) } override fun removeHouseTile(x: Int, y: Int) { - houseTiles.remove(Terrarum.game.map.width * y + x) + houseTiles.remove(Terrarum.ingame.map.width * y + x) } override fun clearHouseDesignation() { diff --git a/src/net/torvald/terrarum/gameactors/ThreadActorUpdate.kt b/src/net/torvald/terrarum/gameactors/ThreadActorUpdate.kt index 7d120e22b..ff1f61285 100644 --- a/src/net/torvald/terrarum/gameactors/ThreadActorUpdate.kt +++ b/src/net/torvald/terrarum/gameactors/ThreadActorUpdate.kt @@ -10,6 +10,6 @@ class ThreadActorUpdate(val startIndex: Int, val endIndex: Int, val gc: GameContainer, val delta: Int) : Runnable { override fun run() { for (i in startIndex..endIndex) - Terrarum.game.actorContainer[i].update(gc, delta) + Terrarum.ingame.actorContainer[i].update(gc, delta) } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/gameactors/physicssolver/CollisionSolver.kt b/src/net/torvald/terrarum/gameactors/physicssolver/CollisionSolver.kt index bd440211e..6e5398834 100644 --- a/src/net/torvald/terrarum/gameactors/physicssolver/CollisionSolver.kt +++ b/src/net/torvald/terrarum/gameactors/physicssolver/CollisionSolver.kt @@ -39,7 +39,7 @@ object CollisionSolver { collCandidateY.clear() // mark list x - Terrarum.game.actorContainer.forEach { it -> + Terrarum.ingame.actorContainer.forEach { it -> if (it is ActorWithBody) { collListX.add(CollisionMarkings(it.hitbox.hitboxStart.x, STARTPOINT, it)) collListX.add(CollisionMarkings(it.hitbox.hitboxEnd.x, ENDPOINT, it)) @@ -68,7 +68,7 @@ object CollisionSolver { collCandidateStack.clear() // mark list y - Terrarum.game.actorContainer.forEach { it -> + Terrarum.ingame.actorContainer.forEach { it -> if (it is ActorWithBody) { collListY.add(CollisionMarkings(it.hitbox.hitboxStart.y, STARTPOINT, it)) collListY.add(CollisionMarkings(it.hitbox.hitboxEnd.y, ENDPOINT, it)) diff --git a/src/net/torvald/terrarum/gamecontroller/GameController.kt b/src/net/torvald/terrarum/gamecontroller/GameController.kt index 94705e3f5..992e3800a 100644 --- a/src/net/torvald/terrarum/gamecontroller/GameController.kt +++ b/src/net/torvald/terrarum/gamecontroller/GameController.kt @@ -16,33 +16,33 @@ import org.newdawn.slick.Input object GameController { fun processInput(input: Input) { - val mouseTileX = ((MapCamera.cameraX + input.mouseX / Terrarum.game.screenZoom) / MapDrawer.TILE_SIZE).toInt() - val mouseTileY = ((MapCamera.cameraY + input.mouseY / Terrarum.game.screenZoom) / MapDrawer.TILE_SIZE).toInt() + val mouseTileX = ((MapCamera.cameraX + input.mouseX / Terrarum.ingame.screenZoom) / MapDrawer.TILE_SIZE).toInt() + val mouseTileY = ((MapCamera.cameraY + input.mouseY / Terrarum.ingame.screenZoom) / MapDrawer.TILE_SIZE).toInt() KeyToggler.update(input) - if (!Terrarum.game.consoleHandler.isTakingControl) { - if (Terrarum.game.player.vehicleRiding != null) { - Terrarum.game.player.vehicleRiding!!.processInput(input) + if (!Terrarum.ingame.consoleHandler.isTakingControl) { + if (Terrarum.ingame.player.vehicleRiding != null) { + Terrarum.ingame.player.vehicleRiding!!.processInput(input) } - Terrarum.game.player.processInput(input) + Terrarum.ingame.player.processInput(input) - for (ui in Terrarum.game.uiContainer) { + for (ui in Terrarum.ingame.uiContainer) { ui.processInput(input) } } else { - Terrarum.game.consoleHandler.processInput(input) + Terrarum.ingame.consoleHandler.processInput(input) } if (input.isMouseButtonDown(Input.MOUSE_LEFT_BUTTON)) { // test tile remove try { - Terrarum.game.map.setTileTerrain(mouseTileX, mouseTileY, TileNameCode.AIR) + Terrarum.ingame.map.setTileTerrain(mouseTileX, mouseTileY, TileNameCode.AIR) // terrarum.game.map.setTileWall(mouseTileX, mouseTileY, TileNameCode.AIR); } catch (e: ArrayIndexOutOfBoundsException) { @@ -52,7 +52,7 @@ object GameController { else if (input.isMouseButtonDown(Input.MOUSE_RIGHT_BUTTON)) { // test tile place try { - Terrarum.game.map.setTileTerrain(mouseTileX, mouseTileY, Terrarum.game.player.actorValue.getAsInt("selectedtile")!!) + Terrarum.ingame.map.setTileTerrain(mouseTileX, mouseTileY, Terrarum.ingame.player.actorValue.getAsInt("selectedtile")!!) } catch (e: ArrayIndexOutOfBoundsException) { } @@ -62,23 +62,23 @@ object GameController { fun keyPressed(key: Int, c: Char) { if (keyPressedByCode(key, EnumKeyFunc.UI_CONSOLE)) { - Terrarum.game.consoleHandler.toggleOpening() + Terrarum.ingame.consoleHandler.toggleOpening() } else if (keyPressedByCode(key, EnumKeyFunc.UI_BASIC_INFO)) { - Terrarum.game.debugWindow.toggleOpening() + Terrarum.ingame.debugWindow.toggleOpening() } - if (!Terrarum.game.consoleHandler.isTakingControl) { - if (Terrarum.game.player.vehicleRiding != null) { - Terrarum.game.player.vehicleRiding!!.keyPressed(key, c) + if (!Terrarum.ingame.consoleHandler.isTakingControl) { + if (Terrarum.ingame.player.vehicleRiding != null) { + Terrarum.ingame.player.vehicleRiding!!.keyPressed(key, c) } - Terrarum.game.player.keyPressed(key, c) + Terrarum.ingame.player.keyPressed(key, c) } else { - Terrarum.game.consoleHandler.keyPressed(key, c) + Terrarum.ingame.consoleHandler.keyPressed(key, c) } //System.out.println(String.valueOf(key) + ", " + String.valueOf(c)); diff --git a/src/net/torvald/terrarum/itemproperties/ItemPropCodex.kt b/src/net/torvald/terrarum/itemproperties/ItemPropCodex.kt index 20b3faa01..1fbcbc663 100644 --- a/src/net/torvald/terrarum/itemproperties/ItemPropCodex.kt +++ b/src/net/torvald/terrarum/itemproperties/ItemPropCodex.kt @@ -32,7 +32,7 @@ object ItemPropCodex { if (code < ITEM_UNIQUE_MAX) // generic item return itemCodex[code] else { - val a = Terrarum.game.getActorByID(code) // actor item + val a = Terrarum.ingame.getActorByID(code) // actor item if (a is CanBeAnItem) return a.itemData throw IllegalArgumentException("Attempted to get item data of actor that cannot be an item. ($a)") diff --git a/src/net/torvald/terrarum/mapdrawer/LightmapRenderer.kt b/src/net/torvald/terrarum/mapdrawer/LightmapRenderer.kt index 9baf58fc1..a878cdcb7 100644 --- a/src/net/torvald/terrarum/mapdrawer/LightmapRenderer.kt +++ b/src/net/torvald/terrarum/mapdrawer/LightmapRenderer.kt @@ -20,16 +20,16 @@ object LightmapRenderer { val overscan_open: Int = Math.min(32, 256f.div(TilePropCodex.getProp(TileNameCode.AIR).opacity and 0xFF).toFloat().ceil()) val overscan_opaque: Int = Math.min(8, 256f.div(TilePropCodex.getProp(TileNameCode.STONE).opacity and 0xFF).toFloat().ceil()) - private val LIGHTMAP_WIDTH = Terrarum.game.ZOOM_MIN.inv().times(Terrarum.WIDTH) + private val LIGHTMAP_WIDTH = Terrarum.ingame.ZOOM_MIN.inv().times(Terrarum.WIDTH) .div(MapDrawer.TILE_SIZE).ceil() + overscan_open * 2 + 3 - private val LIGHTMAP_HEIGHT = Terrarum.game.ZOOM_MIN.inv().times(Terrarum.HEIGHT) + private val LIGHTMAP_HEIGHT = Terrarum.ingame.ZOOM_MIN.inv().times(Terrarum.HEIGHT) .div(MapDrawer.TILE_SIZE).ceil() + overscan_open * 2 + 3 /** * 8-Bit RGB values */ private val lightmap: Array = Array(LIGHTMAP_HEIGHT) { IntArray(LIGHTMAP_WIDTH) } - private val lanternMap = ArrayList(Terrarum.game.ACTORCONTAINER_INITIAL_SIZE * 4) + private val lanternMap = ArrayList(Terrarum.ingame.ACTORCONTAINER_INITIAL_SIZE * 4) private val AIR = TileNameCode.AIR @@ -171,7 +171,7 @@ object LightmapRenderer { // scan for luminous actors and store their lighting info to the lanterns lanternMap.clear() - Terrarum.game.actorContainer.forEach { it -> + Terrarum.ingame.actorContainer.forEach { it -> if (it is Luminous && it is Visible) { // put lanterns to the area the luminantBox is occupying for (lightBox in it.lightBoxList) { @@ -228,11 +228,11 @@ object LightmapRenderer { private fun calculate(x: Int, y: Int, doNotCalculateAmbient: Boolean): Int { var lightLevelThis: Int = 0 - val thisTerrain = Terrarum.game.map.getTileFromTerrain(x, y) - val thisWall = Terrarum.game.map.getTileFromWall(x, y) + val thisTerrain = Terrarum.ingame.map.getTileFromTerrain(x, y) + val thisWall = Terrarum.ingame.map.getTileFromWall(x, y) val thisTileLuminosity = TilePropCodex.getProp(thisTerrain).luminosity val thisTileOpacity = TilePropCodex.getProp(thisTerrain).opacity - val sunLight = Terrarum.game.map.globalLight + val sunLight = Terrarum.ingame.map.globalLight // MIX TILE // open air @@ -315,8 +315,8 @@ object LightmapRenderer { var x = this_x_start while (x < this_x_end) { // smoothing enabled - if (Terrarum.game.screenZoom >= 1 - && Terrarum.gameConfig.getAsBoolean("smoothlighting") ?: false) { + if (Terrarum.ingame.screenZoom >= 1 + && Terrarum.gameConfig.getAsBoolean("smoothlighting") ?: false) { val thisLightLevel = getLight(x, y) ?: 0 @@ -333,10 +333,10 @@ object LightmapRenderer { g.color = Color(0) g.fillRect( - (x.toFloat() * TSIZE.toFloat() * Terrarum.game.screenZoom).round().toFloat(), - (y.toFloat() * TSIZE.toFloat() * Terrarum.game.screenZoom).round().toFloat(), - ((TSIZE * Terrarum.game.screenZoom).ceil() * zeroLevelCounter).toFloat(), - (TSIZE * Terrarum.game.screenZoom).ceil().toFloat() + (x.toFloat() * TSIZE.toFloat() * Terrarum.ingame.screenZoom).round().toFloat(), + (y.toFloat() * TSIZE.toFloat() * Terrarum.ingame.screenZoom).round().toFloat(), + ((TSIZE * Terrarum.ingame.screenZoom).ceil() * zeroLevelCounter).toFloat(), + (TSIZE * Terrarum.ingame.screenZoom).ceil().toFloat() ) x += zeroLevelCounter - 1 @@ -382,12 +382,12 @@ object LightmapRenderer { g.color = Color(colourMapItoL[iy * 2 + ix].rgb30ClampTo24()) g.fillRect( - (x.toFloat() * TSIZE.toFloat() * Terrarum.game.screenZoom).round() - + ix * TSIZE / 2 * Terrarum.game.screenZoom, - (y.toFloat() * TSIZE.toFloat() * Terrarum.game.screenZoom).round() - + iy * TSIZE / 2 * Terrarum.game.screenZoom, - (TSIZE * Terrarum.game.screenZoom / 2).ceil().toFloat(), - (TSIZE * Terrarum.game.screenZoom / 2).ceil().toFloat() + (x.toFloat() * TSIZE.toFloat() * Terrarum.ingame.screenZoom).round() + + ix * TSIZE / 2 * Terrarum.ingame.screenZoom, + (y.toFloat() * TSIZE.toFloat() * Terrarum.ingame.screenZoom).round() + + iy * TSIZE / 2 * Terrarum.ingame.screenZoom, + (TSIZE * Terrarum.ingame.screenZoom / 2).ceil().toFloat(), + (TSIZE * Terrarum.ingame.screenZoom / 2).ceil().toFloat() ) } } @@ -408,10 +408,10 @@ object LightmapRenderer { g.color = Color((getLight(x, y) ?: 0).rgb30ClampTo24()) g.fillRect( - (x.toFloat() * TSIZE.toFloat() * Terrarum.game.screenZoom).round().toFloat(), - (y.toFloat() * TSIZE.toFloat() * Terrarum.game.screenZoom).round().toFloat(), - ((TSIZE * Terrarum.game.screenZoom).ceil() * sameLevelCounter).toFloat(), - (TSIZE * Terrarum.game.screenZoom).ceil().toFloat() + (x.toFloat() * TSIZE.toFloat() * Terrarum.ingame.screenZoom).round().toFloat(), + (y.toFloat() * TSIZE.toFloat() * Terrarum.ingame.screenZoom).round().toFloat(), + ((TSIZE * Terrarum.ingame.screenZoom).ceil() * sameLevelCounter).toFloat(), + (TSIZE * Terrarum.ingame.screenZoom).ceil().toFloat() ) x += sameLevelCounter - 1 diff --git a/src/net/torvald/terrarum/mapdrawer/MapCamera.kt b/src/net/torvald/terrarum/mapdrawer/MapCamera.kt index d2e1d8b10..30d4a5407 100644 --- a/src/net/torvald/terrarum/mapdrawer/MapCamera.kt +++ b/src/net/torvald/terrarum/mapdrawer/MapCamera.kt @@ -20,7 +20,7 @@ import java.util.* * Created by minjaesong on 16-01-19. */ object MapCamera { - val map: GameMap = Terrarum.game.map; + val map: GameMap = Terrarum.ingame.map; var cameraX = 0 private set @@ -229,10 +229,10 @@ object MapCamera { ) fun update(gc: GameContainer, delta_t: Int) { - val player = Terrarum.game.player + val player = Terrarum.ingame.player - renderWidth = FastMath.ceil(Terrarum.WIDTH / Terrarum.game.screenZoom) // div, not mul - renderHeight = FastMath.ceil(Terrarum.HEIGHT / Terrarum.game.screenZoom) + renderWidth = FastMath.ceil(Terrarum.WIDTH / Terrarum.ingame.screenZoom) // div, not mul + renderHeight = FastMath.ceil(Terrarum.HEIGHT / Terrarum.ingame.screenZoom) // position - (WH / 2) cameraX = Math.round(FastMath.clamp( @@ -425,13 +425,13 @@ object MapCamera { } private fun drawTile(mode: Int, tilewisePosX: Int, tilewisePosY: Int, sheetX: Int, sheetY: Int) { - if (Terrarum.game.screenZoom == 1f) { + if (Terrarum.ingame.screenZoom == 1f) { tilesetBook[mode].renderInUse( FastMath.floor((tilewisePosX * TSIZE).toFloat()), FastMath.floor((tilewisePosY * TSIZE).toFloat()), sheetX, sheetY) } else { tilesetBook[mode].getSprite( sheetX, sheetY).drawEmbedded( - Math.round(tilewisePosX.toFloat() * TSIZE.toFloat() * Terrarum.game.screenZoom).toFloat(), Math.round(tilewisePosY.toFloat() * TSIZE.toFloat() * Terrarum.game.screenZoom).toFloat(), FastMath.ceil(TSIZE * Terrarum.game.screenZoom).toFloat(), FastMath.ceil(TSIZE * Terrarum.game.screenZoom).toFloat()) + Math.round(tilewisePosX.toFloat() * TSIZE.toFloat() * Terrarum.ingame.screenZoom).toFloat(), Math.round(tilewisePosY.toFloat() * TSIZE.toFloat() * Terrarum.ingame.screenZoom).toFloat(), FastMath.ceil(TSIZE * Terrarum.ingame.screenZoom).toFloat(), FastMath.ceil(TSIZE * Terrarum.ingame.screenZoom).toFloat()) } } diff --git a/src/net/torvald/terrarum/mapdrawer/MapDrawer.kt b/src/net/torvald/terrarum/mapdrawer/MapDrawer.kt index 0356aabb9..64c1eb0bd 100644 --- a/src/net/torvald/terrarum/mapdrawer/MapDrawer.kt +++ b/src/net/torvald/terrarum/mapdrawer/MapDrawer.kt @@ -47,7 +47,7 @@ object MapDrawer { val colTemp_cold = colTempLinearFunc(onscreen_cold_tiles / onscreen_tiles_cap) val colTemp_warm = colTempLinearFunc(-(onscreen_warm_tiles / onscreen_tiles_cap)) colTemp = colTemp_warm + colTemp_cold - ENV_COLTEMP_NOON - val zoom = Terrarum.game.screenZoom + val zoom = Terrarum.ingame.screenZoom g.color = getColourFromMap(colTemp) //g.color = getColourFromMap(3022) diff --git a/src/net/torvald/terrarum/realestate/RealEstateUtility.kt b/src/net/torvald/terrarum/realestate/RealEstateUtility.kt index 34176eff1..798497b3a 100644 --- a/src/net/torvald/terrarum/realestate/RealEstateUtility.kt +++ b/src/net/torvald/terrarum/realestate/RealEstateUtility.kt @@ -8,17 +8,17 @@ import net.torvald.terrarum.gameactors.faction.FactionCodex */ object RealEstateUtility { fun getAbsoluteTileNumber(x: Int, y: Int): Long = - (Terrarum.game.map.width * y).toLong() + x + (Terrarum.ingame.map.width * y).toLong() + x fun resolveAbsoluteTileNumber(t: Long): Pair = - Pair((t % Terrarum.game.map.width).toInt(), (t / Terrarum.game.map.width).toInt()) + Pair((t % Terrarum.ingame.map.width).toInt(), (t / Terrarum.ingame.map.width).toInt()) /** * Get owner ID as an Actor/Faction */ fun resolveOwner(id: Long): Any = if (id < 0x80000000L) - Terrarum.game.getActorByID(id.toInt()) + Terrarum.ingame.getActorByID(id.toInt()) else FactionCodex.getFactionByID(id) } \ No newline at end of file diff --git a/src/net/torvald/terrarum/tileproperties/TilePropUtil.kt b/src/net/torvald/terrarum/tileproperties/TilePropUtil.kt index 9d7e80517..f6eca831d 100644 --- a/src/net/torvald/terrarum/tileproperties/TilePropUtil.kt +++ b/src/net/torvald/terrarum/tileproperties/TilePropUtil.kt @@ -92,8 +92,8 @@ object TilePropUtil { fun getDynamicLumFunc(baseLum: Int, type: Int): Int { return when (type) { 1 -> getTorchFlicker(baseLum) - 2 -> Terrarum.game.map.globalLight // current global light - 3 -> Terrarum.game.globalLightByTime(WorldTime.DAY_LENGTH / 2) // daylight at noon + 2 -> Terrarum.ingame.map.globalLight // current global light + 3 -> Terrarum.ingame.globalLightByTime(WorldTime.DAY_LENGTH / 2) // daylight at noon 4 -> getSlowBreath(baseLum) 5 -> getPulsate(baseLum) else -> baseLum diff --git a/src/net/torvald/terrarum/tilestats/TileStats.kt b/src/net/torvald/terrarum/tilestats/TileStats.kt index a15f74762..1f38bf0ee 100644 --- a/src/net/torvald/terrarum/tilestats/TileStats.kt +++ b/src/net/torvald/terrarum/tilestats/TileStats.kt @@ -27,8 +27,8 @@ object TileStats { // Get stats on no-zoomed screen area. In other words, will behave as if screen zoom were 1.0 // no matter how the screen is zoomed. - val map = Terrarum.game.map - val player = Terrarum.game.player + val map = Terrarum.ingame.map + val player = Terrarum.ingame.player val renderWidth = FastMath.ceil(Terrarum.WIDTH.toFloat()) val renderHeight = FastMath.ceil(Terrarum.HEIGHT.toFloat()) diff --git a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt index e257288fb..6a4f5ce72 100644 --- a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt +++ b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt @@ -43,7 +43,7 @@ class BasicDebugInfoWindow:UICanvas { } override fun update(gc: GameContainer, delta: Int) { - val player = Terrarum.game.player + val player = Terrarum.ingame.player val hitbox = player.hitbox xdelta = hitbox.pointedX - prevPlayerX @@ -58,13 +58,13 @@ class BasicDebugInfoWindow:UICanvas { fun Int.rawG() = this % LightmapRenderer.MUL_2 / LightmapRenderer.MUL fun Int.rawB() = this % LightmapRenderer.MUL - val player = Terrarum.game.player + val player = Terrarum.ingame.player val sb = StringBuilder() val formatter = Formatter(sb) - val mouseTileX = ((MapCamera.cameraX + gc.input.mouseX / Terrarum.game.screenZoom) / MapDrawer.TILE_SIZE).toInt() - val mouseTileY = ((MapCamera.cameraY + gc.input.mouseY / Terrarum.game.screenZoom) / MapDrawer.TILE_SIZE).toInt() + val mouseTileX = ((MapCamera.cameraX + gc.input.mouseX / Terrarum.ingame.screenZoom) / MapDrawer.TILE_SIZE).toInt() + val mouseTileY = ((MapCamera.cameraY + gc.input.mouseY / Terrarum.ingame.screenZoom) / MapDrawer.TILE_SIZE).toInt() g.font = Terrarum.smallNumbers g.color = GameFontBase.codeToCol["y"] @@ -114,7 +114,7 @@ class BasicDebugInfoWindow:UICanvas { printLine(g, 7, "light@cursor $ccG$lightVal") val tileNo: String - val tileNumRaw = Terrarum.game.map.getTileFromTerrain(mouseTileX, mouseTileY) ?: -1 + val tileNumRaw = Terrarum.ingame.map.getTileFromTerrain(mouseTileX, mouseTileY) ?: -1 val tilenum = tileNumRaw / PairedMapLayer.RANGE val tiledmg = tileNumRaw % PairedMapLayer.RANGE tileNo = if (tileNumRaw == -1) "—" else "$tilenum:$tiledmg" @@ -127,8 +127,8 @@ class BasicDebugInfoWindow:UICanvas { printLineColumn(g, 2, 1, "VSync $ccG" + Terrarum.appgc.isVSyncRequested) printLineColumn(g, 2, 2, "Env colour temp $ccG" + MapDrawer.getColTemp()) - printLineColumn(g, 2, 5, "Time $ccG${Terrarum.game.map.worldTime.elapsedSeconds()}" + - " (${Terrarum.game.map.worldTime.getFormattedTime()})") + printLineColumn(g, 2, 5, "Time $ccG${Terrarum.ingame.map.worldTime.elapsedSeconds()}" + + " (${Terrarum.ingame.map.worldTime.getFormattedTime()})") printLineColumn(g, 2, 6, "Mass $ccG${player.mass}") drawHistogram(g, LightmapRenderer.histogram, @@ -147,20 +147,20 @@ class BasicDebugInfoWindow:UICanvas { (Terrarum.WIDTH - 2 - 6*8).toFloat(), 10f) g.color = GameFontBase.codeToCol["g"] - g.drawString("${Terrarum.game.memInUse}M", + g.drawString("${Terrarum.ingame.memInUse}M", (Terrarum.WIDTH - 11 * 8 - 2).toFloat(), 2f) - g.drawString("/${Terrarum.game.totalVMMem}M", + g.drawString("/${Terrarum.ingame.totalVMMem}M", (Terrarum.WIDTH - 6 * 8 - 2).toFloat(), 2f) /** * Bottom left */ - g.drawString("${ccY}Actors total $ccG${Terrarum.game.actorContainer.size + Terrarum.game.actorContainerInactive.size}", + g.drawString("${ccY}Actors total $ccG${Terrarum.ingame.actorContainer.size + Terrarum.ingame.actorContainerInactive.size}", 2f, Terrarum.HEIGHT - 10f) - g.drawString("${ccY}Active $ccG${Terrarum.game.actorContainer.size}", + g.drawString("${ccY}Active $ccG${Terrarum.ingame.actorContainer.size}", (2 + 17*8).toFloat(), Terrarum.HEIGHT - 10f) - g.drawString("${ccY}Dormant $ccG${Terrarum.game.actorContainerInactive.size}", + g.drawString("${ccY}Dormant $ccG${Terrarum.ingame.actorContainerInactive.size}", (2 + 28*8).toFloat(), Terrarum.HEIGHT - 10f) } diff --git a/src/net/torvald/terrarum/ui/ConsoleWindow.kt b/src/net/torvald/terrarum/ui/ConsoleWindow.kt index e1ae571af..9cdbc85b8 100644 --- a/src/net/torvald/terrarum/ui/ConsoleWindow.kt +++ b/src/net/torvald/terrarum/ui/ConsoleWindow.kt @@ -151,7 +151,7 @@ class ConsoleWindow : UICanvas, UITypable { prevCommand = "" commandInputPool = StringBuilder() - if (Terrarum.game.auth.b()) sendMessage(Lang["DEV_MESSAGE_CONSOLE_CODEX"]) + if (Terrarum.ingame.auth.b()) sendMessage(Lang["DEV_MESSAGE_CONSOLE_CODEX"]) } override fun doOpening(gc: GameContainer, delta: Int) { diff --git a/src/net/torvald/terrarum/ui/Typesetter.kt b/src/net/torvald/terrarum/ui/Typesetter.kt new file mode 100644 index 000000000..147bdf13d --- /dev/null +++ b/src/net/torvald/terrarum/ui/Typesetter.kt @@ -0,0 +1,15 @@ +package net.torvald.terrarum.ui + +import org.newdawn.slick.Graphics + +/** + * Created by minjaesong on 16-07-06. + */ +object Typesetter { + fun printCentered(string: String, screenPosY: Int, ui: UICanvas, g: Graphics) { + val stringW = g.font.getWidth(string) + val targetW = ui.width + + g.drawString(string, targetW.minus(stringW).ushr(1).toFloat(), screenPosY.toFloat()) + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/ui/UIHandler.kt b/src/net/torvald/terrarum/ui/UIHandler.kt index f1eb4b51f..7296d35c3 100644 --- a/src/net/torvald/terrarum/ui/UIHandler.kt +++ b/src/net/torvald/terrarum/ui/UIHandler.kt @@ -4,8 +4,13 @@ import net.torvald.terrarum.mapdrawer.MapCamera import net.torvald.terrarum.Terrarum import com.jme3.math.FastMath import org.newdawn.slick.* +import org.newdawn.slick.state.StateBasedGame /** + * UIHandler is a handler for UICanvas. It opens/closes the attached UI, moves the "window" (or "canvas") + * to the coordinate of displayed cartesian coords, and update and render the UI. + * It also process game inputs and send control events to the UI so that the UI can handle them. + * * Created by minjaesong on 15-12-31. */ class UIHandler @@ -33,10 +38,15 @@ constructor(val UI: UICanvas) { private var opening = false private var closing = false private var opened = false // fully opened - private var _visible = false - val visible: Boolean + var visible: Boolean = false get() = if (alwaysVisible) true - else _visible + else field + set(value) { + if (alwaysVisible) + throw RuntimeException("[UIHandler] Tried to 'set visibility of' constant UI") + + field = value + } var openCloseCounter = 0 @@ -51,12 +61,12 @@ constructor(val UI: UICanvas) { fun update(gc: GameContainer, delta: Int) { - if (_visible || alwaysVisible) { + if (visible || alwaysVisible) { UI.update(gc, delta) } if (opening) { - _visible = true + visible = true openCloseCounter += delta // println("UI ${UI.javaClass.simpleName} (open)") @@ -87,23 +97,31 @@ constructor(val UI: UICanvas) { UI.endClosing(gc, delta) closing = false opened = false - _visible = false + visible = false openCloseCounter = 0 } } } - fun render(gc: GameContainer, gameGraphicInstance: Graphics) { - if (_visible || alwaysVisible) { + fun render(gc: GameContainer, sbg: StateBasedGame, gameGraphicInstance: Graphics) { + if (visible || alwaysVisible) { UIGraphicInstance.clear() UIGraphicInstance.font = Terrarum.gameFont UI.render(gc, UIGraphicInstance) - gameGraphicInstance.drawImage(UIDrawnCanvas, - posX + MapCamera.cameraX * Terrarum.game.screenZoom, - posY + MapCamera.cameraY * Terrarum.game.screenZoom - )// compensate for screenZoom AND camera translation - // (see Game.render -> g.translate()) + if (sbg.currentStateID == Terrarum.SCENE_ID_GAME) { + gameGraphicInstance.drawImage(UIDrawnCanvas, + posX + MapCamera.cameraX * Terrarum.ingame.screenZoom, + posY + MapCamera.cameraY * Terrarum.ingame.screenZoom + )// compensate for screenZoom AND camera translation + // (see Game.render -> g.translate()) + } + else { + gameGraphicInstance.drawImage(UIDrawnCanvas, + posX.toFloat(), + posY.toFloat() + ) + } } } @@ -112,22 +130,17 @@ constructor(val UI: UICanvas) { posY = y } - fun setVisibility(b: Boolean) { - if (alwaysVisible) { - throw RuntimeException("[UIHandler] Tried to 'set visibility of' constant UI") - } - _visible = b - } - fun setAsAlwaysVisible() { alwaysVisible = true - _visible = true + visible = true opened = true opening = false closing = false } - + /** + * Send OPEN signal to the attached UI. + */ fun setAsOpening() { if (alwaysVisible) { throw RuntimeException("[UIHandler] Tried to 'open' constant UI") @@ -136,6 +149,9 @@ constructor(val UI: UICanvas) { opening = true } + /** + * Send CLOSE signal to the attached UI. + */ fun setAsClosing() { if (alwaysVisible) { throw RuntimeException("[UIHandler] Tried to 'close' constant UI") @@ -148,7 +164,7 @@ constructor(val UI: UICanvas) { if (alwaysVisible) { throw RuntimeException("[UIHandler] Tried to 'toggle opening of' constant UI") } - if (_visible) { + if (visible) { if (!closing) { setAsClosing() } @@ -161,61 +177,61 @@ constructor(val UI: UICanvas) { } fun processInput(input: Input) { - if (_visible) { + if (visible) { UI.processInput(input) } } fun keyPressed(key: Int, c: Char) { - if (_visible && UI is UITypable) { + if (visible && UI is UITypable) { UI.keyPressed(key, c) } } fun keyReleased(key: Int, c: Char) { - if (_visible && UI is UITypable) { + if (visible && UI is UITypable) { UI.keyReleased(key, c) } } fun mouseMoved(oldx: Int, oldy: Int, newx: Int, newy: Int) { - if (_visible && UI is UIClickable) { + if (visible && UI is UIClickable) { UI.mouseMoved(oldx, oldy, newx, newy) } } fun mouseDragged(oldx: Int, oldy: Int, newx: Int, newy: Int) { - if (_visible && UI is UIClickable) { + if (visible && UI is UIClickable) { UI.mouseDragged(oldx, oldy, newx, newy) } } fun mousePressed(button: Int, x: Int, y: Int) { - if (_visible && UI is UIClickable) { + if (visible && UI is UIClickable) { UI.mousePressed(button, x, y) } } fun mouseReleased(button: Int, x: Int, y: Int) { - if (_visible && UI is UIClickable) { + if (visible && UI is UIClickable) { UI.mouseReleased(button, x, y) } } fun mouseWheelMoved(change: Int) { - if (_visible && UI is UIClickable) { + if (visible && UI is UIClickable) { UI.mouseWheelMoved(change) } } fun controllerButtonPressed(controller: Int, button: Int) { - if (_visible && UI is UIClickable) { + if (visible && UI is UIClickable) { UI.controllerButtonPressed(controller, button) } } fun controllerButtonReleased(controller: Int, button: Int) { - if (_visible && UI is UIClickable) { + if (visible && UI is UIClickable) { UI.controllerButtonReleased(controller, button) } } @@ -226,6 +242,6 @@ constructor(val UI: UICanvas) { if (alwaysVisible) { return false } - return _visible && !opening + return visible && !opening } } diff --git a/work_files/Controls.numbers b/work_files/Controls.numbers index aedc74f62582a9b012c966eb0e7e71505166ca9f..22e6063ad48da630ed1f4be12e82688ab1090243 100644 GIT binary patch delta 58087 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 I4+We54MRZ)h5!Hn delta 57340 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

09DYnjUZ&EZsms)+E@J;HI^{FjeM8vPNi=j4 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