diff --git a/assets/mods/basegame/materials/materials.csv b/assets/mods/basegame/materials/materials.csv index ad3d41264..4a6756c91 100644 --- a/assets/mods/basegame/materials/materials.csv +++ b/assets/mods/basegame/materials/materials.csv @@ -24,6 +24,7 @@ SAND;1;1;2400;0.0;0.0;36;0;36;0.0;sand GRVL;1;1;2400;0.0;0.0;36;0;36;0.0;gravel PLST;1;1;1400;0.0;0.0;36;0;16;0.5;TODO plastic (polyethylene) GRSS;1;1;1400;0.0;0.0;36;0;10;0.0;dirt +GLAS;33;1000;2325;1.8;0.82;1.0;6;10;1.0; AIIR;1;1;1;0.0;0.0;36;0;1;-0.2;air NULL;1;1;1;0.0;0.0;36;0;1;0.5;air diff --git a/src/net/torvald/terrarum/ModMgr.kt b/src/net/torvald/terrarum/ModMgr.kt index d839f8b7f..51e354119 100644 --- a/src/net/torvald/terrarum/ModMgr.kt +++ b/src/net/torvald/terrarum/ModMgr.kt @@ -669,14 +669,14 @@ object ModMgr { val loadedClassConstructor = loadedClass.getConstructor(ItemID::class.java) val loadedClassInstance = loadedClassConstructor.newInstance(itemName) ItemCodex[itemName] = loadedClassInstance as GameItem - ItemCodex.tags[itemName] = tags + ItemCodex[itemName]!!.tags.addAll(tags) } else { val loadedClass = it.loadClass(className) val loadedClassConstructor = loadedClass.getConstructor(ItemID::class.java) val loadedClassInstance = loadedClassConstructor.newInstance(itemName) ItemCodex[itemName] = loadedClassInstance as GameItem - ItemCodex.tags[itemName] = tags + ItemCodex[itemName]!!.tags.addAll(tags) } } } diff --git a/src/net/torvald/terrarum/blockproperties/BlockCodex.kt b/src/net/torvald/terrarum/blockproperties/BlockCodex.kt index 813a83958..13bc7353b 100644 --- a/src/net/torvald/terrarum/blockproperties/BlockCodex.kt +++ b/src/net/torvald/terrarum/blockproperties/BlockCodex.kt @@ -177,6 +177,8 @@ class BlockCodex { return blockProps[blockID] } + fun filter(predicate: (BlockProp) -> Boolean) = blockProps.entries.filter { (_, prop) -> predicate(prop) } + private fun setProp(modname: String, key: Int, record: CSVRecord) { val prop = BlockProp() prop.nameKey = record.get("name") diff --git a/src/net/torvald/terrarum/gameitems/GameItem.kt b/src/net/torvald/terrarum/gameitems/GameItem.kt index e8a948d67..5afd740d7 100644 --- a/src/net/torvald/terrarum/gameitems/GameItem.kt +++ b/src/net/torvald/terrarum/gameitems/GameItem.kt @@ -34,7 +34,7 @@ abstract class GameItem(val originalID: ItemID) : Comparable, Cloneabl * If it burns for 80 seconds in the furnace, the calories value would be 80*60=4800, assuming tickrate of 60. * Assuming one item weighs 10 kilograms, 1 game-calories is about 5 watt-hours. */ - open var calories = 0.0 + @Transient open var calories = 0.0 /** * For items with COMBUSTIBLE tag only @@ -42,9 +42,9 @@ abstract class GameItem(val originalID: ItemID) : Comparable, Cloneabl * Lower=more smoky. How likely it would produce smokes when burned on a furnace. Smokiness = 0.25 means the furnace would * emit smoke particle every 0.25 seconds. */ - open var smokiness = Float.POSITIVE_INFINITY + @Transient open var smokiness = Float.POSITIVE_INFINITY - open var smeltingProduct: ItemID? = null + @Transient open var smeltingProduct: ItemID? = null open var dynamicID: ItemID = originalID /** diff --git a/src/net/torvald/terrarum/itemproperties/ItemCodex.kt b/src/net/torvald/terrarum/itemproperties/ItemCodex.kt index 7ab697aa5..fd1dfe3fb 100644 --- a/src/net/torvald/terrarum/itemproperties/ItemCodex.kt +++ b/src/net/torvald/terrarum/itemproperties/ItemCodex.kt @@ -32,7 +32,7 @@ class ItemCodex { * Will return corresponding Actor if ID >= ACTORID_MIN */ @Transient val itemCodex = ItemTable() - @Transient var tags = HashMap>() +// @Transient var tags = HashMap>() val dynamicItemInventory = ItemTable() val dynamicToStaticTable = ItemRemapTable() @@ -94,9 +94,18 @@ class ItemCodex { /** * Returns the item in the Codex. If the item is static, its clone will be returned (you are free to modify the returned item). - * However, if the item is dynamic, the item itself will be returned. Modifying the item will affect the game. + * However, if the item is dynamic, the item itself will be returned. + * + * The returned object is a clone of the original object. Modifying fields will NOT affect the game. */ operator fun get(code: ItemID?): GameItem? { + return get0(code)?.clone() + } + + /** + * Same as `get` but the object is mutable. + */ + fun get0(code: ItemID?): GameItem? { if (code == null) return null if (code.startsWith("$PREFIX_DYNAMICITEM:")) @@ -109,7 +118,7 @@ class ItemCodex { //throw IllegalArgumentException("Attempted to get item data of actor that cannot be an item. ($a)") } else // generic item - return itemCodex[code]?.clone() // from CSV + return itemCodex[code] // from CSV } fun dynamicToStaticID(dynamicID: ItemID) = dynamicToStaticTable[dynamicID]!! @@ -231,7 +240,7 @@ class ItemCodex { fun hasItem(itemID: ItemID): Boolean = dynamicItemInventory.containsKey(itemID) fun isEmpty(): Boolean = itemCodex.isEmpty() - fun hasTag(itemID: ItemID, s: String) = tags[itemID]?.contains(s) == true + fun hasTag(itemID: ItemID, s: String) = get(itemID)?.tags?.contains(s) == true fun hasAnyTagOf(itemID: ItemID, vararg s: String) = s.any { hasTag(itemID, it) } fun hasAnyTag(itemID: ItemID, s: Collection) = s.any { hasTag(itemID, it) } fun hasAnyTag(itemID: ItemID, s: Array) = s.any { hasTag(itemID, it) } diff --git a/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt b/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt index c5f691969..e959c86a7 100644 --- a/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt +++ b/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt @@ -1,16 +1,8 @@ package net.torvald.terrarum.modulebasegame import net.torvald.terrarum.* -import net.torvald.terrarum.App.IS_DEVELOPMENT_BUILD import net.torvald.terrarum.App.printdbg -import net.torvald.terrarum.blockproperties.BlockProp -import net.torvald.terrarum.blockproperties.OreProp -import net.torvald.terrarum.gameactors.ActorWithBody -import net.torvald.terrarum.gameitems.GameItem -import net.torvald.terrarum.itemproperties.CraftingCodex -import net.torvald.terrarum.modulebasegame.gameitems.BlockBase import net.torvald.terrarum.modulebasegame.imagefont.WatchFont -import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack /** * The entry point for the module "Basegame" @@ -56,6 +48,12 @@ class EntryPoint : ModuleEntryPoint() { } } + // add smelting recipe for sands + BlockCodex.filter { it.hasTag("SAND") }.forEach { (itemID, _) -> + ItemCodex.get0(itemID)!!.tags.add("SMELTABLE") + ItemCodex.get0(itemID)!!.smeltingProduct = "basegame:148" + } + println("\n[Basegame.EntryPoint] Welcome back!") } diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt index 853cf7f99..ec3f7750b 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt @@ -7,6 +7,7 @@ import net.torvald.gdx.graphics.Cvec import net.torvald.random.HQRNG import net.torvald.spriteanimation.SheetSpriteAnimation import net.torvald.terrarum.* +import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.gameactors.AVKey diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/OreItemBase.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/OreItemBase.kt index d4af13385..00ad98435 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/OreItemBase.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/OreItemBase.kt @@ -10,7 +10,7 @@ import net.torvald.terrarum.gameitems.ItemID /** * Created by minjaesong on 2023-10-11. */ -open class OreItemBase(originalID: ItemID) : GameItem(originalID) { +open class OreItemBase(originalID: ItemID, private val registerToOreDict: Boolean = false) : GameItem(originalID) { override var baseMass = 10.0 override var baseToolSize: Double? = null override var inventoryCategory = Category.GENERIC @@ -19,12 +19,15 @@ open class OreItemBase(originalID: ItemID) : GameItem(originalID) { override var equipPosition = EquipPosition.HAND_GRIP override fun effectOnPickup(actor: ActorWithBody) { - val playerCodex = (actor.actorValue.getAsString(AVKey.ORE_DICT) ?: "").split(',').filter { it.isNotBlank() }.toMutableList() + if (registerToOreDict) { + val playerCodex = (actor.actorValue.getAsString(AVKey.ORE_DICT) ?: "").split(',').filter { it.isNotBlank() } + .toMutableList() - if (playerCodex.binarySearch(originalID) < 0) { - playerCodex.add(originalID) - playerCodex.sort() - actor.actorValue[AVKey.ORE_DICT] = playerCodex.joinToString(",") + if (playerCodex.binarySearch(originalID) < 0) { + playerCodex.add(originalID) + playerCodex.sort() + actor.actorValue[AVKey.ORE_DICT] = playerCodex.joinToString(",") + } } } } @@ -86,9 +89,6 @@ class ItemLogsRosewood(originalID: ItemID) : OreItemBase(originalID) { return BlockBase.blockStartPrimaryUse(actor, this, "basegame:75", delta) } } - - - class OreStick(originalID: ItemID) : OreItemBase(originalID) { override var originalName = "ITEM_WOOD_STICK" override val materialId = "WOOD" @@ -97,19 +97,22 @@ class OreStick(originalID: ItemID) : OreItemBase(originalID) { override val itemImage: TextureRegion get() = CommonResourcePool.getAsItemSheet("basegame.items").get(0,6) } -class OreCopper(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) { +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) { +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 @@ -117,39 +120,40 @@ class OreCoal(originalID: ItemID) : OreItemBase(originalID) { override val itemImage: TextureRegion get() = CommonResourcePool.getAsItemSheet("basegame.items").get(3,6) } -class OreZinc(originalID: ItemID) : OreItemBase(originalID) { +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) { +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) { +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) { +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) { +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 ItemCoalCoke(originalID: ItemID) : OreItemBase(originalID) { override var originalName = "ITEM_COAL_COKE" override var calories = 4800.0