From 7a442f26fafeb02424c5c0d63fe19625d8db79de Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 20 Aug 2017 22:10:47 +0900 Subject: [PATCH] some sort of error screen impl --- SAVE_FORMAT.md | 4 + assets/loadingCircle.frag | 39 ++++++ assets/locales/koKR/Polyglot-100_koKR.json | 2 +- assets/modules/LoadOrder.csv | 6 +- assets/modules/basegame/locales/en/game.json | 1 + .../modules/basegame/locales/jaJP/game.json | 4 +- .../modules/basegame/locales/koKR/game.json | 4 +- src/com/jme3/math/FastMath.java | 21 ++++ src/net/torvald/terrarum/CreditSingleton.kt | 5 +- src/net/torvald/terrarum/ErrorDisp.kt | 102 +++++++++++++++ src/net/torvald/terrarum/Ingame.kt | 2 +- src/net/torvald/terrarum/LoadScreen.kt | 2 +- src/net/torvald/terrarum/ModMgr.kt | 49 ++++---- src/net/torvald/terrarum/ShitOnGlsl.kt | 119 ++++++++++++++++++ src/net/torvald/terrarum/Terrarum.kt | 83 ++++++------ .../torvald/terrarum/TerrarumAppLoader.java | 33 ++++- src/net/torvald/terrarum/TitleScreen.kt | 38 ++---- src/net/torvald/terrarum/console/Version.kt | 3 +- .../terrarum/gameactors/ai/AILuaAPI.kt | 5 +- src/net/torvald/terrarum/ui/ConsoleWindow.kt | 3 +- src/net/torvald/terrarum/ui/UIItemList.kt | 2 +- .../terrarum/ui/UIItemModuleInfoCell.kt | 29 +++-- .../terrarum/ui/UITitleRemoConModules.kt | 65 +++++----- .../torvald/terrarum/ui/UITitleRemoConRoot.kt | 29 ++++- .../terrarum/worldgenerator/WorldGenerator.kt | 6 +- work_files/GameDesign/MISC_MECHNANICS.md | 12 ++ work_files/GameDesign/MODULE_IDEA_TECHPACK.md | 2 +- work_files/GameDesign/TITLE_SCREEN.md | 39 ++++-- work_files/GameDesign/TOOLS_MECHANICS.md | 15 +++ 29 files changed, 555 insertions(+), 169 deletions(-) create mode 100644 assets/loadingCircle.frag create mode 100644 src/net/torvald/terrarum/ErrorDisp.kt create mode 100644 src/net/torvald/terrarum/ShitOnGlsl.kt create mode 100644 work_files/GameDesign/TOOLS_MECHANICS.md diff --git a/SAVE_FORMAT.md b/SAVE_FORMAT.md index cdc62d8c2..5e133e465 100644 --- a/SAVE_FORMAT.md +++ b/SAVE_FORMAT.md @@ -39,12 +39,14 @@ Contain everything on [TEVD](github.com/minjaesong/TerranVirtualDisk) worldinfo2 -- tileprop worldinfo3 -- itemprop worldinfo4 -- materialprop + worldinfo5 -- modules loadorder * Human-readable - Tiles_list.txt -- list of tiles in csv - Items_list.txt -- list of items in csv - Materials_list.txt -- list of materials in csv + - load_order.txt -- module load order @@ -68,3 +70,5 @@ Directory: --- (UUID) virtual disk +--- tapestries --- (random Int) tapestry + +Alongside with save1.tevd (extension should not exist in real game), keep save1.backup.tevd as a last-working save. \ No newline at end of file diff --git a/assets/loadingCircle.frag b/assets/loadingCircle.frag new file mode 100644 index 000000000..ead29d661 --- /dev/null +++ b/assets/loadingCircle.frag @@ -0,0 +1,39 @@ +#version 120 +#ifdef GL_ES + precision mediump float; +#endif + + +varying vec4 v_color; +varying vec2 v_texCoords; +uniform sampler2D u_texture; + +uniform float rcount = 64.0; +uniform float gcount = 64.0; +uniform float bcount = 64.0; +uniform float acount = 1.0; + +uniform vec2 circleCentrePoint; +uniform vec2 colorCentrePoint; +uniform float circleSize; + +void main() { + vec2 screenCoord = gl_FragCoord.xy; + + float distToCircleCentre = + (screenCoord.x - circleCentrePoint.x + 0.5) * (screenCoord.x - circleCentrePoint.x + 0.5) + + (screenCoord.y - circleCentrePoint.y + 0.5) * (screenCoord.y - circleCentrePoint.y + 0.5); + float circleSizeSqr = circleSize * circleSize / 4; + + + if (distToCircleCentre <= circleSizeSqr) { + gl_FragColor = vec4(0.993, 0.993, 0.993, 1.0); + } + else if (distToCircleCentre <= circleSizeSqr + 200) { // dunno why it's 200; 2000 makes 10px feather + gl_FragColor = vec4(0.993, 0.993, 0.993, 1 - (distToCircleCentre - circleSizeSqr) / 200); + } + else { + gl_FragColor = vec4(0,0,0,1); + } + +} diff --git a/assets/locales/koKR/Polyglot-100_koKR.json b/assets/locales/koKR/Polyglot-100_koKR.json index e6c36d158..f448433bd 100644 --- a/assets/locales/koKR/Polyglot-100_koKR.json +++ b/assets/locales/koKR/Polyglot-100_koKR.json @@ -2057,7 +2057,7 @@ }, { "n": "MENU_LABEL_MORE", - "s": "다른" + "s": "더 보기" }, { "n": "MENU_LABEL_MUSIC", diff --git a/assets/modules/LoadOrder.csv b/assets/modules/LoadOrder.csv index e24a525bf..2fd792740 100644 --- a/assets/modules/LoadOrder.csv +++ b/assets/modules/LoadOrder.csv @@ -1,10 +1,6 @@ # Load Order # Modules are loaded from top to bottom. -# Acceptable formats: -# module_name,description_in_English_no_comma,(entry_point.kts),(external Jars sep'd by semicolon)... -# If entry_point is not given, the program will try to run .kts. -# if even that does not exist, an the program will quit with error. -# and yes, you can disable basegame, but we don't recommend. +# You can disable basegame, but we don't recommend. basegame dwarventech diff --git a/assets/modules/basegame/locales/en/game.json b/assets/modules/basegame/locales/en/game.json index 5e62eb772..b796e5974 100644 --- a/assets/modules/basegame/locales/en/game.json +++ b/assets/modules/basegame/locales/en/game.json @@ -1,5 +1,6 @@ { "MENU_LABEL_NEW_WORLD": "New World", + "MENU_LABEL_DELETE_WORLD" : "Delete World", "COPYRIGHT_ALL_RIGHTS_RESERVED": "All rights reserved", "COPYRIGHT_GNU_GPL_3": "Distributed under GNU GPL 3", diff --git a/assets/modules/basegame/locales/jaJP/game.json b/assets/modules/basegame/locales/jaJP/game.json index 1fd66ec62..70c0d1750 100644 --- a/assets/modules/basegame/locales/jaJP/game.json +++ b/assets/modules/basegame/locales/jaJP/game.json @@ -14,5 +14,7 @@ "GAME_INVENTORY_BLOCKS" : "ブロック", "GAME_INVENTORY_WALLS" : "壁", "CONTEXT_ITEM_TOOL_PLURAL" : "道具", - "GAME_INVENTORY_FAVORITES" : "登録" + "GAME_INVENTORY_FAVORITES" : "お気に入り", + + "GAME_INVENTORY_REGISTER" : "登録する" } \ No newline at end of file diff --git a/assets/modules/basegame/locales/koKR/game.json b/assets/modules/basegame/locales/koKR/game.json index fb5ea72ac..65d7a6865 100644 --- a/assets/modules/basegame/locales/koKR/game.json +++ b/assets/modules/basegame/locales/koKR/game.json @@ -14,5 +14,7 @@ "GAME_INVENTORY_BLOCKS" : "블록", "GAME_INVENTORY_WALLS" : "벽지", "CONTEXT_ITEM_TOOL_PLURAL" : "도구", - "GAME_INVENTORY_FAVORITES" : "등록" + "GAME_INVENTORY_FAVORITES" : "즐겨찾기", + + "GAME_INVENTORY_REGISTER" : "등록하기" } \ No newline at end of file diff --git a/src/com/jme3/math/FastMath.java b/src/com/jme3/math/FastMath.java index a0c14659d..0bb380738 100644 --- a/src/com/jme3/math/FastMath.java +++ b/src/com/jme3/math/FastMath.java @@ -304,6 +304,27 @@ final public class FastMath { } + public static float interpolateHermite(float scale, float p0, float p1, float p2, float p3) { + return interpolateHermite(scale, p0, p1, p2, p3, 1f, 0f); + } + public static float interpolateHermite(float scale, float p0, float p1, float p2, float p3, float tension, float bias) { + float mu2 = scale * scale; + float mu3 = mu2 * scale; + + float m0 = (p1 - p0) * (1f + bias) * (1f - tension) / 2f; + m0 += (p2 - p1) * (1f + bias) * (1f - tension) / 2f; + float m1 = (p2 - p1) * (1f + bias) * (1f - tension) / 2f; + m1 += (p3 - p2) * (1f + bias) * (1f - tension) / 2f; + + float a0 = 2 * mu3 - 3 * mu2 + 1; + float a1 = mu3 - 2 * mu2 + scale; + float a2 = mu3 - mu2; + float a3 = -2 * mu3 + 3 * mu2; + + return a0 * p1 + a1 * m0 + a2 * m1 + a3 * p2; + } + + /** * Returns the arc cosine of an angle given in radians.
* Special cases: diff --git a/src/net/torvald/terrarum/CreditSingleton.kt b/src/net/torvald/terrarum/CreditSingleton.kt index 16edbdb84..95ac3b228 100644 --- a/src/net/torvald/terrarum/CreditSingleton.kt +++ b/src/net/torvald/terrarum/CreditSingleton.kt @@ -6,13 +6,14 @@ object CreditSingleton { val credit: List; get() = ("${Lang["CREDITS_PROGRAMMER"]}\n\nTorvald (minjaesong)\n\n" + - "${Lang["CREDITS_ARTIST_PLURAL"]}\n\nTorvald (minjaesong)\nRoundworld (leedonggeun)" + + "${Lang["CREDITS_ARTIST_PLURAL"]}\n\nTorvald (minjaesong)\nRoundworld (leedonggeun)\n\n" + + "${Lang["CREDITS_POLYGLOT"]}" + """ -Copyright Informations +Copyright Information diff --git a/src/net/torvald/terrarum/ErrorDisp.kt b/src/net/torvald/terrarum/ErrorDisp.kt new file mode 100644 index 000000000..be25ebf0b --- /dev/null +++ b/src/net/torvald/terrarum/ErrorDisp.kt @@ -0,0 +1,102 @@ +package net.torvald.terrarum + +import com.badlogic.gdx.Gdx +import com.badlogic.gdx.Screen +import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.graphics.GL20 +import com.badlogic.gdx.graphics.OrthographicCamera +import com.badlogic.gdx.graphics.Texture +import com.badlogic.gdx.graphics.g2d.SpriteBatch +import com.badlogic.gdx.utils.GdxRuntimeException +import net.torvald.terrarum.langpack.Lang + +object ErrorDisp : Screen { + + val logoTex = TerrarumAppLoader.logo + val font = TerrarumAppLoader.fontGame + + + var title = Lang["ERROR_GENERIC_TEXT"] + var text = arrayListOf("") + + lateinit var batch: SpriteBatch + + + val textPosX = 45f + + lateinit var camera: OrthographicCamera + + + val titleTextLeftMargin = 8 + val titleText = "${TerrarumAppLoader.GAME_NAME} ${TerrarumAppLoader.getVERSION_STRING()}" + + + override fun show() { + batch = SpriteBatch() + + + camera = OrthographicCamera(Gdx.graphics.width.toFloat(), Gdx.graphics.height.toFloat()) + camera.setToOrtho(true) + camera.update() + } + + override fun render(delta: Float) { + Gdx.gl.glClearColor(.094f, .094f, .094f, 0f) + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) + + + + // draw background + + + // draw logo + batch.inUse { + batch.projectionMatrix = camera.combined + + val headerLogoW = (logoTex.texture.width / 4f).toInt() + val headerLogoH = (logoTex.texture.height / 4f).toInt() + val headerTextWidth = font.getWidth(titleText) + val headerTotalWidth = headerLogoW + titleTextLeftMargin + headerTextWidth + val headerLogoXPos = (Gdx.graphics.width - headerTotalWidth).div(2) + val headerLogoYPos = 25 + headerLogoH + batch.color = Color.WHITE + batch.draw(logoTex.texture, headerLogoXPos.toFloat(), headerLogoYPos.toFloat(), headerLogoW.toFloat(), -headerLogoH.toFloat()) + font.draw(batch, titleText, headerLogoXPos + headerLogoW.toFloat() + titleTextLeftMargin, headerLogoYPos -(headerLogoH / 2f) - font.lineHeight + 4) + + + // draw error text + batch.color = Color(0xff8080ff.toInt()) + font.draw(batch, title, textPosX, logoTex.texture.height / 4f * 2 + 50f) + + batch.color = Color.WHITE + text.forEachIndexed { index, s -> + font.draw(batch, s, textPosX, logoTex.texture.height / 4f * 2 + 130f + index * font.lineHeight) + } + } + + } + + override fun hide() { + } + + override fun pause() { + } + + override fun resume() { + } + + override fun resize(width: Int, height: Int) { + } + + override fun dispose() { + + } +} + +class TerrarumRuntimeException(messageTitle: String, message: List? = null) : RuntimeException() { + + init { + + } + +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/Ingame.kt b/src/net/torvald/terrarum/Ingame.kt index 121abc3df..c48e5ac8c 100644 --- a/src/net/torvald/terrarum/Ingame.kt +++ b/src/net/torvald/terrarum/Ingame.kt @@ -244,7 +244,7 @@ class Ingame(val batch: SpriteBatch) : Screen { println("[Ingame] loaded successfully.") } else { - LoadScreen.addMessage("${Terrarum.NAME} version ${Terrarum.VERSION_STRING}") + LoadScreen.addMessage("${Terrarum.NAME} version ${TerrarumAppLoader.getVERSION_STRING()}") LoadScreen.addMessage("Creating new world") diff --git a/src/net/torvald/terrarum/LoadScreen.kt b/src/net/torvald/terrarum/LoadScreen.kt index 37777a1b8..a6e62a151 100644 --- a/src/net/torvald/terrarum/LoadScreen.kt +++ b/src/net/torvald/terrarum/LoadScreen.kt @@ -268,7 +268,7 @@ object LoadScreen : ScreenAdapter() { Thread.sleep(80) - Terrarum.changeScreen(screenToLoad!!) + Terrarum.setScreen(screenToLoad!!) } } diff --git a/src/net/torvald/terrarum/ModMgr.kt b/src/net/torvald/terrarum/ModMgr.kt index 2e57a2968..9d2e697de 100644 --- a/src/net/torvald/terrarum/ModMgr.kt +++ b/src/net/torvald/terrarum/ModMgr.kt @@ -72,33 +72,38 @@ object ModMgr { val moduleName = it[0] println("[ModMgr] Loading module $moduleName") - val modMetadata = Properties() - modMetadata.load(FileInputStream("$modDir/$moduleName/metadata.properties")) + try { + val modMetadata = Properties() + modMetadata.load(FileInputStream("$modDir/$moduleName/metadata.properties")) - val properName = modMetadata.getProperty("propername") - val description = modMetadata.getProperty("description") - val author = modMetadata.getProperty("author") - val entryPoint = modMetadata.getProperty("entrypoint") - val releaseDate = modMetadata.getProperty("releasedate") - val version = modMetadata.getProperty("version") - val libs = modMetadata.getProperty("libraries").split(';').toTypedArray() - val isDir = FileSystems.getDefault().getPath("$modDir/$moduleName").toFile().isDirectory - moduleInfo[moduleName] = ModuleMetadata(index, isDir, properName, description, author, entryPoint, releaseDate, version, libs) + val properName = modMetadata.getProperty("propername") + val description = modMetadata.getProperty("description") + val author = modMetadata.getProperty("author") + val entryPoint = modMetadata.getProperty("entrypoint") + val releaseDate = modMetadata.getProperty("releasedate") + val version = modMetadata.getProperty("version") + val libs = modMetadata.getProperty("libraries").split(';').toTypedArray() + val isDir = FileSystems.getDefault().getPath("$modDir/$moduleName").toFile().isDirectory + moduleInfo[moduleName] = ModuleMetadata(index, isDir, properName, description, author, entryPoint, releaseDate, version, libs) - println(moduleInfo[moduleName]) + println(moduleInfo[moduleName]) - // run entry script in entry point - if (entryPoint.isNotBlank()) { - val extension = entryPoint.split('.').last() - val engine = ScriptEngineManager().getEngineByExtension(extension)!! - val invocable = engine as Invocable - engine.eval(FileReader(getFile(moduleName, entryPoint))) - invocable.invokeFunction("invoke", moduleName) + // run entry script in entry point + if (entryPoint.isNotBlank()) { + val extension = entryPoint.split('.').last() + val engine = ScriptEngineManager().getEngineByExtension(extension)!! + val invocable = engine as Invocable + engine.eval(FileReader(getFile(moduleName, entryPoint))) + invocable.invokeFunction("invoke", moduleName) + } + + + println("[ModMgr] $moduleName loaded successfully") + } + catch (noSuchModule: FileNotFoundException) { + System.err.println("[ModMgr] No such module: $moduleName, skipping...") } - - - println("[ModMgr] $moduleName loaded successfully") } diff --git a/src/net/torvald/terrarum/ShitOnGlsl.kt b/src/net/torvald/terrarum/ShitOnGlsl.kt new file mode 100644 index 000000000..5fd45855e --- /dev/null +++ b/src/net/torvald/terrarum/ShitOnGlsl.kt @@ -0,0 +1,119 @@ +package net.torvald.terrarum + +import com.badlogic.gdx.ApplicationAdapter +import com.badlogic.gdx.Gdx +import com.badlogic.gdx.backends.lwjgl.LwjglApplication +import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration +import com.badlogic.gdx.graphics.* +import com.badlogic.gdx.graphics.g2d.SpriteBatch +import com.badlogic.gdx.graphics.glutils.ShaderProgram +import net.torvald.terrarumsansbitmap.gdx.GameFontBase + +/** + * Created by minjaesong on 2017-08-11. + */ +fun main(args: Array) { // LWJGL 3 won't work? java.lang.VerifyError + val config = LwjglApplicationConfiguration() + //config.useGL30 = true + config.vSyncEnabled = false + config.resizable = false + config.width = 1072 + config.height = 742 + config.foregroundFPS = 9999 + LwjglApplication(ShitOnGlsl, config) +} + +object ShitOnGlsl : ApplicationAdapter() { + + lateinit var shader: ShaderProgram + lateinit var font: GameFontBase + + lateinit var fullscreenQuad: Mesh + + lateinit var camera: OrthographicCamera + + lateinit var batch: SpriteBatch + + lateinit var fucktex: Texture + + override fun create() { + ShaderProgram.pedantic = false + + shader = ShaderProgram(Gdx.files.internal("assets/4096.vert"), Gdx.files.internal("assets/loadingCircle.frag")) + + + font = GameFontBase("assets/graphics/fonts/terrarum-sans-bitmap", flipY = false) + + + if (!shader.isCompiled) { + Gdx.app.log("Shader", shader.log) + System.exit(1) + } + + + + fullscreenQuad = Mesh( + true, 4, 6, + VertexAttribute.Position(), + VertexAttribute.ColorUnpacked(), + VertexAttribute.TexCoords(0) + ) + + fullscreenQuad.setVertices(floatArrayOf( + 0f, 0f, 0f, 1f, 1f, 1f, 1f, 0f, 1f, + Gdx.graphics.width.toFloat(), 0f, 0f, 1f, 1f, 1f, 1f, 1f, 1f, + Gdx.graphics.width.toFloat(), Gdx.graphics.height.toFloat(), 0f, 1f, 1f, 1f, 1f, 1f, 0f, + 0f, Gdx.graphics.height.toFloat(), 0f, 1f, 1f, 1f, 1f, 0f, 0f + )) + fullscreenQuad.setIndices(shortArrayOf(0, 1, 2, 2, 3, 0)) + + + camera = OrthographicCamera(Gdx.graphics.width.toFloat(), Gdx.graphics.height.toFloat()) + camera.setToOrtho(true, Gdx.graphics.width.toFloat(), Gdx.graphics.height.toFloat()) + camera.update() + + + batch = SpriteBatch() + + fucktex = Texture(Gdx.files.internal("assets/graphics/ortho_line_tex_2px.tga")) + } + + + override fun render() { + Gdx.graphics.setTitle("ShitOnGlsl — F: ${Gdx.graphics.framesPerSecond}") + + Gdx.gl.glClearColor(.094f, .094f, .094f, 0f) + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) + + + + batch.inUse { + + batch.shader = shader + + shader.setUniformMatrix("u_projTrans", camera.combined) + shader.setUniformi("u_texture", 0) + shader.setUniformf("circleCentrePoint", Gdx.graphics.width / 2f, Gdx.graphics.height / 2f) + shader.setUniformf("colorCentrePoint", Gdx.graphics.width / 2f, Gdx.graphics.height / 2f) + shader.setUniformf("circleSize", 200f) + //fullscreenQuad.render(shader, GL20.GL_TRIANGLES) + + batch.draw(fucktex, 0f, 0f, Gdx.graphics.width.toFloat(), Gdx.graphics.height.toFloat()) + + } + + + /*shader.begin() + shader.setUniformMatrix("u_projTrans", batch.projectionMatrix) + shader.setUniformi("u_texture", 0) + shader.setUniformf("circleCentrePoint", Gdx.graphics.width / 2f, Gdx.graphics.height / 2f) + shader.setUniformf("colorCentrePoint", Gdx.graphics.width / 2f, Gdx.graphics.height / 2f) + shader.setUniformf("circleSize", 200f) + fullscreenQuad.render(shader, GL20.GL_TRIANGLES) + shader.end()*/ + } + + override fun dispose() { + shader.dispose() + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index 127e443b0..72aee13c9 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -11,6 +11,7 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.glutils.FrameBuffer import com.badlogic.gdx.graphics.glutils.ShaderProgram import com.badlogic.gdx.graphics.glutils.ShapeRenderer +import com.badlogic.gdx.utils.GdxRuntimeException import com.google.gson.JsonArray import com.google.gson.JsonPrimitive import net.torvald.random.HQRNG @@ -30,10 +31,12 @@ import net.torvald.terrarum.worlddrawer.FeaturesDrawer import net.torvald.terrarum.worlddrawer.WorldCamera import net.torvald.terrarumsansbitmap.gdx.GameFontBase import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack +import org.lwjgl.BufferUtils import org.lwjgl.input.Controllers import java.io.File import java.io.IOException import java.lang.management.ManagementFactory +import java.nio.IntBuffer import java.util.* /** @@ -73,8 +76,8 @@ object Terrarum : Screen { lateinit var appLoader: TerrarumAppLoader - internal var screenW: Int? = null - internal var screenH: Int? = null + var screenW = 0 + var screenH = 0 lateinit var batch: SpriteBatch lateinit var shapeRender: ShapeRenderer // DO NOT USE!! for very limited applications e.g. WeatherMixer @@ -90,12 +93,12 @@ object Terrarum : Screen { ////////////////////////////// val WIDTH: Int - get() = if ((screenW ?: Gdx.graphics.width) % 2 == 0) (screenW ?: Gdx.graphics.width) else (screenW ?: Gdx.graphics.width) - 1 + get() = if (screenW % 2 == 0) screenW else screenW - 1 val HEIGHT: Int - get() = if ((screenH ?: Gdx.graphics.height) % 2 == 0) (screenH ?: Gdx.graphics.height) else (screenH ?: Gdx.graphics.height) - 1 + get() = if (screenH % 2 == 0) screenH else screenH - 1 - val WIDTH_MIN = 800 - val HEIGHT_MIN = 600 + //val WIDTH_MIN = 800 + //val HEIGHT_MIN = 600 inline val HALFW: Int get() = WIDTH.ushr(1) @@ -153,7 +156,8 @@ object Terrarum : Screen { val memXmx: Long get() = Runtime.getRuntime().maxMemory() shr 20 - val environment: RunningEnvironment + var environment: RunningEnvironment + private set private val localeSimple = arrayOf("de", "en", "es", "it") var gameLocale = "lateinit" @@ -179,7 +183,7 @@ object Terrarum : Screen { - lateinit var fontGame: GameFontBase + val fontGame: GameFontBase = TerrarumAppLoader.fontGame lateinit var fontSmallNumbers: TinyAlphNum var joypadLabelStart: Char = 0xE000.toChar() // lateinit @@ -236,18 +240,7 @@ object Terrarum : Screen { private lateinit var configDir: String - /** - * 0xAA_BB_XXXX - * AA: Major version - * BB: Minor version - * XXXX: Revision (Repository commits) - * - * e.g. 0x02010034 can be translated as 2.1.52 - */ - const val VERSION_RAW = 0x00_02_0226 - const val VERSION_STRING: String = - "${VERSION_RAW.ushr(24)}.${VERSION_RAW.and(0xFF0000).ushr(16)}.${VERSION_RAW.and(0xFFFF)}" - const val NAME = "Terrarum" + const val NAME = TerrarumAppLoader.GAME_NAME val systemArch = System.getProperty("os.arch") @@ -256,8 +249,6 @@ object Terrarum : Screen { lateinit var shaderBlur: ShaderProgram - lateinit var shaderRGBOnly: ShaderProgram - lateinit var shaderAOnly: ShaderProgram lateinit var shaderBayer: ShaderProgram lateinit var shaderBayerSkyboxFill: ShaderProgram lateinit var shaderBlendGlow: ShaderProgram @@ -274,7 +265,7 @@ object Terrarum : Screen { init { - println("$NAME version $VERSION_STRING") + println("$NAME version ${TerrarumAppLoader.getVERSION_STRING()}") getDefaultDirectory() @@ -331,6 +322,16 @@ object Terrarum : Screen { Gdx.graphics.glVersion.minorVersion * 10 + Gdx.graphics.glVersion.releaseVersion val MINIMAL_GL_VERSION = 210 + val GL_MAX_TEXTURE_SIZE: Int + get() { + val intBuffer = BufferUtils.createIntBuffer(16) // size must be at least 16, or else LWJGL complains + Gdx.gl.glGetIntegerv(GL20.GL_MAX_TEXTURE_SIZE, intBuffer) + + intBuffer.rewind() + + return intBuffer.get() + } + val MINIMAL_GL_MAX_TEXTURE_SIZE = 4096 override fun show() { @@ -341,12 +342,13 @@ object Terrarum : Screen { println("[Terrarum] GL_VERSION = $GL_VERSION") + println("[Terrarum] GL_MAX_TEXTURE_SIZE = $GL_MAX_TEXTURE_SIZE") println("[Terrarum] GL info:\n${Gdx.graphics.glVersion.debugVersionString}") // debug info - if (GL_VERSION < MINIMAL_GL_VERSION) { + if (GL_VERSION < MINIMAL_GL_VERSION || GL_MAX_TEXTURE_SIZE < MINIMAL_GL_MAX_TEXTURE_SIZE) { // TODO notify properly - throw Error("Graphics device not capable -- device's GL_VERSION: $GL_VERSION, required: $MINIMAL_GL_VERSION") + throw GdxRuntimeException("Graphics device not capable -- device's GL_VERSION: $GL_VERSION, required: $MINIMAL_GL_VERSION; GL_MAX_TEXTURE_SIZE: $GL_MAX_TEXTURE_SIZE, required: $MINIMAL_GL_MAX_TEXTURE_SIZE") } @@ -377,7 +379,7 @@ object Terrarum : Screen { shapeRender = ShapeRenderer() - fontGame = GameFontBase("assets/graphics/fonts/terrarum-sans-bitmap", flipY = true) + //fontGame = GameFontBase("assets/graphics/fonts/terrarum-sans-bitmap", flipY = true) fontSmallNumbers = TinyAlphNum @@ -398,9 +400,6 @@ object Terrarum : Screen { shaderBayerSkyboxFill = ShaderProgram(Gdx.files.internal("assets/4096.vert"), Gdx.files.internal("assets/4096_bayer_skyboxfill.frag")) - shaderRGBOnly = ShaderProgram(Gdx.files.internal("assets/4096.vert"), Gdx.files.internal("assets/rgbonly.frag")) - shaderAOnly = ShaderProgram(Gdx.files.internal("assets/4096.vert"), Gdx.files.internal("assets/aonly.frag")) - shaderBlendGlow = ShaderProgram(Gdx.files.internal("assets/blendGlow.vert"), Gdx.files.internal("assets/blendGlow.frag")) if (!shaderBlendGlow.isCompiled) { @@ -444,7 +443,7 @@ object Terrarum : Screen { appLoader.setScreen(TitleScreen(batch)) } - internal fun changeScreen(screen: Screen) { + internal fun setScreen(screen: Screen) { appLoader.setScreen(screen) } @@ -475,6 +474,12 @@ object Terrarum : Screen { MessageWindow.SEGMENT_BLACK.dispose() MessageWindow.SEGMENT_WHITE.dispose() //dispose any other resources used in this level + + + shaderBayer.dispose() + shaderBayerSkyboxFill.dispose() + shaderBlur.dispose() + shaderBlendGlow.dispose() } override fun hide() { @@ -482,11 +487,14 @@ object Terrarum : Screen { } override fun resize(width: Int, height: Int) { - var width = maxOf(width, WIDTH_MIN) - var height = maxOf(height, HEIGHT_MIN) + //var width = maxOf(width, WIDTH_MIN) + //var height = maxOf(height, HEIGHT_MIN) - if (width % 2 == 1) width += 1 - if (height % 2 == 1) height += 1 + var width = width + var height = height + + if (width % 2 == 1) width -= 1 + if (height % 2 == 1) height -= 1 screenW = width screenH = height @@ -521,7 +529,7 @@ object Terrarum : Screen { OperationSystem = "OSX" defaultDir = System.getProperty("user.home") + "/Library/Application Support/Terrarum" } - else if (OS.contains("NUX") || OS.contains("NIX")) { + else if (OS.contains("NUX") || OS.contains("NIX") || OS.contains("BSD")) { OperationSystem = "LINUX" defaultDir = System.getProperty("user.home") + "/.Terrarum" } @@ -529,6 +537,11 @@ object Terrarum : Screen { OperationSystem = "SOLARIS" defaultDir = System.getProperty("user.home") + "/.Terrarum" } + else if (System.getProperty("java.runtime.name").toUpperCase().contains("ANDROID")) { + OperationSystem = "ANDROID" + defaultDir = System.getProperty("user.home") + "/.Terrarum" + environment = RunningEnvironment.MOBILE + } else { OperationSystem = "UNKNOWN" defaultDir = System.getProperty("user.home") + "/.Terrarum" diff --git a/src/net/torvald/terrarum/TerrarumAppLoader.java b/src/net/torvald/terrarum/TerrarumAppLoader.java index 5b3872b7d..a1eaeb27a 100644 --- a/src/net/torvald/terrarum/TerrarumAppLoader.java +++ b/src/net/torvald/terrarum/TerrarumAppLoader.java @@ -9,6 +9,8 @@ import com.badlogic.gdx.graphics.*; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.glutils.ShaderProgram; +import net.torvald.terrarumsansbitmap.gdx.GameFontBase; +import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack; /** * Created by minjaesong on 2017-08-01. @@ -18,8 +20,23 @@ public class TerrarumAppLoader implements ApplicationListener { public static final String GAME_NAME = "Terrarum"; public static final String COPYRIGHT_DATE_NAME = "Copyright 2013-2017 Torvald (minjaesong)"; + /** + * 0xAA_BB_XXXX + * AA: Major version + * BB: Minor version + * XXXX: Revision (Repository commits) + * + * e.g. 0x02010034 can be translated as 2.1.52 + */ + public static final int VERSION_RAW = 0x00_02_0226; + public static final String getVERSION_STRING() { + return String.format("%d.%d.%d", VERSION_RAW >>> 24, (VERSION_RAW & 0xff0000) >>> 16, VERSION_RAW & 0xFFFF); + } + private static LwjglApplicationConfiguration appConfig; + public static GameFontBase fontGame; + public static void main(String[] args) { appConfig = new LwjglApplicationConfiguration(); appConfig.vSyncEnabled = false; @@ -38,7 +55,7 @@ public class TerrarumAppLoader implements ApplicationListener { private Mesh fullscreenQuad; private OrthographicCamera camera; private SpriteBatch batch; - private TextureRegion logo; + public static TextureRegion logo; private Color gradWhiteTop = new Color(0xf8f8f8ff); private Color gradWhiteBottom = new Color(0xd8d8d8ff); @@ -92,6 +109,10 @@ public class TerrarumAppLoader implements ApplicationListener { logo = new TextureRegion(new Texture(Gdx.files.internal("assets/graphics/logo_placeholder.tga"))); logo.flip(false, true); + + + TextureRegionPack.Companion.setGlobalFlipY(true); + fontGame = new GameFontBase("assets/graphics/fonts/terrarum-sans-bitmap", false, true, Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest); } @Override @@ -99,6 +120,7 @@ public class TerrarumAppLoader implements ApplicationListener { if (screen == null) { shaderBayerSkyboxFill.begin(); shaderBayerSkyboxFill.setUniformMatrix("u_projTrans", camera.combined); + shaderBayerSkyboxFill.setUniformf("parallax_size", 0f); shaderBayerSkyboxFill.setUniformf("topColor", gradWhiteTop.r, gradWhiteTop.g, gradWhiteTop.b); shaderBayerSkyboxFill.setUniformf("bottomColor", gradWhiteBottom.r, gradWhiteBottom.g, gradWhiteBottom.b); fullscreenQuad.render(shaderBayerSkyboxFill, GL20.GL_TRIANGLES); @@ -121,7 +143,10 @@ public class TerrarumAppLoader implements ApplicationListener { if (loadTimer >= showupTime) { Terrarum.INSTANCE.setAppLoader(this); - setScreen(Terrarum.INSTANCE); + Terrarum.INSTANCE.setScreenW(appConfig.width); + Terrarum.INSTANCE.setScreenH(appConfig.height); + //setScreen(Terrarum.INSTANCE); + setScreen(ErrorDisp.INSTANCE); } } else { @@ -131,7 +156,9 @@ public class TerrarumAppLoader implements ApplicationListener { @Override public void resize(int width, int height) { - initViewPort(width, height); + //initViewPort(width, height); + + if (screen != null) screen.resize(width, height); } @Override diff --git a/src/net/torvald/terrarum/TitleScreen.kt b/src/net/torvald/terrarum/TitleScreen.kt index f97f87cf7..b62353668 100644 --- a/src/net/torvald/terrarum/TitleScreen.kt +++ b/src/net/torvald/terrarum/TitleScreen.kt @@ -171,41 +171,20 @@ class TitleScreen(val batch: SpriteBatch) : Screen { private var blurWriteBuffer = lightmapFboA private var blurReadBuffer = lightmapFboB - private val minimumIntroTime: Second = 2.0f private val introUncoverTime: Second = 0.3f - private var showIntroDeltaCounter = 0f private var introUncoverDeltaCounter = 0f private var updateDeltaCounter = 0.0 protected val updateRate = 1.0 / Terrarum.TARGET_INTERNAL_FPS override fun render(delta: Float) { - Gdx.gl.glClearColor(.094f, .094f, .094f, 0f) - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) - - if (!loadDone || showIntroDeltaCounter < minimumIntroTime) { - // draw load screen - Terrarum.shaderBayerSkyboxFill.begin() - Terrarum.shaderBayerSkyboxFill.setUniformMatrix("u_projTrans", camera.combined) - Terrarum.shaderBayerSkyboxFill.setUniformf("topColor", gradWhiteTop.r, gradWhiteTop.g, gradWhiteTop.b) - Terrarum.shaderBayerSkyboxFill.setUniformf("bottomColor", gradWhiteBottom.r, gradWhiteBottom.g, gradWhiteBottom.b) - Terrarum.fullscreenQuad.render(Terrarum.shaderBayerSkyboxFill, GL20.GL_TRIANGLES) - Terrarum.shaderBayerSkyboxFill.end() - - batch.inUse { - batch.color = Color.WHITE - blendNormal() - batch.shader = null - - - setCameraPosition(0f, 0f) - batch.draw(logo, (Terrarum.WIDTH - logo.regionWidth) / 2f, (Terrarum.HEIGHT - logo.regionHeight) / 2f) - } - - if (!loadDone) { - loadThingsWhileIntroIsVisible() - } + if (!loadDone) { + loadThingsWhileIntroIsVisible() } else { + Gdx.gl.glClearColor(.094f, .094f, .094f, 0f) + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) + + // async update updateDeltaCounter += delta while (updateDeltaCounter >= updateRate) { @@ -215,11 +194,8 @@ class TitleScreen(val batch: SpriteBatch) : Screen { // render? just do it anyway renderScreen() + } - - - - showIntroDeltaCounter += delta } fun updateScreen(delta: Float) { diff --git a/src/net/torvald/terrarum/console/Version.kt b/src/net/torvald/terrarum/console/Version.kt index d58950a69..e0e37c019 100644 --- a/src/net/torvald/terrarum/console/Version.kt +++ b/src/net/torvald/terrarum/console/Version.kt @@ -2,6 +2,7 @@ package net.torvald.terrarum.console import com.badlogic.gdx.Gdx import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.TerrarumAppLoader import net.torvald.terrarum.langpack.Lang /** @@ -10,7 +11,7 @@ import net.torvald.terrarum.langpack.Lang internal object Version : ConsoleCommand { override fun execute(args: Array) { - Echo("${Terrarum.NAME} ${Terrarum.VERSION_STRING}") + Echo("${Terrarum.NAME} ${TerrarumAppLoader.getVERSION_STRING()}") Echo("Polyglot language pack version ${Lang.POLYGLOT_VERSION}") Echo("GL_VERSION: ${Terrarum.GL_VERSION}") Echo("Renderer: ${Gdx.graphics.glVersion.rendererString}, ${Gdx.graphics.glVersion.vendorString}") diff --git a/src/net/torvald/terrarum/gameactors/ai/AILuaAPI.kt b/src/net/torvald/terrarum/gameactors/ai/AILuaAPI.kt index 11a1bbc7c..79adb300c 100644 --- a/src/net/torvald/terrarum/gameactors/ai/AILuaAPI.kt +++ b/src/net/torvald/terrarum/gameactors/ai/AILuaAPI.kt @@ -1,6 +1,7 @@ package net.torvald.terrarum.gameactors.ai import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.TerrarumAppLoader import net.torvald.terrarum.gameactors.AIControlled import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.ActorWithPhysics @@ -380,13 +381,13 @@ internal class AILuaAPI(g: Globals, actor: ActorWithPhysics) { class GameVersion : ZeroArgFunction() { override fun call(): LuaValue { - return Terrarum.VERSION_STRING.toLua() + return TerrarumAppLoader.getVERSION_STRING().toLua() } } class GameVersionRaw : ZeroArgFunction() { override fun call(): LuaValue { - return Terrarum.VERSION_RAW.toLua() + return TerrarumAppLoader.VERSION_RAW.toLua() } } } diff --git a/src/net/torvald/terrarum/ui/ConsoleWindow.kt b/src/net/torvald/terrarum/ui/ConsoleWindow.kt index 79bf7653a..1a2b04c77 100644 --- a/src/net/torvald/terrarum/ui/ConsoleWindow.kt +++ b/src/net/torvald/terrarum/ui/ConsoleWindow.kt @@ -7,6 +7,7 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.dataclass.HistoryArray import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.TerrarumAppLoader import net.torvald.terrarum.console.Authenticator import net.torvald.terrarum.console.CommandInterpreter import net.torvald.terrarum.fillRect @@ -180,7 +181,7 @@ class ConsoleWindow : UICanvas() { commandInputPool = StringBuilder() if (Authenticator.b()) { - sendMessage("${Terrarum.NAME} ${Terrarum.VERSION_STRING}") + sendMessage("${Terrarum.NAME} ${TerrarumAppLoader.getVERSION_STRING()}") sendMessage(Lang["DEV_MESSAGE_CONSOLE_CODEX"]) } } diff --git a/src/net/torvald/terrarum/ui/UIItemList.kt b/src/net/torvald/terrarum/ui/UIItemList.kt index 4ec1b423f..a17a0ea55 100644 --- a/src/net/torvald/terrarum/ui/UIItemList.kt +++ b/src/net/torvald/terrarum/ui/UIItemList.kt @@ -37,7 +37,7 @@ class UIItemList( init { itemList.forEachIndexed { index, item -> item.posX = this.posX - item.posY = if (index == 0) this.posY else itemList[index - 1].posY + itemList[index - 1].height + this.posY + item.posY = if (index == 0) this.posY else itemList[index - 1].posY + itemList[index - 1].height } } diff --git a/src/net/torvald/terrarum/ui/UIItemModuleInfoCell.kt b/src/net/torvald/terrarum/ui/UIItemModuleInfoCell.kt index da27ed861..24ee19df7 100644 --- a/src/net/torvald/terrarum/ui/UIItemModuleInfoCell.kt +++ b/src/net/torvald/terrarum/ui/UIItemModuleInfoCell.kt @@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.terrarum.ModMgr import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.blendNormal import net.torvald.terrarum.gameactors.floor class UIItemModuleInfoCell( @@ -19,47 +20,49 @@ class UIItemModuleInfoCell( private val numberAreaWidth = Terrarum.fontSmallNumbers.W * 3 + 4 override fun render(batch: SpriteBatch) { + blendNormal() + if (ModMgr.moduleInfo.containsKey(moduleName)) { val modInfo = ModMgr.moduleInfo[moduleName]!! // print load order index - batch.color = Color(0x7f7f7fff) + batch.color = Color(0xccccccff.toInt()) var strlen = Terrarum.fontSmallNumbers.getWidth(modInfo.order.toString()) Terrarum.fontSmallNumbers.draw(batch, modInfo.order.toString(), - (numberAreaWidth - strlen).div(2f).floor(), - (height - Terrarum.fontSmallNumbers.H).div(2f).floor() + posX + (numberAreaWidth - strlen).div(2f).floor(), + posY + (height - Terrarum.fontSmallNumbers.H).div(2f).floor() ) // print module name batch.color = Color.WHITE Terrarum.fontGame.draw(batch, "${modInfo.properName} (${modInfo.version})", - numberAreaWidth.toFloat(), - 0f + posX + numberAreaWidth.toFloat(), + posY.toFloat() ) // print author name strlen = Terrarum.fontGame.getWidth(modInfo.author) Terrarum.fontGame.draw(batch, modInfo.author, - width - strlen.toFloat(), - 0f + posX + width - strlen.toFloat(), + posY.toFloat() ) // print description Terrarum.fontGame.draw(batch, modInfo.description, - numberAreaWidth.toFloat(), - Terrarum.fontGame.lineHeight + posX + numberAreaWidth.toFloat(), + posY + Terrarum.fontGame.lineHeight ) // print releasedate strlen = Terrarum.fontGame.getWidth(modInfo.releaseDate) Terrarum.fontGame.draw(batch, modInfo.releaseDate, - width - strlen.toFloat(), - Terrarum.fontGame.lineHeight + posX + width - strlen.toFloat(), + posY + Terrarum.fontGame.lineHeight ) } @@ -69,8 +72,8 @@ class UIItemModuleInfoCell( val strlen = Terrarum.fontSmallNumbers.getWidth(str) Terrarum.fontSmallNumbers.draw(batch, str, - (width - numberAreaWidth - strlen).div(2f).floor() + numberAreaWidth, - (height - Terrarum.fontSmallNumbers.H).div(2f).floor() + posX + (width - numberAreaWidth - strlen).div(2f).floor() + numberAreaWidth, + posY + (height - Terrarum.fontSmallNumbers.H).div(2f).floor() ) } } diff --git a/src/net/torvald/terrarum/ui/UITitleRemoConModules.kt b/src/net/torvald/terrarum/ui/UITitleRemoConModules.kt index f75ad3646..ec738d1d2 100644 --- a/src/net/torvald/terrarum/ui/UITitleRemoConModules.kt +++ b/src/net/torvald/terrarum/ui/UITitleRemoConModules.kt @@ -3,14 +3,16 @@ package net.torvald.terrarum.ui import com.badlogic.gdx.graphics.Camera import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.SpriteBatch +import net.torvald.terrarum.ModMgr import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.blendNormal import net.torvald.terrarum.gameactors.Second import net.torvald.terrarum.langpack.Lang /** * Created by minjaesong on 2017-08-01. */ -/*class UITitleRemoConModules(val superMenu: UICanvas) : UICanvas() { +class UITitleRemoConModules(val superMenu: UICanvas) : UICanvas() { val menuLabels = arrayOf( "MENU_LABEL_RETURN" @@ -22,9 +24,7 @@ import net.torvald.terrarum.langpack.Lang override var openCloseTime: Second = 0f - private val moduleListWidth = Terrarum.WIDTH / 2 - - private val moduleList = UIItemList( + private val menubar = UIItemTextButtonList( this, menuLabels, 0, UITitleRemoConRoot.menubarOffY, @@ -39,44 +39,44 @@ import net.torvald.terrarum.langpack.Lang ) - private val textAreaHMargin = 48 - private val textAreaWidth = (Terrarum.WIDTH * 0.75).toInt() - private val textAreaHeight = Terrarum.HEIGHT - textAreaHMargin * 2 - /*private val textArea = UIItemTextArea(this, - Terrarum.WIDTH - textAreaWidth, textAreaHMargin, - textAreaWidth, textAreaHeight, - align = UIItemTextArea.Align.CENTRE - )*/ - private val localeList = Lang.languageList.toList().sorted() - private val textArea = UIItemTextButtonList(this, - localeList.map { Lang.langpack["MENU_LANGUAGE_THIS_$it"] ?: "!ERR: $it" }.toTypedArray(), - Terrarum.WIDTH - textAreaWidth, textAreaHMargin, - textAreaWidth, textAreaHeight, - textAreaWidth = textAreaWidth, - readFromLang = false, - activeBackCol = Color(0), - highlightBackCol = Color(0), - backgroundCol = Color(0), - inactiveCol = Color.WHITE, - defaultSelection = null + private val moduleAreaHMargin = 48 + private val moduleAreaWidth = (Terrarum.WIDTH * 0.75).toInt() - moduleAreaHMargin + private val moduleAreaHeight = Terrarum.HEIGHT - moduleAreaHMargin * 2 + + private val moduleInfoCells = ArrayList() + // build module list + init { + ModMgr.moduleInfo.toList().sortedBy { it.second.order }.forEachIndexed { index, it -> + moduleInfoCells.add(UIItemModuleInfoCell( + this, + it.first, + moduleAreaWidth, + 0, 0 // placeholder + )) + } + } + + private val mouduleArea = UIItemList( + this, + moduleInfoCells, + (Terrarum.WIDTH * 0.25f).toInt(), moduleAreaHMargin, + moduleAreaWidth, + moduleAreaHeight, + inactiveCol = Color.WHITE ) init { uiItems.add(menubar) + uiItems.add(mouduleArea) - //textArea.entireText = Lang.languageList.toList().sorted().map { Lang.langpack["MENU_LANGUAGE_THIS_$it"] ?: "!ERR: $it" } - //////////////////////////// // attach listeners - textArea.selectionChangeListener = { _, newSelectionIndex -> - Terrarum.gameLocale = localeList[newSelectionIndex] - } menubar.buttons[menuLabels.indexOf("MENU_LABEL_RETURN")].clickOnceListener = { _, _, _ -> this.setAsClose() @@ -88,14 +88,15 @@ import net.torvald.terrarum.langpack.Lang override fun updateUI(delta: Float) { menubar.update(delta) - textArea.update(delta) + mouduleArea.update(delta) } override fun renderUI(batch: SpriteBatch, camera: Camera) { menubar.render(batch) batch.color = Color.WHITE - textArea.render(batch) + blendNormal() + mouduleArea.render(batch) } override fun doOpening(delta: Float) { @@ -113,4 +114,4 @@ import net.torvald.terrarum.langpack.Lang override fun dispose() { } -}*/ \ No newline at end of file +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/ui/UITitleRemoConRoot.kt b/src/net/torvald/terrarum/ui/UITitleRemoConRoot.kt index 6a82fbf36..aaafcb664 100644 --- a/src/net/torvald/terrarum/ui/UITitleRemoConRoot.kt +++ b/src/net/torvald/terrarum/ui/UITitleRemoConRoot.kt @@ -3,6 +3,9 @@ package net.torvald.terrarum.ui import com.badlogic.gdx.graphics.Camera import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.SpriteBatch +import net.torvald.random.HQRNG +import net.torvald.terrarum.Ingame +import net.torvald.terrarum.LoadScreen import net.torvald.terrarum.Terrarum class UITitleRemoConRoot : UICanvas() { @@ -45,20 +48,20 @@ class UITitleRemoConRoot : UICanvas() { ) - //private val paneCredits = UIHandler() private val remoConCredits = UITitleRemoConCredits(this) - private val remoConLanguage = UITitleRemoConLanguage(this) - + private val remoConModules = UITitleRemoConModules(this) init { remoConLanguage.setPosition(0, 0) remoConCredits.setPosition(0, 0) + remoConModules.setPosition(0, 0) addSubUI(remoConLanguage) addSubUI(remoConCredits) + addSubUI(remoConModules) //////////////////////////// @@ -68,6 +71,26 @@ class UITitleRemoConRoot : UICanvas() { // attach listeners + + // TEST TEST TEST + menubar.buttons[menuLabels.indexOf("MENU_MODE_SINGLEPLAYER")].clickOnceListener = { _, _, _ -> + this.setAsClose() + Thread.sleep(50) + + Terrarum.ingame = Ingame(Terrarum.batch) + Terrarum.ingame!!.gameLoadInfoPayload = Ingame.NewWorldParameters(2400, 800, HQRNG().nextLong()) + Terrarum.ingame!!.gameLoadMode = Ingame.GameLoadMode.CREATE_NEW + LoadScreen.screenToLoad = Terrarum.ingame!! + Terrarum.setScreen(LoadScreen) + } + + + + menubar.buttons[menuLabels.indexOf("MENU_MODULES")].clickOnceListener = { _, _, _ -> + this.setAsClose() + Thread.sleep(50) + remoConModules.setAsOpen() + } menubar.buttons[menuLabels.indexOf("MENU_LABEL_LANGUAGE")].clickOnceListener = { _, _, _ -> this.setAsClose() Thread.sleep(50) diff --git a/src/net/torvald/terrarum/worldgenerator/WorldGenerator.kt b/src/net/torvald/terrarum/worldgenerator/WorldGenerator.kt index a438d0596..554cdeb91 100644 --- a/src/net/torvald/terrarum/worldgenerator/WorldGenerator.kt +++ b/src/net/torvald/terrarum/worldgenerator/WorldGenerator.kt @@ -637,9 +637,8 @@ object WorldGenerator { val splineP3 = splineControlPoints[ clamp(x_1 + 2, 0, dirtStoneLine.size / POINTS_GAP) ].second.toFloat() if (x in POINTS_GAP - 1..WIDTH - 2 * POINTS_GAP) { - dirtStoneLine[x] = Math.round(FastMath.interpolateCatmullRom( + dirtStoneLine[x] = Math.round(FastMath.interpolateHermite( (x - splineX1) / POINTS_GAP.toFloat(), - -0.3f,//0.01f, splineP0, splineP1, splineP2, @@ -647,9 +646,8 @@ object WorldGenerator { )) } else { - dirtStoneLine[x] = Math.round(FastMath.interpolateCatmullRom( + dirtStoneLine[x] = Math.round(FastMath.interpolateHermite( (x - splineX1) / POINTS_GAP.toFloat(), - -0.3f,//0.01f, splineP0, splineP1, splineP2, diff --git a/work_files/GameDesign/MISC_MECHNANICS.md b/work_files/GameDesign/MISC_MECHNANICS.md index fd1eaa1b2..44b450da2 100644 --- a/work_files/GameDesign/MISC_MECHNANICS.md +++ b/work_files/GameDesign/MISC_MECHNANICS.md @@ -77,6 +77,9 @@ see SAVE_FORMAT.md Attacked thrice: All the NPCs within the same faction become hostile until the player is away + +Deceased HISTORICAL actors are stored to the inventory of DEBUG CHAR (id: 0x51621D) to make them not accidentally GC'd and for the lore. + ## Ownership of lands ## * Codex of Real Estate → assign owner to the tiles → copy the information to the NPC instance @@ -103,3 +106,12 @@ Villages can be either independent or part of larger country (_Dwarf Fortress_) Anything goes as long as it does not exceed TL11 of GURPS. Although the universe has the existence of traditional sorcery, the laws of physics of the universe itself is same as we know it. Simply put: NO FUCKING PERPETUAL MOTION AND PERFECT PROPHECY + + +## New light sim: Raytracer + +Only take NEAREST SUNLIGHT tile into render, as there will be not much artificial lights on the screen. + +Not sure about the performance, but it can be fully multi-threaded. + +"You know, the world can always use more ideas." - probably not Oxton \ No newline at end of file diff --git a/work_files/GameDesign/MODULE_IDEA_TECHPACK.md b/work_files/GameDesign/MODULE_IDEA_TECHPACK.md index 3c17f4304..e0157c70c 100644 --- a/work_files/GameDesign/MODULE_IDEA_TECHPACK.md +++ b/work_files/GameDesign/MODULE_IDEA_TECHPACK.md @@ -25,7 +25,7 @@ If things would run with infinite energy, I'm out. We need realism to implement + Transparent solar panel (window panel) - Capacitor + Battery pack - + Pu-238 RTG (super long-lasting battery with radiooactive taste) + + Pu-238 RTG (super long-lasting battery with radioactive taste) \ No newline at end of file diff --git a/work_files/GameDesign/TITLE_SCREEN.md b/work_files/GameDesign/TITLE_SCREEN.md index a630be429..8c8618f45 100644 --- a/work_files/GameDesign/TITLE_SCREEN.md +++ b/work_files/GameDesign/TITLE_SCREEN.md @@ -16,10 +16,10 @@ Simulation of the world, day and night fast, camera follows landscape # Singleplayer ## RemoCon -- New Character -- Delete Character -- Name -- Return +- New Character (CONTEXT_CHARACTER_NEW) +- Delete Character (CONTEXT_CHARACTER_DELETE) +- Rename (MENU_LABEL_RENAME -- check Polyglot project's Core Editing) +- Return (MENU_LABEL_RETURN) ## Panel - Character selection screen, limited to 8 entries @@ -31,15 +31,36 @@ Simulation of the world, day and night fast, camera follows landscape + Name --------- | Creation date | Last play date | Total play time + Name of the current universe | Number of multiverses (if >= 2) +### New Character +Step 1: + + +Step 2: +Select world or create new world +If personaCount > 1, new player can join the existing world or universe (if the universe contains multiple world, one can choose one of the world within the universe) + +### New World +Options: +- Size (MENU_OPTIONS_SIZE) + + Small (CONTEXT_DESCRIPTION_SMALL) + + Big (CONTEXT_DESCRIPTION_BIG) + + Huge (CONTEXT_DESCRIPTION_HUGE) +- More (MENU_LABEL_MORE) + + SEED (* Do-not-translate) + + # Options ## RemoCon -- Controls -- Graphics -- Gameplay Options +- Controls (MENU_OPTIONS_CONTROLS) +- Graphics (MENU_LABEL_GRAPHICS) +- Gameplay Options (MENU_OPTIONS_GAMEPLAY) - MIDI (* Do-not-translate) -- Return +- Return (MENU_LABEL_RETURN) + +Save configuration to disk upon Return + # Modules @@ -62,6 +83,8 @@ Simulation of the world, day and night fast, camera follows landscape ## RemoCon - Return +Save configuration to disk upon Return + ## Panel - List of languages available, click to change immediately diff --git a/work_files/GameDesign/TOOLS_MECHANICS.md b/work_files/GameDesign/TOOLS_MECHANICS.md new file mode 100644 index 000000000..e9f4fc008 --- /dev/null +++ b/work_files/GameDesign/TOOLS_MECHANICS.md @@ -0,0 +1,15 @@ +## Blocks + +Range: 4 Tiles default +Can only be placed if there's one or more solid tile near 4 blocks (plus-shaped arrangement) OR there's wall right behind it + + +## Pickaxe + +Range: 6-8+ tiles (higher range for higher tier) + + +## Sledgehammer + +Can only take down wall from the top (or bottom in reverse grav.) +