diff --git a/assets/mods/basegame/blocks/blocks.csv b/assets/mods/basegame/blocks/blocks.csv index 403b2ba9d..56525d040 100644 --- a/assets/mods/basegame/blocks/blocks.csv +++ b/assets/mods/basegame/blocks/blocks.csv @@ -41,12 +41,12 @@ "75";"item@basegame:171";"item@basegame:171";"BLOCK_TRUNK_ROSEWOOD";"0.0312";"0.0312";"0.0312";"0.0312";"17";"900";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREETRUNK,TREELARGE,NATURAL" # sabulous -"80";"80";"80";"BLOCK_SAND";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1600";"SAND";"1";"0";"0";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"SAND,NATURAL,WARM" -"81";"81";"81";"BLOCK_SAND_WHITE";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1600";"SAND";"1";"0";"0";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"SAND,NATURAL,WARM" -"82";"82";"82";"BLOCK_SAND_RED";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1600";"SAND";"1";"0";"0";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"SAND,NATURAL,WARM" -"83";"83";"83";"BLOCK_SAND_DESERT";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1600";"SAND";"1";"0";"0";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"SAND,NATURAL,WARM" -"84";"84";"84";"BLOCK_SAND_BLACK";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1600";"SAND";"1";"0";"0";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"SAND,NATURAL,WARM" -"85";"85";"85";"BLOCK_SAND_GREEN";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1600";"SAND";"1";"0";"0";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"SAND,NATURAL,WARM" +"80";"80";"80";"BLOCK_SAND";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1600";"SAND";"1";"0";"0";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"SAND,NATURAL,WARM,SMELTABLE" +"81";"81";"81";"BLOCK_SAND_WHITE";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1600";"SAND";"1";"0";"0";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"SAND,NATURAL,WARM,SMELTABLE" +"82";"82";"82";"BLOCK_SAND_RED";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1600";"SAND";"1";"0";"0";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"SAND,NATURAL,WARM,SMELTABLE" +"83";"83";"83";"BLOCK_SAND_DESERT";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1600";"SAND";"1";"0";"0";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"SAND,NATURAL,WARM,SMELTABLE" +"84";"84";"84";"BLOCK_SAND_BLACK";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1600";"SAND";"1";"0";"0";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"SAND,NATURAL,WARM,SMELTABLE" +"85";"85";"85";"BLOCK_SAND_GREEN";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1600";"SAND";"1";"0";"0";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"SAND,NATURAL,WARM,SMELTABLE" "96";"96";"96";"BLOCK_GRAVEL";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1700";"GRVL";"1";"0";"0";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GRAVEL,NATURAL" "97";"97";"97";"BLOCK_GRAVEL_GREY";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1700";"GRVL";"1";"0";"0";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GRAVEL,NATURAL" diff --git a/assets/mods/basegame/commands.csv b/assets/mods/basegame/commands.csv index d3692f183..c7e32c888 100644 --- a/assets/mods/basegame/commands.csv +++ b/assets/mods/basegame/commands.csv @@ -10,6 +10,7 @@ GetAV GetFaction GetLocale GetTime +HasItem ImportLayerData ImportWorld Inventory diff --git a/assets/mods/basegame/items/itemid.csv b/assets/mods/basegame/items/itemid.csv index eb93a1a1c..682847e05 100644 --- a/assets/mods/basegame/items/itemid.csv +++ b/assets/mods/basegame/items/itemid.csv @@ -48,7 +48,6 @@ id;classname;tags 47;net.torvald.terrarum.modulebasegame.gameitems.ItemWrench;TOOL,WRENCH # ingots -26;net.torvald.terrarum.modulebasegame.gameitems.IngotSteel;INGOT 112;net.torvald.terrarum.modulebasegame.gameitems.IngotCopper;INGOT 113;net.torvald.terrarum.modulebasegame.gameitems.IngotIron;INGOT 114;net.torvald.terrarum.modulebasegame.gameitems.ItemCoalCoke;COMBUSTIBLE @@ -58,6 +57,15 @@ id;classname;tags 118;net.torvald.terrarum.modulebasegame.gameitems.IngotSilver;INGOT 119;net.torvald.terrarum.modulebasegame.gameitems.IngotLead;INGOT +# alloys +26;net.torvald.terrarum.modulebasegame.gameitems.IngotSteel;INGOT,ALLOY +176;net.torvald.terrarum.modulebasegame.gameitems.IngotBronze;INGOT,ALLOY +177;net.torvald.terrarum.modulebasegame.gameitems.IngotBrass;INGOT,ALLOY +178;net.torvald.terrarum.modulebasegame.gameitems.IngotElectrum;INGOT,ALLOY +179;net.torvald.terrarum.modulebasegame.gameitems.IngotSilverBillon;INGOT,ALLOY +180;net.torvald.terrarum.modulebasegame.gameitems.IngotRosegold;INGOT,ALLOY +181;net.torvald.terrarum.modulebasegame.gameitems.IngotSolder;INGOT,ALLOY + # ores 128;net.torvald.terrarum.modulebasegame.gameitems.OreCopper;SMELTABLE 129;net.torvald.terrarum.modulebasegame.gameitems.OreIron;SMELTABLE @@ -82,10 +90,10 @@ id;classname;tags 163;net.torvald.terrarum.modulebasegame.gameitems.ItemSeedRosewood;SEEDLING # tree logs -168;net.torvald.terrarum.modulebasegame.gameitems.ItemLogsOak;COMBUSTIBLE,SMELTABLE -169;net.torvald.terrarum.modulebasegame.gameitems.ItemLogsEbony;COMBUSTIBLE,SMELTABLE -170;net.torvald.terrarum.modulebasegame.gameitems.ItemLogsBirch;COMBUSTIBLE,SMELTABLE -171;net.torvald.terrarum.modulebasegame.gameitems.ItemLogsRosewood;COMBUSTIBLE,SMELTABLE +168;net.torvald.terrarum.modulebasegame.gameitems.ItemLogsOak;COMBUSTIBLE,SMELTABLE,LOGS +169;net.torvald.terrarum.modulebasegame.gameitems.ItemLogsEbony;COMBUSTIBLE,SMELTABLE,LOGS +170;net.torvald.terrarum.modulebasegame.gameitems.ItemLogsBirch;COMBUSTIBLE,SMELTABLE,LOGS +171;net.torvald.terrarum.modulebasegame.gameitems.ItemLogsRosewood;COMBUSTIBLE,SMELTABLE,LOGS 256;net.torvald.terrarum.modulebasegame.gameitems.ItemSwingingDoorOak;FIXTURE diff --git a/assets/mods/basegame/smelting/alloys.json b/assets/mods/basegame/smelting/alloys.json new file mode 100644 index 000000000..7113b439d --- /dev/null +++ b/assets/mods/basegame/smelting/alloys.json @@ -0,0 +1,27 @@ +{ + /* as for the plus operator, the itemIDs must be sorted lexicographically and first word should come left */ + "item@basegame:112+item@basegame:116": { /* copper + tin -> bronze */ + "difficulty": 1.0, + "product": [1, "item@basegame:176"] + }, + "item@basegame:112+item@basegame:115": { /* copper + zinc -> brass */ + "difficulty": 1.0, + "product": [1, "item@basegame:177"] + }, + "item@basegame:117+item@basegame:118": { /* gold + silver -> electrum */ + "difficulty": 1.0, + "product": [1, "item@basegame:178"] + }, + "item@basegame:112+item@basegame:118": { /* copper + silver -> silver billon */ + "difficulty": 1.0, + "product": [1, "item@basegame:179"] + }, + "item@basegame:112+item@basegame:117": { /* copper + gold -> rose gold */ + "difficulty": 1.0, + "product": [1, "item@basegame:180"] + }, + "item@basegame:116+item@basegame:119": { /* tin + lead -> solder */ + "difficulty": 1.0, + "product": [1, "item@basegame:181"] + } +} \ No newline at end of file diff --git a/assets/mods/basegame/smelting/single_item.json b/assets/mods/basegame/smelting/single_item.json new file mode 100644 index 000000000..cb7363251 --- /dev/null +++ b/assets/mods/basegame/smelting/single_item.json @@ -0,0 +1,48 @@ +{ + "$SAND": { /* sand -> crude glass */ + "difficulty": 1.0, + "product": [1, "basegame:148"] + }, + "item@basegame:144": { /* quartz -> clean glass */ + "difficulty": 1.0, + "product": [1, "basegame:149"] + }, + + "$LOGS": { /* logs -> charcoal */ + "difficulty": 1.0, + "product": [1, "item@basegame:29"] + }, + + "item@basegame:128": { /* copper ore -> ingot */ + "difficulty": 1.0, + "product": [1, "item@basegame:112"] + }, + "item@basegame:129": { /* iron ore -> ingot */ + "difficulty": 1.0, + "product": [1, "item@basegame:113"] + }, + "item@basegame:130": { /* coal -> coke */ + "difficulty": 1.0, + "product": [1, "item@basegame:114"] + }, + "item@basegame:131": { /* zinc ore -> ingot */ + "difficulty": 1.0, + "product": [1, "item@basegame:115"] + }, + "item@basegame:132": { /* tin ore -> ingot */ + "difficulty": 1.0, + "product": [1, "item@basegame:116"] + }, + "item@basegame:133": { /* gold ore -> ingot */ + "difficulty": 1.0, + "product": [1, "item@basegame:117"] + }, + "item@basegame:134": { /* silver ore -> ingot */ + "difficulty": 1.0, + "product": [1, "item@basegame:118"] + }, + "item@basegame:135": { /* lead ore -> ingot */ + "difficulty": 1.0, + "product": [1, "item@basegame:119"] + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/ModMgr.kt b/src/net/torvald/terrarum/ModMgr.kt index 5b106b463..ecdbbbf25 100644 --- a/src/net/torvald/terrarum/ModMgr.kt +++ b/src/net/torvald/terrarum/ModMgr.kt @@ -846,11 +846,16 @@ object ModMgr { object GameCraftingRecipeLoader { const val recipePath = "crafting/" + const val smeltingPath = "smelting/" @JvmStatic operator fun invoke(module: String) { getFile(module, recipePath).listFiles { it: File -> it.name.lowercase().endsWith(".json") }?.forEach { jsonFile -> Terrarum.craftingCodex.addFromJson(JsonFetcher(jsonFile), module, jsonFile.name) } + + getFile(module, smeltingPath).listFiles { it: File -> it.name.lowercase().endsWith(".json") }?.forEach { jsonFile -> + Terrarum.craftingCodex.addSmeltingFromJson(JsonFetcher(jsonFile), module, jsonFile.name) + } } } diff --git a/src/net/torvald/terrarum/gameitems/GameItem.kt b/src/net/torvald/terrarum/gameitems/GameItem.kt index 4a1a3e9d3..3c29aa4d8 100644 --- a/src/net/torvald/terrarum/gameitems/GameItem.kt +++ b/src/net/torvald/terrarum/gameitems/GameItem.kt @@ -47,8 +47,6 @@ abstract class GameItem(val originalID: ItemID) : Comparable, Cloneabl */ @Transient open var smokiness = Float.POSITIVE_INFINITY - @Transient open var smeltingProduct: ItemID? = null - open var dynamicID: ItemID = originalID /** * if the ID is a Actor range, it's an actor contained in a pocket. diff --git a/src/net/torvald/terrarum/itemproperties/CraftingCodex.kt b/src/net/torvald/terrarum/itemproperties/CraftingCodex.kt index f0f31bbdf..0299137b0 100644 --- a/src/net/torvald/terrarum/itemproperties/CraftingCodex.kt +++ b/src/net/torvald/terrarum/itemproperties/CraftingCodex.kt @@ -1,13 +1,11 @@ package net.torvald.terrarum.itemproperties import com.badlogic.gdx.utils.JsonValue -import net.torvald.terrarum.INGAME +import net.torvald.terrarum.ItemCodex import net.torvald.terrarum.Terrarum import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.gameitems.isBlock import net.torvald.terrarum.gameitems.isWall -import net.torvald.terrarum.modulebasegame.gameactors.ActorInventory -import net.torvald.terrarum.modulebasegame.gameactors.FixtureInventory import net.torvald.terrarum.utils.forEachSiblings import net.torvald.terrarum.utils.forEachSiblingsIndexed @@ -22,6 +20,8 @@ class CraftingCodex { */ @Transient internal val props = HashMap>() // the key ItemID and value.product must be equal + @Transient internal val smeltingProps = HashMap() + fun addRecipe(recipe: CraftingRecipe) { val product = recipe.product if (props.containsKey(product)) { @@ -88,6 +88,27 @@ class CraftingCodex { } } + fun addSmeltingFromJson(json: JsonValue, moduleName: String, fileName:String) { + + if (moduleName.filter { it.code in 33..127 } .length < 5) + throw IllegalStateException("Invalid module name: ${moduleName}") + + json.forEachSiblings { key0, details -> + val key = key0.split('+').map { it.trim() }.sorted().joinToString("+") + val difficulty = details["difficulty"].asFloat() + val recipes = ArrayList() + val moq = details["product"][0].asLong() + val product = details["product"][1].asString() + // sanity check + if (moq !in 1..1000) { + throw IllegalStateException("Smelting Recipe for item '$product' has invalid moq of ${moq}") + } + + // register to the main props + smeltingProps[key] = SmeltingRecipe(difficulty, key.split('+').toTypedArray(), moq, product, "$moduleName/$fileName") + } + } + /** * Returns list of all possible recipes for the item; null if there is no recipe * @@ -98,6 +119,55 @@ class CraftingCodex { return it.ifEmpty { null } } + private fun getCombinations0(data: List>): List> { + if (data.isEmpty()) { + return listOf(emptyList()) + } + val first = data.first() + val rest = data.subList(1, data.size) + val combinations = mutableListOf>() + for (sublist in getCombinations0(rest)) { + for (item in first) { + combinations.add(listOf(item) + sublist) + } + } + return combinations + } + + private fun getCombinations(data: List>): List { + val r = mutableListOf() + val l = getCombinations0(data) + l.forEach { + r.add(it.sorted().joinToString("+")) + } + return r + } + + + /** + * @return Null if: + * - at least one of the vararg contains null + * - a smelting product of given items does not exist + * - Otherwise, a smelting product of the given items are returned + */ + fun getSmeltingProductOf(vararg item: ItemID?): SmeltingRecipe? { + if (item.contains(null)) return null + + val keysPossible0: List> = + (item.map { listOf(it!!) + (ItemCodex[it]?.tags?.toList()?.map { "\$" + it } ?: emptyList()) }) + val keysPossible = getCombinations(keysPossible0) + + // iterate through all the combinations of keys + var found: SmeltingRecipe? = null + var i = 0 + while (found == null && i < keysPossible.size) { + found = smeltingProps[keysPossible[i]] + i += 1 + } + + return found + } + /** * Returns list of items that uses the given `item`. * @@ -118,6 +188,7 @@ class CraftingCodex { } } + /** * @return list of itemIDs and corresponding recipes */ @@ -128,6 +199,7 @@ class CraftingCodex { + data class SmeltingRecipe(val difficulty: Float, val ingredients: Array, val moq: Long, val item: ItemID, val addedBy: String) data class CraftingRecipe(val workbench: String, val ingredients: Array, val moq: Long, val product: ItemID, val addedBy: String) data class CraftingIngredients(val key: String, val keyMode: CraftingItemKeyMode, val qty: Long) { override fun toString() = "$qty ${if (keyMode == CraftingItemKeyMode.TAG) "\$$key" else "$key"}" diff --git a/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt b/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt index 51466dd45..633acf082 100644 --- a/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt +++ b/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt @@ -50,8 +50,7 @@ class EntryPoint : ModuleEntryPoint() { // add smelting recipe for sands BlockCodex.filter { it.hasTag("SAND") }.forEach { (itemID, _) -> - ItemCodex[itemID]!!.tags.add("SMELTABLE") - ItemCodex[itemID]!!.smeltingProduct = "basegame:148" +// ItemCodex[itemID]!!.tags.add("SMELTABLE") } println("\n[Basegame.EntryPoint] Welcome back!") diff --git a/src/net/torvald/terrarum/modulebasegame/console/HasItem.kt b/src/net/torvald/terrarum/modulebasegame/console/HasItem.kt new file mode 100644 index 000000000..8cae863f5 --- /dev/null +++ b/src/net/torvald/terrarum/modulebasegame/console/HasItem.kt @@ -0,0 +1,40 @@ +package net.torvald.terrarum.modulebasegame.console + +import net.torvald.terrarum.* +import net.torvald.terrarum.console.ConsoleCommand +import net.torvald.terrarum.console.Echo + +/** + * Created by minjaesong on 2024-03-10. + */ +object HasItem : ConsoleCommand { + override fun execute(args: Array) { + if (args.size != 2) + printUsage() + else { + val it = args[1] + val hasBlock = BlockCodex.getOrNull(it) != null + val blockTags = BlockCodex.getOrNull(it)?.tags?.toList()?.sorted()?.joinToString()?.let { "($it)" } ?: "" + + val hasItem = ItemCodex[it] != null + val itemTags = ItemCodex[it]?.tags?.toList()?.sorted()?.joinToString()?.let { "($it)" } ?: "" + + val hasWire = WireCodex.getOrNull(it) != null + val wireTags = WireCodex.getOrNull(it)?.tags?.toList()?.sorted()?.joinToString()?.let { "($it)" } ?: "" + + val hasOre = OreCodex.getOrNull(it) != null + val oreTags = OreCodex.getOrNull(it)?.tags?.toList()?.sorted()?.joinToString()?.let { "($it)" } ?: "" + + + Echo("${ccY}hasBlock? $ccG$hasBlock $ccO$blockTags") + Echo("${ccY}hasWire? $ccG$hasWire $ccO$wireTags") + Echo("${ccY}hasOre? $ccG$hasOre $ccO$oreTags") + Echo("${ccM}hasItem? $ccG$hasItem $ccO$itemTags") + } + } + + override fun printUsage() { + Echo("Usage: hasitem itemid") + Echo("Prints the information if the item exists in the game") + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureAlloyingCrucible.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureAlloyingCrucible.kt new file mode 100644 index 000000000..34288e2c7 --- /dev/null +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureAlloyingCrucible.kt @@ -0,0 +1,389 @@ +package net.torvald.terrarum.modulebasegame.gameactors + +import com.badlogic.gdx.Input +import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.graphics.g2d.SpriteBatch +import net.torvald.gdx.graphics.Cvec +import net.torvald.random.HQRNG +import net.torvald.spriteanimation.SheetSpriteAnimation +import net.torvald.terrarum.* +import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED +import net.torvald.terrarum.audio.MusicContainer +import net.torvald.terrarum.audio.dsp.Gain +import net.torvald.terrarum.audio.dsp.NullFilter +import net.torvald.terrarum.blockproperties.Block +import net.torvald.terrarum.gameactors.AVKey +import net.torvald.terrarum.gameactors.Hitbox +import net.torvald.terrarum.gameactors.Lightbox +import net.torvald.terrarum.gamecontroller.KeyToggler +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.terrarumsansbitmap.gdx.TextureRegionPack + +/** + * Created by minjaesong on 2024-03-09. + */ +class FixtureAlloyingCrucible : FixtureBase { + + + var fuelCaloriesNow = 0.0 // arbitrary number, may as well be watts or joules + var fuelCaloriesMax: Double? = null + var temperature = 0f // 0f..1f + var progress = 0f // 0f..1f + + internal var oreItem1: InventoryPair? = null + internal var oreItem2: InventoryPair? = null + internal var fireboxItem: InventoryPair? = null + internal var productItem: InventoryPair? = null + + @Transient val oreItem1Status = object : SmelterItemStatus { + override fun set(itm: ItemID, qty: Long) { + if (oreItem1 != null) oreItem1!!.set(itm, qty) + else oreItem1 = InventoryPair(itm, qty) + } + override fun changeCount(delta: Long) { + oreItem1!!.qty += delta + if (oreItem1!!.qty <= 0L) { + oreItem1 = null + } + } + override fun nullify() { + oreItem1 = null + } + override fun isNull(): Boolean { + return oreItem1 == null + } + override val itm: ItemID? + get() = oreItem1?.itm + override val qty: Long? + get() = oreItem1?.qty + } + @Transient val oreItem2Status = object : SmelterItemStatus { + override fun set(itm: ItemID, qty: Long) { + if (oreItem2 != null) oreItem2!!.set(itm, qty) + else oreItem2 = InventoryPair(itm, qty) + } + override fun changeCount(delta: Long) { + oreItem2!!.qty += delta + if (oreItem2!!.qty <= 0L) { + oreItem2 = null + } + } + override fun nullify() { + oreItem2 = null + } + override fun isNull(): Boolean { + return oreItem2 == null + } + override val itm: ItemID? + get() = oreItem2?.itm + override val qty: Long? + get() = oreItem2?.qty + } + @Transient val fireboxItemStatus = object : SmelterItemStatus { + override fun set(itm: ItemID, qty: Long) { + if (fireboxItem != null) fireboxItem!!.set(itm, qty) + else fireboxItem = InventoryPair(itm, qty) + } + override fun changeCount(delta: Long) { + fireboxItem!!.qty += delta + if (fireboxItem!!.qty <= 0L) { + fireboxItem = null + } + } + override fun nullify() { + fireboxItem = null + } + override fun isNull(): Boolean { + return fireboxItem == null + } + override val itm: ItemID? + get() = fireboxItem?.itm + override val qty: Long? + get() = fireboxItem?.qty + } + @Transient val productItemStatus = object : SmelterItemStatus { + override fun set(itm: ItemID, qty: Long) { + if (productItem != null) productItem!!.set(itm, qty) + else productItem = InventoryPair(itm, qty) + } + override fun changeCount(delta: Long) { + productItem!!.qty += delta + if (productItem!!.qty <= 0L) { + productItem = null + } + } + override fun nullify() { + productItem = null + } + override fun isNull(): Boolean { + return productItem == null + } + override val itm: ItemID? + get() = productItem?.itm + override val qty: Long? + get() = productItem?.qty + } + + + override val canBeDespawned: Boolean + get() = oreItem1 == null && oreItem2 == null && fireboxItem == null && productItem == null + + + init { + CommonResourcePool.addToLoadingList("basegame/sprites/fixtures/alloying_furnace.tga") { + TextureRegionPack(ModMgr.getGdxFile("basegame", "sprites/fixtures/alloying_furnace.tga"), 32, 32) + } + CommonResourcePool.addToLoadingList("basegame/sprites/fixtures/alloying_furnace_emsv.tga") { + TextureRegionPack(ModMgr.getGdxFile("basegame", "sprites/fixtures/alloying_furnace_emsv.tga"), 32, 32) + } + CommonResourcePool.loadAll() + } + + + constructor() : super( + BlockBox(BlockBox.NO_COLLISION, 2, 2), // temporary value, will be overwritten by spawn() + nameFun = { Lang["ITEM_ALLOYING_SMELTER"] }, + ) { + CommonResourcePool.addToLoadingList("particles-tiki_smoke.tga") { + TextureRegionPack(ModMgr.getGdxFile("basegame", "particles/bigger_smoke.tga"), 16, 16) + } + CommonResourcePool.loadAll() + + + + density = BlockCodex[Block.STONE].density.toDouble() + setHitboxDimension(32, 32, 0, 0) + + makeNewSprite(CommonResourcePool.getAsTextureRegionPack("basegame/sprites/fixtures/alloying_furnace.tga")).let { + it.setRowsAndFrames(1,1) + } + makeNewSpriteEmissive(CommonResourcePool.getAsTextureRegionPack("basegame/sprites/fixtures/alloying_furnace_emsv.tga")).let { + it.setRowsAndFrames(1,1) + } + + actorValue[AVKey.BASEMASS] = 100.0 + +// this.mainUI = UIAlloyingCrucible(this) + } + + + @Transient val static = MusicContainer("bonfire", ModMgr.getFile("basegame", "audio/effects/static/bonfire.ogg"), true) + @Transient val light = Cvec(0.5f, 0.18f, 0f, 0f) + + @Transient override var lightBoxList = arrayListOf(Lightbox(Hitbox(0.0, 0.0, TILE_SIZED * 2, TILE_SIZED * 2), light)) + + @Transient private val actorBlocks = arrayOf( + arrayOf(Block.ACTORBLOCK_NO_COLLISION, null), + arrayOf(Block.ACTORBLOCK_NO_COLLISION, Block.ACTORBLOCK_NO_COLLISION), + ) + + override fun placeActorBlocks() { + forEachBlockbox { x, y, ox, oy -> + val tile = actorBlocks[oy][ox] + if (tile != null) { + world!!.setTileTerrain(x, y, tile, true) + } + } + } + + + private var nextDelayBase = 0.25f // use smokiness value of the item + private var nextDelay = 0.25f // use smokiness value of the item + private var spawnTimer = 0f + + @Transient private val RNG = HQRNG() + + override fun drawEmissive(frameDelta: Float, batch: SpriteBatch) { + if (isVisible && spriteEmissive != null) { + BlendMode.resolve(drawMode, batch) + + (spriteEmissive as SheetSpriteAnimation).currentFrame = 1 // unlit + drawSpriteInGoodPosition(frameDelta, spriteEmissive!!, batch, 2, Color.WHITE) + + (spriteEmissive as SheetSpriteAnimation).currentFrame = 0 // lit + val r = 1f - (temperature - 1f).sqr() + val g = (2f * temperature - 1f).coerceIn(0f, 1f) + drawSpriteInGoodPosition(frameDelta, spriteEmissive!!, batch, 2, Color(r, g, g, 1f)) + } + + // debug display of hIntTilewiseHitbox + if (KeyToggler.isOn(Input.Keys.F9)) { + val blockMark = CommonResourcePool.getAsTextureRegionPack("blockmarkings_common").get(0, 0) + + for (y in 0..intTilewiseHitbox.height.toInt() + 1) { + batch.color = if (y == intTilewiseHitbox.height.toInt() + 1) HITBOX_COLOURS1 else HITBOX_COLOURS0 + for (x in 0..intTilewiseHitbox.width.toInt()) { + batch.draw(blockMark, + (intTilewiseHitbox.startX.toFloat() + x) * TerrarumAppConfiguration.TILE_SIZEF, + (intTilewiseHitbox.startY.toFloat() + y) * TerrarumAppConfiguration.TILE_SIZEF + ) + } + } + + batch.color = Color.WHITE + } + } + + override fun drawBody(frameDelta: Float, batch: SpriteBatch) { + if (isVisible && sprite != null) { + BlendMode.resolve(drawMode, batch) + + (sprite as SheetSpriteAnimation).currentFrame = 1 // unlit + drawSpriteInGoodPosition(frameDelta, sprite!!, batch, forcedColourFilter = Color.WHITE) + + (sprite as SheetSpriteAnimation).currentFrame = 2 // lit overlay + val r = 1f - (temperature - 1f).sqr() + val g = (2f * temperature - 1f).coerceIn(0f, 1f) + drawSpriteInGoodPosition(frameDelta, sprite!!, batch, forcedColourFilter = Color(1f, g, g, r)) + } + + // debug display of hIntTilewiseHitbox + if (KeyToggler.isOn(Input.Keys.F9)) { + val blockMark = CommonResourcePool.getAsTextureRegionPack("blockmarkings_common").get(0, 0) + + for (y in 0..intTilewiseHitbox.height.toInt() + 1) { + batch.color = if (y == intTilewiseHitbox.height.toInt() + 1) HITBOX_COLOURS1 else HITBOX_COLOURS0 + for (x in 0..intTilewiseHitbox.width.toInt()) { + batch.draw(blockMark, + (intTilewiseHitbox.startX.toFloat() + x) * TerrarumAppConfiguration.TILE_SIZEF, + (intTilewiseHitbox.startY.toFloat() + y) * TerrarumAppConfiguration.TILE_SIZEF + ) + } + } + + batch.color = Color.WHITE + } + } + + override fun updateImpl(delta: Float) { + super.updateImpl(delta) + + val fuelItemProp = ItemCodex[fireboxItem?.itm] + + // consume fuel + if (fuelCaloriesNow > 0f) { + fuelCaloriesNow -= FixtureSmelterBasic.FUEL_CONSUMPTION + + // raise temperature + temperature += 1f /2048f + } + // take fuel from the item slot + else if (fuelCaloriesNow <= 0f && fuelItemProp?.calories != null && fireboxItem!!.qty > 0L) { + fuelCaloriesNow = fuelItemProp.calories + fuelCaloriesMax = fuelItemProp.calories + nextDelayBase = fuelItemProp.smokiness + nextDelay = (nextDelayBase * (1.0 + RNG.nextTriangularBal() * 0.1)).toFloat() + + fireboxItemStatus.changeCount(-1) + } + // no item on the slot + else if (fuelCaloriesNow <= 0f && fireboxItem == null) { + nextDelayBase = Float.POSITIVE_INFINITY + nextDelay = Float.POSITIVE_INFINITY + } + + // tick a thermal loss + temperature -= 1f / 4096f + temperature = temperature.coerceIn(0f, 1f) + + + // emit smokes only when there is something burning + if (spawnTimer >= nextDelay) { + (Terrarum.ingame as TerrarumIngame).addParticle( + ParticleVanishingSprite( + CommonResourcePool.getAsTextureRegionPack("particles-tiki_smoke.tga"), + 25f, true, hitbox.startX + TILE_SIZED, hitbox.startY + 16, false, (Math.random() * 256).toInt() + ) + ) + + spawnTimer -= nextDelay + nextDelay = (nextDelayBase * (1.0 + RNG.nextTriangularBal() * 0.1)).toFloat() + + (sprite as? SheetSpriteAnimation)?.delays?.set(0, Math.random().toFloat() * 0.4f + 0.1f) + } + + val smeltingProduct = CraftingRecipeCodex.getSmeltingProductOf(oreItem1?.itm, oreItem2?.itm) + + // roast items + if (oreItem1 != null && + oreItem2 != null && + temperature > 0f && + smeltingProduct != null && + (productItem == null || smeltingProduct.item == productItem!!.itm) + ) { + + progress += temperature + + if (progress >= FixtureSmelterBasic.CALORIES_PER_ROASTING) { + val smeltingProduct = smeltingProduct.item + + // check if the item even exists + if (ItemCodex[smeltingProduct] == null) throw NullPointerException("No item prop for $smeltingProduct") + + if (productItem == null) + productItem = InventoryPair(smeltingProduct, 1L) + else + productItemStatus.changeCount(1) + + // take the ore item + oreItem1Status.changeCount(-1) + oreItem2Status.changeCount(-1) + + progress = 0f + } + } + else if (oreItem1 == null || oreItem2 == null) { + progress = 0f + } + + // update lightbox + lightBoxList.forEach { + it.light = light.cpy().mul(temperature) + } + + if (temperature > 0.001f) + spawnTimer += delta + else + spawnTimer = 0f + + + // update sound randomiser + volRand.update(delta) + + + // manage audio + // FIXME this code is also killing the audio played by the other fixture (FixtureFurnaceAndAnvil) + getTrackByAudio(static).let { + if (it == null || (temperature > 0f && !it.isPlaying && !it.playRequested.get())) { + startAudio(static) { + it.filters[filterIndex] = Gain(0f) + } + } + else if (it != null && it.isPlaying && temperature <= 0f) { + stopAudio(static) { + it.filters[filterIndex] = NullFilter + } + } + + if (it != null) { + if (it.filters[filterIndex] !is Gain) // just in case... + it.filters[filterIndex] = Gain(0f) + + (it.filters[filterIndex] as Gain).gain = (it.maxVolume * temperature * volRand.get()).toFloat() + } + } + + } + + @Transient private val filterIndex = 0 + @Transient private val volRand = ParamRandomiser(0.8f, 0.4f) + + override fun dispose() { + super.dispose() + static.dispose() + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt index d3c0f9b81..715c28c45 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt @@ -1,10 +1,8 @@ package net.torvald.terrarum.modulebasegame.gameactors -import com.badlogic.gdx.Gdx import com.badlogic.gdx.Input import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.SpriteBatch -import com.jme3.math.FastMath import net.torvald.gdx.graphics.Cvec import net.torvald.random.HQRNG import net.torvald.spriteanimation.SheetSpriteAnimation @@ -38,11 +36,10 @@ interface SmelterItemStatus { val qty: Long? } - /** * Created by minjaesong on 2023-12-04. */ -class FixtureSmelterBasic : FixtureBase, CraftingStation { +class FixtureSmelterBasic : FixtureBase { var fuelCaloriesNow = 0.0 // arbitrary number, may as well be watts or joules var fuelCaloriesMax: Double? = null @@ -123,8 +120,6 @@ class FixtureSmelterBasic : FixtureBase, CraftingStation { override val canBeDespawned: Boolean get() = oreItem == null && fireboxItem == null && productItem == null - @Transient override val tags = listOf("basicsmelter") - init { CommonResourcePool.addToLoadingList("basegame/sprites/fixtures/smelter_tall.tga") { TextureRegionPack(ModMgr.getGdxFile("basegame", "sprites/fixtures/smelter_tall.tga"), 48, 64) @@ -164,7 +159,7 @@ class FixtureSmelterBasic : FixtureBase, CraftingStation { @Transient val static = MusicContainer("bonfire", ModMgr.getFile("basegame", "audio/effects/static/bonfire.ogg"), true) @Transient val light = Cvec(0.5f, 0.18f, 0f, 0f) - @Transient override var lightBoxList = arrayListOf(Lightbox(Hitbox(0.0, 2*TILE_SIZED, TILE_SIZED * 2, TILE_SIZED * 2), Cvec(0.5f, 0.18f, 0f, 0f))) + @Transient override var lightBoxList = arrayListOf(Lightbox(Hitbox(0.0, 2*TILE_SIZED, TILE_SIZED * 2, TILE_SIZED * 2), light)) @Transient private val actorBlocks = arrayOf( arrayOf(Block.ACTORBLOCK_NO_COLLISION, Block.ACTORBLOCK_NO_COLLISION, null), @@ -257,7 +252,6 @@ class FixtureSmelterBasic : FixtureBase, CraftingStation { override fun updateImpl(delta: Float) { super.updateImpl(delta) - val oreItemProp = ItemCodex[oreItem?.itm] val fuelItemProp = ItemCodex[fireboxItem?.itm] // consume fuel @@ -302,23 +296,25 @@ class FixtureSmelterBasic : FixtureBase, CraftingStation { (sprite as? SheetSpriteAnimation)?.delays?.set(0, Math.random().toFloat() * 0.4f + 0.1f) } + val smeltingProduct = CraftingRecipeCodex.getSmeltingProductOf(oreItem?.itm) + // roast items if (oreItem != null && temperature > 0f && - oreItemProp?.smeltingProduct != null && - (productItem == null || oreItemProp.smeltingProduct == productItem!!.itm) + smeltingProduct != null && + (productItem == null || smeltingProduct.item == productItem!!.itm) ) { progress += temperature if (progress >= CALORIES_PER_ROASTING) { - val smeltingProduct = oreItemProp.smeltingProduct!! + val smeltingProductItem = smeltingProduct.item // check if the item even exists - if (ItemCodex[smeltingProduct] == null) throw NullPointerException("No item prop for $smeltingProduct") + if (ItemCodex[smeltingProductItem] == null) throw NullPointerException("No item prop for $smeltingProductItem") if (productItem == null) - productItem = InventoryPair(smeltingProduct, 1L) + productItem = InventoryPair(smeltingProductItem, 1L) else productItemStatus.changeCount(1) diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/OreItemBase.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/OreItemBase.kt index 9cb07cec2..5e10de399 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/OreItemBase.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/OreItemBase.kt @@ -38,7 +38,6 @@ class ItemLogsOak(originalID: ItemID) : OreItemBase(originalID) { override val materialId = "WOOD" override var calories = 1920.0 override var smokiness = 0.2f - override var smeltingProduct: ItemID? = "item@basegame:29" override val itemImage: TextureRegion get() = CommonResourcePool.getAsItemSheet("basegame.items").get(0,10) @@ -52,7 +51,6 @@ class ItemLogsEbony(originalID: ItemID) : OreItemBase(originalID) { override val materialId = "WOOD" override var calories = 1920.0 override var smokiness = 0.2f - override var smeltingProduct: ItemID? = "item@basegame:29" override val itemImage: TextureRegion get() = CommonResourcePool.getAsItemSheet("basegame.items").get(1,10) @@ -66,7 +64,6 @@ class ItemLogsBirch(originalID: ItemID) : OreItemBase(originalID) { override val materialId = "WOOD" override var calories = 1920.0 override var smokiness = 0.2f - override var smeltingProduct: ItemID? = "item@basegame:29" override val itemImage: TextureRegion get() = CommonResourcePool.getAsItemSheet("basegame.items").get(2,10) @@ -80,7 +77,6 @@ class ItemLogsRosewood(originalID: ItemID) : OreItemBase(originalID) { override val materialId = "WOOD" override var calories = 1920.0 override var smokiness = 0.2f - override var smeltingProduct: ItemID? = "item@basegame:29" override val itemImage: TextureRegion get() = CommonResourcePool.getAsItemSheet("basegame.items").get(3,10) @@ -94,19 +90,16 @@ class ItemLogsRosewood(originalID: ItemID) : OreItemBase(originalID) { class OreCopper(originalID: ItemID) : OreItemBase(originalID, true) { override var originalName = "ITEM_ORE_MALACHITE" - override var smeltingProduct: ItemID? = "item@basegame:112" override val itemImage: TextureRegion get() = CommonResourcePool.getAsItemSheet("basegame.items").get(1,6) } class OreIron(originalID: ItemID) : OreItemBase(originalID, true) { override var originalName = "ITEM_ORE_HAEMATITE" - override var smeltingProduct: ItemID? = "item@basegame:113" override val itemImage: TextureRegion get() = CommonResourcePool.getAsItemSheet("basegame.items").get(2,6) } class OreCoal(originalID: ItemID) : OreItemBase(originalID, true) { override var originalName = "ITEM_ORE_COAL" - override var smeltingProduct: ItemID? = "item@basegame:114" override var calories = 4800.0 override var smokiness = 0.3f override val itemImage: TextureRegion @@ -114,40 +107,34 @@ class OreCoal(originalID: ItemID) : OreItemBase(originalID, true) { } class OreZinc(originalID: ItemID) : OreItemBase(originalID, true) { override var originalName = "ITEM_ORE_SPHALERITE" - override var smeltingProduct: ItemID? = "item@basegame:115" override val itemImage: TextureRegion get() = CommonResourcePool.getAsItemSheet("basegame.items").get(4,6) } class OreTin(originalID: ItemID) : OreItemBase(originalID, true) { override var originalName = "ITEM_ORE_CASSITERITE" - override var smeltingProduct: ItemID? = "item@basegame:116" override val itemImage: TextureRegion get() = CommonResourcePool.getAsItemSheet("basegame.items").get(5,6) } class OreGold(originalID: ItemID) : OreItemBase(originalID, true) { override var originalName = "ITEM_ORE_NATURAL_GOLD" - override var smeltingProduct: ItemID? = "item@basegame:117" override val materialId: String = "AURM" override val itemImage: TextureRegion get() = CommonResourcePool.getAsItemSheet("basegame.items").get(6, 6) } class OreSilver(originalID: ItemID) : OreItemBase(originalID, true) { override var originalName = "ITEM_ORE_NATURAL_SILVER" - override var smeltingProduct: ItemID? = "item@basegame:118" override val materialId: String = "ARGN" override val itemImage: TextureRegion get() = CommonResourcePool.getAsItemSheet("basegame.items").get(7,6) } class OreLead(originalID: ItemID) : OreItemBase(originalID, true) { override var originalName = "ITEM_ORE_GALENA" - override var smeltingProduct: ItemID? = "item@basegame:119" override val itemImage: TextureRegion get() = CommonResourcePool.getAsItemSheet("basegame.items").get(8,6) } class GemQuartz(originalID: ItemID) : OreItemBase(originalID, true) { override var originalName = "ITEM_GEM_QUARTZ" - override var smeltingProduct: ItemID? = "basegame:149" override val itemImage: TextureRegion get() = CommonResourcePool.getAsItemSheet("basegame.items").get(13,6) } diff --git a/src/net/torvald/terrarum/modulebasegame/ui/SmelterGuiEventBuilder.kt b/src/net/torvald/terrarum/modulebasegame/ui/SmelterGuiEventBuilder.kt index c0d3397ce..383bfe47f 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/SmelterGuiEventBuilder.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/SmelterGuiEventBuilder.kt @@ -24,8 +24,8 @@ object SmelterGuiEventBuilder { fun getPlayerSlotTouchDownFun( clickedOnState: AtomicInteger, - fireboxItem: SmelterItemStatus, - oreItem: SmelterItemStatus, + fireboxItemStatus: SmelterItemStatus, + oreItemStatus: SmelterItemStatus, getPlayerInventory: () -> ActorInventory, @@ -43,24 +43,24 @@ object SmelterGuiEventBuilder { // oreslot if (amount != null && gameItem != null) { if (clickedOnState.get() == ORE_SLOT_FIRST) { - if (oreItem.itm == gameItem.dynamicID) { + if (oreItemStatus.itm == gameItem.dynamicID) { playerInventory.remove(gameItem.dynamicID, amount) - oreItem.changeCount(amount) + oreItemStatus.changeCount(amount) } else { playerInventory.remove(gameItem.dynamicID, amount) - oreItem.set(gameItem.dynamicID, amount) + oreItemStatus.set(gameItem.dynamicID, amount) } } // firebox else if (clickedOnState.get() == FIRE_SLOT_FIRST) { - if (fireboxItem.isNull()) { + if (fireboxItemStatus.isNull()) { playerInventory.remove(gameItem.dynamicID, amount) - fireboxItem.set(gameItem.dynamicID, amount) + fireboxItemStatus.set(gameItem.dynamicID, amount) } - else if (fireboxItem.itm == gameItem.dynamicID) { + else if (fireboxItemStatus.itm == gameItem.dynamicID) { playerInventory.remove(gameItem.dynamicID, amount) - fireboxItem.changeCount(amount) + fireboxItemStatus.changeCount(amount) } } } @@ -72,8 +72,8 @@ object SmelterGuiEventBuilder { fun getPlayerSlotWheelFun( clickedOnState: AtomicInteger, - fireboxItem: SmelterItemStatus, - oreItem: SmelterItemStatus, + fireboxItemStatus: SmelterItemStatus, + oreItemStatus: SmelterItemStatus, getPlayerInventory: () -> ActorInventory, @@ -84,51 +84,51 @@ object SmelterGuiEventBuilder { if (gameItem != null) { val addCount1 = scrollY.toLong() - if (clickedOnState.get() == ORE_SLOT_FIRST && (oreItem.isNull() || oreItem.itm == gameItem.dynamicID)) { - val itemToUse = oreItem.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), - oreItem.qty ?: 0L, + oreItemStatus.qty ?: 0L, ) // add to the inventory slot - if (oreItem.isNotNull() && addCount1 >= 1L) { - playerInventory.add(oreItem.itm!!, addCount2) - oreItem.changeCount(-addCount2) + 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 (oreItem.isNull()) - oreItem.set(itemToUse, -addCount2) + if (oreItemStatus.isNull()) + oreItemStatus.set(itemToUse, -addCount2) else - oreItem.changeCount(-addCount2) + oreItemStatus.changeCount(-addCount2) } - if (oreItem.qty == 0L) oreItem.nullify() - else if (oreItem.isNotNull() && oreItem.qty!! < 0L) throw Error("Item removal count is larger than what was on the slot") + 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 && (fireboxItem.isNull() || fireboxItem.itm == gameItem.dynamicID)) { - val itemToUse = fireboxItem.itm ?: gameItem.dynamicID + else if (clickedOnState.get() == FIRE_SLOT_FIRST && (fireboxItemStatus.isNull() || fireboxItemStatus.itm == gameItem.dynamicID)) { + val itemToUse = fireboxItemStatus.itm ?: gameItem.dynamicID val addCount2 = scrollY.toLong().coerceIn( -(playerInventory.searchByID(itemToUse)?.qty ?: 0L), - fireboxItem.qty ?: 0L, + fireboxItemStatus.qty ?: 0L, ) // add to the inventory slot - if (fireboxItem.isNotNull() && addCount1 >= 1L) { - playerInventory.add(fireboxItem.itm!!, addCount2) - fireboxItem.changeCount(-addCount2) + if (fireboxItemStatus.isNotNull() && addCount1 >= 1L) { + playerInventory.add(fireboxItemStatus.itm!!, addCount2) + fireboxItemStatus.changeCount(-addCount2) } // remove from the inventory slot else if (addCount1 <= -1L) { playerInventory.remove(itemToUse, -addCount2) - if (fireboxItem.isNull()) - fireboxItem.set(itemToUse, -addCount2) + if (fireboxItemStatus.isNull()) + fireboxItemStatus.set(itemToUse, -addCount2) else - fireboxItem.changeCount(-addCount2) + fireboxItemStatus.changeCount(-addCount2) } itemListUpdateKeepCurrentFilter() } @@ -149,7 +149,7 @@ object SmelterGuiEventBuilder { playerThings: UITemplateHalfInventory, - oreItem: SmelterItemStatus, + oreItemStatus: SmelterItemStatus, getPlayerInventory: () -> ActorInventory, @@ -164,17 +164,17 @@ object SmelterGuiEventBuilder { playerThings.itemList.itemPage = 0 itemListUpdate { ItemCodex.hasTag(it.itm, "SMELTABLE") } } - else if (oreItem.isNotNull()) { + else if (oreItemStatus.isNotNull()) { val removeCount = if (mouseButton == App.getConfigInt("config_mouseprimary")) - oreItem.qty + oreItemStatus.qty else if (mouseButton == App.getConfigInt("config_mousesecondary")) 1L else null if (removeCount != null) { - getPlayerInventory().add(oreItem.itm!!, removeCount) - oreItem.changeCount(-removeCount) + getPlayerInventory().add(oreItemStatus.itm!!, removeCount) + oreItemStatus.changeCount(-removeCount) } itemListUpdateKeepCurrentFilter() } @@ -186,7 +186,7 @@ object SmelterGuiEventBuilder { fun getOreItemSlotWheelFun( clickedOnState: AtomicInteger, - oreItem: SmelterItemStatus, + oreItemStatus: SmelterItemStatus, getPlayerInventory: () -> ActorInventory, @@ -195,22 +195,22 @@ 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 && oreItem.isNotNull()) { + if (clickedOnState.get() == ORE_SLOT_FIRST && oreItemStatus.isNotNull()) { val removeCount1 = scrollY.toLong() val removeCount2 = scrollY.toLong().coerceIn( - -oreItem.qty!!, - playerInventory.searchByID(oreItem.itm)?.qty ?: 0L, + -oreItemStatus.qty!!, + playerInventory.searchByID(oreItemStatus.itm)?.qty ?: 0L, ) // add to the slot if (removeCount1 >= 1L) { - playerInventory.remove(oreItem.itm!!, removeCount2) - oreItem.changeCount(removeCount2) + playerInventory.remove(oreItemStatus.itm!!, removeCount2) + oreItemStatus.changeCount(removeCount2) } // remove from the slot else if (removeCount1 <= -1L) { - playerInventory.add(oreItem.itm!!, -removeCount2) - oreItem.changeCount(removeCount2) + playerInventory.add(oreItemStatus.itm!!, -removeCount2) + oreItemStatus.changeCount(removeCount2) } itemListUpdateKeepCurrentFilter() } @@ -228,7 +228,7 @@ object SmelterGuiEventBuilder { playerThings: UITemplateHalfInventory, - fireboxItem: SmelterItemStatus, + fireboxItemStatus: SmelterItemStatus, getPlayerInventory: () -> ActorInventory, @@ -243,17 +243,17 @@ object SmelterGuiEventBuilder { playerThings.itemList.itemPage = 0 itemListUpdate { ItemCodex.hasTag(it.itm, "COMBUSTIBLE") } } - else if (fireboxItem.isNotNull()) { + else if (fireboxItemStatus.isNotNull()) { val removeCount = if (mouseButton == App.getConfigInt("config_mouseprimary")) - fireboxItem.qty + fireboxItemStatus.qty else if (mouseButton == App.getConfigInt("config_mousesecondary")) 1L else null if (removeCount != null) { - getPlayerInventory().add(fireboxItem.itm!!, removeCount) - fireboxItem.changeCount(-removeCount) + getPlayerInventory().add(fireboxItemStatus.itm!!, removeCount) + fireboxItemStatus.changeCount(-removeCount) } itemListUpdateKeepCurrentFilter() } @@ -265,7 +265,7 @@ object SmelterGuiEventBuilder { fun getFireboxItemSlotWheelFun( clickedOnState: AtomicInteger, - fireboxItem: SmelterItemStatus, + fireboxItemStatus: SmelterItemStatus, getPlayerInventory: () -> ActorInventory, @@ -274,22 +274,22 @@ 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() == FIRE_SLOT_FIRST && fireboxItem.isNotNull()) { + if (clickedOnState.get() == FIRE_SLOT_FIRST && fireboxItemStatus.isNotNull()) { val removeCount1 = scrollY.toLong() val removeCount2 = scrollY.toLong().coerceIn( - -fireboxItem.qty!!, - playerInventory.searchByID(fireboxItem.itm)?.qty ?: 0L, + -fireboxItemStatus.qty!!, + playerInventory.searchByID(fireboxItemStatus.itm)?.qty ?: 0L, ) // add to the slot if (removeCount1 >= 1L) { - playerInventory.remove(fireboxItem.itm!!, removeCount2) - fireboxItem.changeCount(removeCount2) + playerInventory.remove(fireboxItemStatus.itm!!, removeCount2) + fireboxItemStatus.changeCount(removeCount2) } // remove from the slot else if (removeCount1 <= -1L) { - playerInventory.add(fireboxItem.itm!!, -removeCount2) - fireboxItem.changeCount(removeCount2) + playerInventory.add(fireboxItemStatus.itm!!, -removeCount2) + fireboxItemStatus.changeCount(removeCount2) } itemListUpdateKeepCurrentFilter() } @@ -307,7 +307,7 @@ object SmelterGuiEventBuilder { playerThings: UITemplateHalfInventory, - productItem: SmelterItemStatus, + productItemStatus: SmelterItemStatus, getPlayerInventory: () -> ActorInventory, @@ -322,24 +322,24 @@ object SmelterGuiEventBuilder { itemListUpdate() } - if (productItem.isNotNull()) { + if (productItemStatus.isNotNull()) { val removeCount = if (mouseButton == App.getConfigInt("config_mouseprimary")) - productItem.qty + productItemStatus.qty else if (mouseButton == App.getConfigInt("config_mousesecondary")) 1L else null if (removeCount != null) { - getPlayerInventory().add(productItem.itm!!, removeCount) - productItem.changeCount(-removeCount) + getPlayerInventory().add(productItemStatus.itm!!, removeCount) + productItemStatus.changeCount(-removeCount) } itemListUpdateKeepCurrentFilter() } } } fun getProductItemSlotWheelFun( - productItem: SmelterItemStatus, + productItemStatus: SmelterItemStatus, getPlayerInventory: () -> ActorInventory, @@ -347,17 +347,17 @@ object SmelterGuiEventBuilder { ): (GameItem?, Long, Float, Float, Any?, UIItemInventoryCellBase) -> Unit { return { gameItem: GameItem?, amount: Long, scrollX: Float, scrollY: Float, itemExtraInfo: Any?, theButton: UIItemInventoryCellBase -> val scrollY = -scrollY - if (productItem.isNotNull()) { + if (productItemStatus.isNotNull()) { val removeCount1 = scrollY.toLong() val removeCount2 = scrollY.toLong().coerceIn( - -productItem.qty!!, + -productItemStatus.qty!!, 0L, ) // remove from the slot if (removeCount1 <= -1L) { - getPlayerInventory().add(productItem.itm!!, -removeCount2) - productItem.changeCount(removeCount2) + getPlayerInventory().add(productItemStatus.itm!!, -removeCount2) + productItemStatus.changeCount(removeCount2) } itemListUpdateKeepCurrentFilter() }