alloying furnace gui wip

This commit is contained in:
minjaesong
2024-03-10 01:36:52 +09:00
parent fa49874971
commit a298d6663b
15 changed files with 211 additions and 54 deletions

View File

@@ -46,6 +46,7 @@ id;classname;tags
45;net.torvald.terrarum.modulebasegame.gameitems.ItemLogicSignalLatch;FIXTURE,SIGNAL
46;net.torvald.terrarum.modulebasegame.gameitems.ItemLogicSignalRepeaterHorz;FIXTURE,SIGNAL
47;net.torvald.terrarum.modulebasegame.gameitems.ItemWrench;TOOL,WRENCH
48;net.torvald.terrarum.modulebasegame.gameitems.ItemAlloyingFurnace;FIXTURE,STATION
# ingots
112;net.torvald.terrarum.modulebasegame.gameitems.IngotCopper;INGOT
1 id classname tags
46 46 net.torvald.terrarum.modulebasegame.gameitems.ItemLogicSignalRepeaterHorz FIXTURE,SIGNAL
47 47 net.torvald.terrarum.modulebasegame.gameitems.ItemWrench TOOL,WRENCH
48 # ingots 48 net.torvald.terrarum.modulebasegame.gameitems.ItemAlloyingFurnace FIXTURE,STATION
49 # ingots
50 112 net.torvald.terrarum.modulebasegame.gameitems.IngotCopper INGOT
51 113 net.torvald.terrarum.modulebasegame.gameitems.IngotIron INGOT
52 114 net.torvald.terrarum.modulebasegame.gameitems.ItemCoalCoke COMBUSTIBLE

Binary file not shown.

View File

@@ -42,7 +42,8 @@
"TOOLTIP_item@basegame:28": "A music vending machine (free to play)",
"TOOLTIP_item@basegame:29": "A coal lookalike that burns just as well and is renewable",
"TOOLTIP_item@basegame:36": "Creates wires from metal ingots",
"TOOLTIP_item@basegame:47": "Reorients electronic components",
"TOOLTIP_item@basegame:47": "Reorients gadgets",
"TOOLTIP_item@basegame:48": "Melts two metal ingots to make a bar of alloy",
"TOOLTIP_item@basegame:114": "A precious fuel for the steel production",

View File

@@ -1,4 +1,5 @@
{
"ITEM_ALLOYING_FURNACE": "Alloying Furnace",
"ITEM_CALENDAR": "Calendar",
"ITEM_CHARCOAL": "Charcoal",
"ITEM_CHERRY_BOMB": "Bomb",

View File

@@ -41,7 +41,8 @@
"TOOLTIP_item@basegame:28": "음악 자판기입이다 (무료 플레이)",
"TOOLTIP_item@basegame:29": "석탄과 비슷하고 똑같이 잘 타지만 재생 가능합니다",
"TOOLTIP_item@basegame:36": "금속 주괴를 사용해 철사를 뽑아냅니다",
"TOOLTIP_item@basegame:47": "전자 장치의 방향을 바꿉니다",
"TOOLTIP_item@basegame:47": "기기의 방향을 바꿉니다",
"TOOLTIP_item@basegame:48": "두 금속 괴를 녹여 합금을 만듭니다",
"TOOLTIP_item@basegame:114": "강철 생산의 소중한 연료입니다",

View File

@@ -1,4 +1,5 @@
{
"ITEM_ALLOYING_FURNACE": "합금 화로",
"ITEM_CALENDAR": "달력",
"ITEM_CHARCOAL": "목탄",
"ITEM_CHERRY_BOMB": "폭탄",

View File

@@ -47,7 +47,7 @@ class EntryPoint : ModuleEntryPoint() {
}
}
}
println("\n[Basegame.EntryPoint] Welcome back!")
}

View File

@@ -20,13 +20,13 @@ import net.torvald.terrarum.gameitems.ItemID
import net.torvald.terrarum.gameparticles.ParticleVanishingSprite
import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.modulebasegame.TerrarumIngame
import net.torvald.terrarum.modulebasegame.ui.UISmelterBasic
import net.torvald.terrarum.modulebasegame.ui.UIAlloyingFurnace
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
/**
* Created by minjaesong on 2024-03-09.
*/
class FixtureAlloyingCrucible : FixtureBase {
class FixtureAlloyingFurnace : FixtureBase {
var fuelCaloriesNow = 0.0 // arbitrary number, may as well be watts or joules
@@ -146,7 +146,7 @@ class FixtureAlloyingCrucible : FixtureBase {
constructor() : super(
BlockBox(BlockBox.NO_COLLISION, 2, 2), // temporary value, will be overwritten by spawn()
nameFun = { Lang["ITEM_ALLOYING_SMELTER"] },
nameFun = { Lang["ITEM_ALLOYING_FURNACE"] },
) {
CommonResourcePool.addToLoadingList("particles-tiki_smoke.tga") {
TextureRegionPack(ModMgr.getGdxFile("basegame", "particles/bigger_smoke.tga"), 16, 16)
@@ -167,7 +167,7 @@ class FixtureAlloyingCrucible : FixtureBase {
actorValue[AVKey.BASEMASS] = 100.0
// this.mainUI = UIAlloyingCrucible(this)
this.mainUI = UIAlloyingFurnace(this)
}

View File

@@ -2,9 +2,7 @@ package net.torvald.terrarum.modulebasegame.gameitems
import com.badlogic.gdx.graphics.g2d.TextureRegion
import net.torvald.terrarum.CommonResourcePool
import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.gameitems.ItemID
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
/**
* Created by minjaesong on 2023-12-04.
@@ -18,4 +16,18 @@ class ItemSmelterBasic(originalID: ItemID) : FixtureItemBase(originalID, "net.to
override var baseToolSize: Double? = baseMass
override var originalName = "ITEM_SMELTER_SMALL"
}
/**
* Created by minjaesong on 2024-03-10.
*/
class ItemAlloyingFurnace(originalID: ItemID) : FixtureItemBase(originalID, "net.torvald.terrarum.modulebasegame.gameactors.FixtureAlloyingFurnace") {
override var baseMass = 100.0
override val canBeDynamic = false
override val materialId = ""
override val itemImage: TextureRegion
get() = CommonResourcePool.getAsItemSheet("basegame.items").get(13,3)
override var baseToolSize: Double? = baseMass
override var originalName = "ITEM_ALLOYING_FURNACE"
}

View File

@@ -14,10 +14,11 @@ import java.util.concurrent.atomic.AtomicInteger
*/
object SmelterGuiEventBuilder {
const val SLOT_INDEX_STRIDE = 16
const val PRODUCT_SLOT = 0
const val ORE_SLOT_FIRST = 1
const val FIRE_SLOT_FIRST = 2
const val ORE_SLOT_FIRST = SLOT_INDEX_STRIDE
const val FIRE_SLOT_FIRST = 2*SLOT_INDEX_STRIDE
@@ -25,7 +26,7 @@ object SmelterGuiEventBuilder {
clickedOnState: AtomicInteger,
fireboxItemStatus: SmelterItemStatus,
oreItemStatus: SmelterItemStatus,
oreItemStatus: List<SmelterItemStatus>,
getPlayerInventory: () -> ActorInventory,
@@ -42,7 +43,10 @@ object SmelterGuiEventBuilder {
// oreslot
if (amount != null && gameItem != null) {
if (clickedOnState.get() == ORE_SLOT_FIRST) {
val clicked = clickedOnState.get()
if (clicked in ORE_SLOT_FIRST until ORE_SLOT_FIRST + 16) {
val oreItemStatus = oreItemStatus[clicked - ORE_SLOT_FIRST]
if (oreItemStatus.itm == gameItem.dynamicID) {
playerInventory.remove(gameItem.dynamicID, amount)
oreItemStatus.changeCount(amount)
@@ -53,7 +57,7 @@ object SmelterGuiEventBuilder {
}
}
// firebox
else if (clickedOnState.get() == FIRE_SLOT_FIRST) {
else if (clicked == FIRE_SLOT_FIRST) {
if (fireboxItemStatus.isNull()) {
playerInventory.remove(gameItem.dynamicID, amount)
fireboxItemStatus.set(gameItem.dynamicID, amount)
@@ -73,7 +77,7 @@ object SmelterGuiEventBuilder {
clickedOnState: AtomicInteger,
fireboxItemStatus: SmelterItemStatus,
oreItemStatus: SmelterItemStatus,
oreItemStatus: List<SmelterItemStatus>,
getPlayerInventory: () -> ActorInventory,
@@ -83,33 +87,36 @@ object SmelterGuiEventBuilder {
val scrollY = -scrollY
if (gameItem != null) {
val addCount1 = scrollY.toLong()
val clicked = clickedOnState.get()
if (clicked in ORE_SLOT_FIRST until ORE_SLOT_FIRST + 16) {
val oreItemStatus = oreItemStatus[clicked - ORE_SLOT_FIRST]
if ((oreItemStatus.isNull() || oreItemStatus.itm == gameItem.dynamicID)) {
val itemToUse = oreItemStatus.itm ?: gameItem.dynamicID
if (clickedOnState.get() == ORE_SLOT_FIRST && (oreItemStatus.isNull() || oreItemStatus.itm == gameItem.dynamicID)) {
val itemToUse = oreItemStatus.itm ?: gameItem.dynamicID
val addCount2 = scrollY.toLong().coerceIn(
-(playerInventory.searchByID(itemToUse)?.qty ?: 0L),
oreItemStatus.qty ?: 0L,
)
val addCount2 = scrollY.toLong().coerceIn(
-(playerInventory.searchByID(itemToUse)?.qty ?: 0L),
oreItemStatus.qty ?: 0L,
)
// add to the inventory slot
if (oreItemStatus.isNotNull() && addCount1 >= 1L) {
playerInventory.add(oreItemStatus.itm!!, addCount2)
oreItemStatus.changeCount(-addCount2)
}
// remove from the inventory slot
else if (addCount1 <= -1L) {
playerInventory.remove(itemToUse, -addCount2)
if (oreItemStatus.isNull())
oreItemStatus.set(itemToUse, -addCount2)
else
// add to the inventory slot
if (oreItemStatus.isNotNull() && addCount1 >= 1L) {
playerInventory.add(oreItemStatus.itm!!, addCount2)
oreItemStatus.changeCount(-addCount2)
}
// remove from the inventory slot
else if (addCount1 <= -1L) {
playerInventory.remove(itemToUse, -addCount2)
if (oreItemStatus.isNull())
oreItemStatus.set(itemToUse, -addCount2)
else
oreItemStatus.changeCount(-addCount2)
}
if (oreItemStatus.qty == 0L) oreItemStatus.nullify()
else if (oreItemStatus.isNotNull() && oreItemStatus.qty!! < 0L) throw Error("Item removal count is larger than what was on the slot")
itemListUpdateKeepCurrentFilter()
}
if (oreItemStatus.qty == 0L) oreItemStatus.nullify()
else if (oreItemStatus.isNotNull() && oreItemStatus.qty!! < 0L) throw Error("Item removal count is larger than what was on the slot")
itemListUpdateKeepCurrentFilter()
}
else if (clickedOnState.get() == FIRE_SLOT_FIRST && (fireboxItemStatus.isNull() || fireboxItemStatus.itm == gameItem.dynamicID)) {
else if (clicked == FIRE_SLOT_FIRST && (fireboxItemStatus.isNull() || fireboxItemStatus.itm == gameItem.dynamicID)) {
val itemToUse = fireboxItemStatus.itm ?: gameItem.dynamicID
val addCount2 = scrollY.toLong().coerceIn(
@@ -149,7 +156,7 @@ object SmelterGuiEventBuilder {
playerThings: UITemplateHalfInventory,
oreItemStatus: SmelterItemStatus,
oreItemStatus: SmelterItemStatus, oreSlotIndex: Int,
getPlayerInventory: () -> ActorInventory,
@@ -157,8 +164,8 @@ object SmelterGuiEventBuilder {
itemListUpdateKeepCurrentFilter: () -> Unit
): (GameItem?, Long, Int, Any?, UIItemInventoryCellBase) -> Unit { return { gameItem: GameItem?, amount: Long, mouseButton: Int, itemExtraInfo: Any?, theButton: UIItemInventoryCellBase ->
if (clickedOnState.get() != ORE_SLOT_FIRST) {
clickedOnState.set(ORE_SLOT_FIRST)
if (clickedOnState.get() != ORE_SLOT_FIRST + oreSlotIndex) {
clickedOnState.set(ORE_SLOT_FIRST + oreSlotIndex)
theButton.forceHighlighted = true
buttonsToUnhighlight().forEach { it.forceHighlighted = false }
playerThings.itemList.itemPage = 0
@@ -186,7 +193,7 @@ object SmelterGuiEventBuilder {
fun getOreItemSlotWheelFun(
clickedOnState: AtomicInteger,
oreItemStatus: SmelterItemStatus,
oreItemStatus: SmelterItemStatus, oreSlotIndex: Int,
getPlayerInventory: () -> ActorInventory,
@@ -195,7 +202,7 @@ object SmelterGuiEventBuilder {
): (GameItem?, Long, Float, Float, Any?, UIItemInventoryCellBase) -> Unit { return { gameItem: GameItem?, amount: Long, scrollX: Float, scrollY: Float, itemExtraInfo: Any?, theButton: UIItemInventoryCellBase ->
val playerInventory = getPlayerInventory()
val scrollY = -scrollY
if (clickedOnState.get() == ORE_SLOT_FIRST && oreItemStatus.isNotNull()) {
if (clickedOnState.get() == ORE_SLOT_FIRST + oreSlotIndex && oreItemStatus.isNotNull()) {
val removeCount1 = scrollY.toLong()
val removeCount2 = scrollY.toLong().coerceIn(
-oreItemStatus.qty!!,

View File

@@ -0,0 +1,132 @@
package net.torvald.terrarum.modulebasegame.ui
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.OrthographicCamera
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.App
import net.torvald.terrarum.CommonResourcePool
import net.torvald.terrarum.INGAME
import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.modulebasegame.gameactors.ActorInventory
import net.torvald.terrarum.modulebasegame.gameactors.FixtureAlloyingFurnace
import net.torvald.terrarum.modulebasegame.gameactors.InventoryPair
import net.torvald.terrarum.ui.Toolkit
import net.torvald.terrarum.ui.UICanvas
import net.torvald.terrarum.ui.UIItemCatBar
import net.torvald.terrarum.ui.UIItemInventoryElemWide
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
import java.util.concurrent.atomic.AtomicInteger
class UIAlloyingFurnace(smelter: FixtureAlloyingFurnace) : UICanvas(
toggleKeyLiteral = "control_key_inventory",
toggleButtonLiteral = "control_gamepad_start"
) {
override var width = Toolkit.drawWidth
override var height = App.scr.height
private var clickedOnState = AtomicInteger(SmelterGuiEventBuilder.PRODUCT_SLOT) // Used to set inventory filter and its behaviour. 0: default, 1: oreslot, 2: firebox
private val playerThings = UITemplateHalfInventory(this, false).also {
it.itemListTouchDownFun = SmelterGuiEventBuilder.getPlayerSlotTouchDownFun(
clickedOnState,
smelter.fireboxItemStatus,
listOf(smelter.oreItem1Status, smelter.oreItem2Status),
{ getPlayerInventory() },
{ itemListUpdateKeepCurrentFilter() }
)
it.itemListWheelFun = SmelterGuiEventBuilder.getPlayerSlotWheelFun(
clickedOnState,
smelter.fireboxItemStatus,
listOf(smelter.oreItem1Status, smelter.oreItem2Status),
{ getPlayerInventory() },
{ itemListUpdateKeepCurrentFilter() }
)
}
fun getPlayerInventory(): ActorInventory = INGAME.actorNowPlaying!!.inventory
init {
CommonResourcePool.addToLoadingList("basegame_gui_smelter_icons") {
TextureRegionPack(ModMgr.getGdxFile("basegame", "gui/smelter_icons.tga"), 20, 20)
}
CommonResourcePool.loadAll()
}
private val smelterCellIcons = CommonResourcePool.getAsTextureRegionPack("basegame_gui_smelter_icons")
private var smelterBackdrops =
CommonResourcePool.getAsTextureRegionPack("basegame/sprites/fixtures/alloying_furnace.tga")
private val leftPanelWidth = playerThings.width
private val leftPanelHeight = playerThings.height
private val leftPanelX = playerThings.posX - leftPanelWidth - UIItemInventoryItemGrid.listGap - UIItemInventoryElemWide.height
private val leftPanelY = playerThings.posY
private val backdropColour = Color(0x999999_c8.toInt())
private val backdropZoom = 6
private val backdropX = (leftPanelX + (leftPanelWidth - smelterBackdrops.tileW * backdropZoom) / 2).toFloat()
private val backdropY = (leftPanelY + (leftPanelHeight - smelterBackdrops.tileH * backdropZoom) / 2).toFloat()
private val oreX1 = backdropX + 6 * backdropZoom + 6
private val oreX2 = backdropX + 18 * backdropZoom + 6
private val oreY = backdropY + 23 * backdropZoom + 3
private val fireboxX = backdropX + 12 * backdropZoom + 6
private val fireboxY = backdropY + 39 * backdropZoom + 3
private val productX = backdropX + 37 * backdropZoom + 3
private val productY = backdropY + 39 * backdropZoom + 3
private val thermoX = (backdropX + 24 * backdropZoom + 1).toInt()
private val thermoY = (backdropY + 39 * backdropZoom + 3).toInt()
private var encumbrancePerc = 0f
private fun itemListUpdate() {
// let itemlists be sorted
inventoryFilter = { _: InventoryPair -> true }
playerThings.rebuild(UIItemCatBar.FILTER_CAT_ALL)
encumbrancePerc = getPlayerInventory().encumberment.toFloat()
}
private var inventoryFilter = { _: InventoryPair -> true }
private fun itemListUpdate(filter: (InventoryPair) -> Boolean) {
// let itemlists be sorted
inventoryFilter = filter
playerThings.rebuild(filter)
encumbrancePerc = getPlayerInventory().encumberment.toFloat()
}
private fun itemListUpdateKeepCurrentFilter() {
// let itemlists be sorted
playerThings.rebuild(inventoryFilter)
encumbrancePerc = getPlayerInventory().encumberment.toFloat()
}
init {
addUIitem(playerThings)
// addUIitem(oreItemSlot)
// addUIitem(fireboxItemSlot)
// addUIitem(productItemslot)
}
override fun updateImpl(delta: Float) {
TODO("Not yet implemented")
}
override fun renderImpl(frameDelta: Float, batch: SpriteBatch, camera: OrthographicCamera) {
TODO("Not yet implemented")
}
override fun dispose() {
TODO("Not yet implemented")
}
}

View File

@@ -10,6 +10,7 @@ import net.torvald.terrarum.modulebasegame.gameactors.ActorInventory
import net.torvald.terrarum.modulebasegame.gameactors.FixtureSmelterBasic
import net.torvald.terrarum.modulebasegame.gameactors.InventoryPair
import net.torvald.terrarum.modulebasegame.ui.SmelterGuiEventBuilder.PRODUCT_SLOT
import net.torvald.terrarum.modulebasegame.ui.SmelterGuiEventBuilder.SLOT_INDEX_STRIDE
import net.torvald.terrarum.modulebasegame.ui.UIItemInventoryCellCommonRes.tooltipShowing
import net.torvald.terrarum.ui.*
import net.torvald.terrarum.ui.UIItemCatBar.Companion.FILTER_CAT_ALL
@@ -37,14 +38,14 @@ class UISmelterBasic(val smelter: FixtureSmelterBasic) : UICanvas(
it.itemListTouchDownFun = SmelterGuiEventBuilder.getPlayerSlotTouchDownFun(
clickedOnState,
smelter.fireboxItemStatus,
smelter.oreItemStatus,
listOf(smelter.oreItemStatus),
{ getPlayerInventory() },
{ itemListUpdateKeepCurrentFilter() }
)
it.itemListWheelFun = SmelterGuiEventBuilder.getPlayerSlotWheelFun(
clickedOnState,
smelter.fireboxItemStatus,
smelter.oreItemStatus,
listOf(smelter.oreItemStatus),
{ getPlayerInventory() },
{ itemListUpdateKeepCurrentFilter() }
)
@@ -112,14 +113,14 @@ class UISmelterBasic(val smelter: FixtureSmelterBasic) : UICanvas(
clickedOnState,
{ listOf(fireboxItemSlot) },
playerThings,
smelter.oreItemStatus,
smelter.oreItemStatus, 1,
{ getPlayerInventory() },
{ filter -> itemListUpdate(filter) },
{ itemListUpdateKeepCurrentFilter() }
),
wheelFun = SmelterGuiEventBuilder.getOreItemSlotWheelFun(
clickedOnState,
smelter.oreItemStatus,
smelter.oreItemStatus, 1,
{ getPlayerInventory() },
{ itemListUpdateKeepCurrentFilter() }
)
@@ -309,7 +310,7 @@ class UISmelterBasic(val smelter: FixtureSmelterBasic) : UICanvas(
override fun renderImpl(frameDelta: Float, batch: SpriteBatch, camera: OrthographicCamera) {
val clickedOn = clickedOnState.get()
val clickedOn = clickedOnState.get() / SLOT_INDEX_STRIDE
batch.color = backdropColour