world portal gui wip

This commit is contained in:
minjaesong
2023-05-28 20:55:47 +09:00
parent ef6f39632d
commit 76bfc0fde4
6 changed files with 77 additions and 20 deletions

View File

@@ -67,7 +67,7 @@ abstract class UIItemInventoryCellBase(
object UIItemInventoryCellCommonRes { object UIItemInventoryCellCommonRes {
val meterColourMap = GdxColorMap(Gdx.files.internal("./assets/clut/health_bar_colouring_4096.tga")) val meterColourMap = GdxColorMap(Gdx.files.internal("./assets/clut/health_bar_colouring_4096.tga"))
val meterBackDarkening = Color(0x828282ff.toInt()) val meterBackDarkening = Color(0x666666ff.toInt())
fun getHealthMeterColour(value: Float, start: Float, end: Float): Color { fun getHealthMeterColour(value: Float, start: Float, end: Float): Color {
if (start > end) throw IllegalArgumentException("Start value is greater than end value: $start..$end") if (start > end) throw IllegalArgumentException("Start value is greater than end value: $start..$end")

View File

@@ -5,17 +5,25 @@ import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.g2d.TextureRegion
import com.badlogic.gdx.utils.Json
import net.torvald.terrarum.* import net.torvald.terrarum.*
import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.AVKey
import net.torvald.terrarum.modulebasegame.ui.UIInventoryFull.Companion.INVENTORY_CELLS_OFFSET_Y import net.torvald.terrarum.modulebasegame.ui.UIInventoryFull.Companion.INVENTORY_CELLS_OFFSET_Y
import net.torvald.terrarum.modulebasegame.ui.UIItemInventoryItemGrid.Companion.listGap import net.torvald.terrarum.modulebasegame.ui.UIItemInventoryItemGrid.Companion.listGap
import net.torvald.terrarum.realestate.LandUtil.CHUNK_H
import net.torvald.terrarum.realestate.LandUtil.CHUNK_W
import net.torvald.terrarum.savegame.ByteArray64Reader
import net.torvald.terrarum.savegame.DiskSkimmer import net.torvald.terrarum.savegame.DiskSkimmer
import net.torvald.terrarum.savegame.EntryFile
import net.torvald.terrarum.serialise.ascii85toUUID import net.torvald.terrarum.serialise.ascii85toUUID
import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarum.ui.Toolkit
import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UICanvas
import net.torvald.terrarum.ui.UIItem import net.torvald.terrarum.ui.UIItem
import net.torvald.terrarum.ui.UIItemTextButton import net.torvald.terrarum.ui.UIItemTextButton
import net.torvald.terrarum.utils.JsonFetcher
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
import java.util.* import java.util.*
import kotlin.math.roundToInt
/** /**
* Created by minjaesong on 2023-05-19. * Created by minjaesong on 2023-05-19.
@@ -30,7 +38,7 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() {
private val buttonHeight = 24 private val buttonHeight = 24
private val gridGap = listGap private val gridGap = listGap
private val worldList = ArrayList<Pair<UUID, DiskSkimmer>>() private val worldList = ArrayList<WorldInfo>()
private var selectedWorld: DiskSkimmer? = null private var selectedWorld: DiskSkimmer? = null
@@ -48,8 +56,9 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() {
private val listCount = UIInventoryFull.CELLS_VRT private val listCount = UIInventoryFull.CELLS_VRT
private val listHeight = cellHeight * listCount + gridGap * (listCount - 1) private val listHeight = cellHeight * listCount + gridGap * (listCount - 1)
private val deleteButtonWidth = 80 private val memoryGaugeWidth = 360
private val buttonReset = UIItemTextButton(this, private val deleteButtonWidth = (memoryGaugeWidth - gridGap) / 2
private val buttonDeleteWorld = UIItemTextButton(this,
"MENU_LABEL_DELETE_WORLD", "MENU_LABEL_DELETE_WORLD",
hx - gridGap/2 - deleteButtonWidth, hx - gridGap/2 - deleteButtonWidth,
y + listHeight - buttonHeight, y + listHeight - buttonHeight,
@@ -58,34 +67,68 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() {
hasBorder = true, hasBorder = true,
alignment = UIItemTextButton.Companion.Alignment.CENTRE alignment = UIItemTextButton.Companion.Alignment.CENTRE
) )
private val buttonRenameWorld = UIItemTextButton(this,
"MENU_LABEL_RENAME",
buttonDeleteWorld.posX - gridGap - deleteButtonWidth,
y + listHeight - buttonHeight,
deleteButtonWidth,
readFromLang = true,
hasBorder = true,
alignment = UIItemTextButton.Companion.Alignment.CENTRE
)
data class WorldInfo(
val uuid: UUID,
val diskSkimmer: DiskSkimmer,
val dimensionInChunks: Int
)
init { init {
CommonResourcePool.addToLoadingList("terrarum-basegame-worldportalicons") { CommonResourcePool.addToLoadingList("terrarum-basegame-worldportalicons") {
TextureRegion(Texture(ModMgr.getGdxFile("basegame", "gui/worldportal_catbar.tga")), 20, 20).also { TextureRegionPack(ModMgr.getGdxFile("basegame", "gui/worldportal_catbar.tga"), 20, 20)
it.flip(false, false)
}
} }
CommonResourcePool.loadAll() CommonResourcePool.loadAll()
addUIitem(buttonReset) addUIitem(buttonRenameWorld)
addUIitem(buttonDeleteWorld)
} }
private var chunksUsed = 0
private val chunksMax = 100000
override fun show() { override fun show() {
worldList.clear() worldList.clear()
worldList.addAll((INGAME.actorGamer.actorValue.getAsString(AVKey.WORLD_PORTAL_DICT) ?: "").split(",").filter { it.isNotBlank() }.map { worldList.addAll((INGAME.actorGamer.actorValue.getAsString(AVKey.WORLD_PORTAL_DICT) ?: "").split(",").filter { it.isNotBlank() }.map {
it.ascii85toUUID().let { it to App.savegameWorlds[it] } it.ascii85toUUID().let { it to App.savegameWorlds[it] }
}.filter { it.second != null } as List<Pair<UUID, DiskSkimmer>>) }.filter { it.second != null }.map { (uuid, disk) ->
chunksUsed = worldList.sumOf {
var w = 0
var h = 0
JsonFetcher.readFromJsonString(ByteArray64Reader((disk!!.requestFile(-1)!!.contents.getContent() as EntryFile).bytes, Charsets.UTF_8)).let {
JsonFetcher.forEachSiblings(it) { name, value ->
if (name == "width") w = value.asInt()
if (name == "height") h = value.asInt()
}
}
(w / CHUNK_W) * (h / CHUNK_H)
}
WorldInfo(uuid, disk!!, chunksUsed)
} as List<WorldInfo>)
chunksUsed = worldList.sumOf { it.dimensionInChunks }
} }
override fun updateUI(delta: Float) { override fun updateUI(delta: Float) {
} }
override fun renderUI(batch: SpriteBatch, camera: Camera) {
override fun renderUI(batch: SpriteBatch, camera: Camera) {
val memoryGaugeXpos = hx - memoryGaugeWidth - gridGap/2
val memoryGaugeYpos = y + listHeight - buttonHeight - gridGap - buttonHeight
val icons = CommonResourcePool.getAsTextureRegionPack("terrarum-basegame-worldportalicons")
// draw background // // draw background //
// screencap panel // screencap panel
@@ -97,8 +140,19 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() {
// screencap panel // screencap panel
batch.color = highlightCol batch.color = highlightCol
Toolkit.drawBoxBorder(batch, hx - thumbw - gridGap/2 - 1, y - 1, thumbw + 2, thumbh + 2) Toolkit.drawBoxBorder(batch, hx - thumbw - gridGap/2 - 1, y - 1, thumbw + 2, thumbh + 2)
// memory gauge // memory gauge
Toolkit.drawBoxBorder(batch, hx - 330 - gridGap/2 - 1, y + listHeight - 1, 240 + 2, buttonHeight + 2) val barCol = UIItemInventoryCellCommonRes.getHealthMeterColour(chunksMax - chunksUsed, 0, chunksMax)
val barBack = barCol mul UIItemInventoryCellCommonRes.meterBackDarkening
batch.color = Color.WHITE
batch.draw(icons.get(2, 2), memoryGaugeXpos - 32f, memoryGaugeYpos + 2f)
Toolkit.drawBoxBorder(batch, memoryGaugeXpos - 1, memoryGaugeYpos - 1, memoryGaugeWidth + 2, buttonHeight + 2)
batch.color = barBack
Toolkit.fillArea(batch, memoryGaugeXpos, memoryGaugeYpos, memoryGaugeWidth, buttonHeight)
batch.color = barCol
Toolkit.fillArea(batch, memoryGaugeXpos, memoryGaugeYpos, (memoryGaugeWidth * (chunksUsed / chunksMax.toFloat())).ceilInt(), buttonHeight)
uiItems.forEach { it.render(batch, camera) } uiItems.forEach { it.render(batch, camera) }

View File

@@ -363,6 +363,8 @@ removefile:
return fa.read() return fa.read()
} }
override fun getDiskName(charset: Charset): String { override fun getDiskName(charset: Charset): String {
val bytes = ByteArray(268) val bytes = ByteArray(268)
fa.seek(10L) fa.seek(10L)

View File

@@ -81,7 +81,7 @@ open class UIItemTextButton(
Alignment.LEFT -> posX + paddingLeft Alignment.LEFT -> posX + paddingLeft
Alignment.RIGHT -> width - paddingRight - textW Alignment.RIGHT -> width - paddingRight - textW
} }
val fontY = posY + (hitboxSize - font.lineHeight.toInt()) / 2 val fontY = posY + 2 + (hitboxSize - font.lineHeight.toInt()) / 2
// draw background // draw background

View File

@@ -3,6 +3,7 @@ package net.torvald.terrarum.utils
import com.badlogic.gdx.utils.JsonReader import com.badlogic.gdx.utils.JsonReader
import com.badlogic.gdx.utils.JsonValue import com.badlogic.gdx.utils.JsonValue
import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.App.printdbg
import java.io.Reader
/** /**
* Created by minjaesong on 2016-02-15. * Created by minjaesong on 2016-02-15.
@@ -18,9 +19,7 @@ object JsonFetcher {
printdbg(this, "Reading JSON $jsonFilePath") printdbg(this, "Reading JSON $jsonFilePath")
if (jsonString == null) { if (jsonString == null) throw Error("[JsonFetcher] jsonString is null!")
throw Error("[JsonFetcher] jsonString is null!")
}
return JsonReader().parse(jsonString.toString()) return JsonReader().parse(jsonString.toString())
} }
@@ -32,13 +31,15 @@ object JsonFetcher {
printdbg(this, "Reading JSON ${jsonFile.path}") printdbg(this, "Reading JSON ${jsonFile.path}")
if (jsonString == null) { if (jsonString == null) throw Error("[JsonFetcher] jsonString is null!")
throw Error("[JsonFetcher] jsonString is null!")
}
return JsonReader().parse(jsonString.toString()) return JsonReader().parse(jsonString.toString())
} }
fun readFromJsonString(stringReader: Reader): JsonValue {
return JsonReader().parse(stringReader.readText())
}
@Throws(java.io.IOException::class) @Throws(java.io.IOException::class)
private fun readJsonFileAsString(path: String) { private fun readJsonFileAsString(path: String) {
java.nio.file.Files.lines(java.nio.file.FileSystems.getDefault().getPath(path)).forEach( java.nio.file.Files.lines(java.nio.file.FileSystems.getDefault().getPath(path)).forEach(

View File

@@ -7,7 +7,7 @@ The main game directory is composed of following directories:
``` ```
.Terrarum .Terrarum
+ Players + Players
- "${PlayerName}-${UUID}", TVDA { - "${UUID}", TVDA {
[-1] player JSON, [-1] player JSON,
[-2] spritedef, [-2] spritedef,
[-3] !optional! spritedef-glow, [-3] !optional! spritedef-glow,
@@ -23,7 +23,7 @@ The main game directory is composed of following directories:
- <e.g. Disk GUID>, TEVD { * } - <e.g. Disk GUID>, TEVD { * }
- <this directory can have anything> - <this directory can have anything>
+ Worlds + Worlds
- "${WorldName}-${UUID}", TVDA { - "${UUID}", TVDA {
[-1] world JSON with Player Data, [-1] world JSON with Player Data,
[actorID] actors (mainly fixtures) JSON, [actorID] actors (mainly fixtures) JSON,
[0x1_0000_0000L or (layerNumber shl 24) or chunkNumber] chunk data, [0x1_0000_0000L or (layerNumber shl 24) or chunkNumber] chunk data,