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 {
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 {
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.g2d.SpriteBatch
import com.badlogic.gdx.graphics.g2d.TextureRegion
import com.badlogic.gdx.utils.Json
import net.torvald.terrarum.*
import net.torvald.terrarum.gameactors.AVKey
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.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.EntryFile
import net.torvald.terrarum.serialise.ascii85toUUID
import net.torvald.terrarum.ui.Toolkit
import net.torvald.terrarum.ui.UICanvas
import net.torvald.terrarum.ui.UIItem
import net.torvald.terrarum.ui.UIItemTextButton
import net.torvald.terrarum.utils.JsonFetcher
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
import java.util.*
import kotlin.math.roundToInt
/**
* Created by minjaesong on 2023-05-19.
@@ -30,7 +38,7 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() {
private val buttonHeight = 24
private val gridGap = listGap
private val worldList = ArrayList<Pair<UUID, DiskSkimmer>>()
private val worldList = ArrayList<WorldInfo>()
private var selectedWorld: DiskSkimmer? = null
@@ -48,8 +56,9 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() {
private val listCount = UIInventoryFull.CELLS_VRT
private val listHeight = cellHeight * listCount + gridGap * (listCount - 1)
private val deleteButtonWidth = 80
private val buttonReset = UIItemTextButton(this,
private val memoryGaugeWidth = 360
private val deleteButtonWidth = (memoryGaugeWidth - gridGap) / 2
private val buttonDeleteWorld = UIItemTextButton(this,
"MENU_LABEL_DELETE_WORLD",
hx - gridGap/2 - deleteButtonWidth,
y + listHeight - buttonHeight,
@@ -58,34 +67,68 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() {
hasBorder = true,
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 {
CommonResourcePool.addToLoadingList("terrarum-basegame-worldportalicons") {
TextureRegion(Texture(ModMgr.getGdxFile("basegame", "gui/worldportal_catbar.tga")), 20, 20).also {
it.flip(false, false)
}
TextureRegionPack(ModMgr.getGdxFile("basegame", "gui/worldportal_catbar.tga"), 20, 20)
}
CommonResourcePool.loadAll()
addUIitem(buttonReset)
addUIitem(buttonRenameWorld)
addUIitem(buttonDeleteWorld)
}
private var chunksUsed = 0
private val chunksMax = 100000
override fun show() {
worldList.clear()
worldList.addAll((INGAME.actorGamer.actorValue.getAsString(AVKey.WORLD_PORTAL_DICT) ?: "").split(",").filter { it.isNotBlank() }.map {
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 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 //
// screencap panel
@@ -97,8 +140,19 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() {
// screencap panel
batch.color = highlightCol
Toolkit.drawBoxBorder(batch, hx - thumbw - gridGap/2 - 1, y - 1, thumbw + 2, thumbh + 2)
// 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) }

View File

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

View File

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

View File

@@ -3,6 +3,7 @@ package net.torvald.terrarum.utils
import com.badlogic.gdx.utils.JsonReader
import com.badlogic.gdx.utils.JsonValue
import net.torvald.terrarum.App.printdbg
import java.io.Reader
/**
* Created by minjaesong on 2016-02-15.
@@ -18,9 +19,7 @@ object JsonFetcher {
printdbg(this, "Reading JSON $jsonFilePath")
if (jsonString == null) {
throw Error("[JsonFetcher] jsonString is null!")
}
if (jsonString == null) throw Error("[JsonFetcher] jsonString is null!")
return JsonReader().parse(jsonString.toString())
}
@@ -32,13 +31,15 @@ object JsonFetcher {
printdbg(this, "Reading JSON ${jsonFile.path}")
if (jsonString == null) {
throw Error("[JsonFetcher] jsonString is null!")
}
if (jsonString == null) throw Error("[JsonFetcher] jsonString is null!")
return JsonReader().parse(jsonString.toString())
}
fun readFromJsonString(stringReader: Reader): JsonValue {
return JsonReader().parse(stringReader.readText())
}
@Throws(java.io.IOException::class)
private fun readJsonFileAsString(path: String) {
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
+ Players
- "${PlayerName}-${UUID}", TVDA {
- "${UUID}", TVDA {
[-1] player JSON,
[-2] spritedef,
[-3] !optional! spritedef-glow,
@@ -23,7 +23,7 @@ The main game directory is composed of following directories:
- <e.g. Disk GUID>, TEVD { * }
- <this directory can have anything>
+ Worlds
- "${WorldName}-${UUID}", TVDA {
- "${UUID}", TVDA {
[-1] world JSON with Player Data,
[actorID] actors (mainly fixtures) JSON,
[0x1_0000_0000L or (layerNumber shl 24) or chunkNumber] chunk data,