water buckets

This commit is contained in:
minjaesong
2024-09-14 20:02:26 +09:00
parent 1924ed1fbc
commit 35bec7bc26
11 changed files with 153 additions and 34 deletions

Binary file not shown.

Binary file not shown.

View File

@@ -130,6 +130,7 @@ id;classname;tags
320;net.torvald.terrarum.modulebasegame.gameitems.ItemWorldPortal;FIXTURE,STATION
# data storage (discs; 256)
# 32768 is a reserved number for a blank disc
32769;net.torvald.terrarum.modulebasegame.gameitems.MusicDisc01;MUSIC,PHONO
@@ -152,14 +153,26 @@ id;classname;tags
# fluids on storage
# preferably autogenerated
# 100000h..1000FFh : Fluid type 0 (water) x container type 0..255
# 100100h..1001FFh : Fluid type 1 (lava) x container type 0..255
# 100200h..1002FFh : Fluid type 2 (crude oil) x container type 0..255
# 100300h..1003FFh : Fluid type 3 (petroleum) x container type 0..255
# 100400h..1004FFh : Fluid type 4 (compressed air) x container type 0..255
# 100500h..1005FFh : Fluid type 5 (steam) x container type 0..255
# FLUIDSTORAGE: required tag for buckets/canisters
# OPENSTORAGE: cannot hold gas. Canisters need LIDDEDSTORAGE/SEALEDSTORAGE
# FLUIDROOMTEMP: cannot hold cryogenic/hot fluids (e.g. lava, steam)
# 100000h..1000FFh : container type 0 x Fluid type 0..255
# 100100h..1001FFh : container type 1 x Fluid type 0..255
# 100200h..1002FFh : container type 2 x Fluid type 0..255
# 100300h..1003FFh : container type 3 x Fluid type 0..255
# 100400h..1004FFh : container type 4 x Fluid type 0..255
# 100500h..1005FFh : container type 5 x Fluid type 0..255
# ...
# 10FF00h..10FFFFh : Fluid type 255 (???) x container type 0..255
# 10FF00h..10FFFFh : container type 255 x Fluid type 0..255
1048576;net.torvald.terrarum.modulebasegame.gameitems.ItemBucketWooden00;FLUIDSTORAGE,OPENSTORAGE,FLUIDROOMTEMP,FLUIDSTORAGEEMPTY
1048577;net.torvald.terrarum.modulebasegame.gameitems.ItemBucketWooden01;FLUIDSTORAGE,OPENSTORAGE,FLUIDROOMTEMP
#1048578;net.torvald.terrarum.modulebasegame.gameitems.ItemBucketWooden02;FLUIDSTORAGE,OPENSTORAGE,FLUIDROOMTEMP
1048579;net.torvald.terrarum.modulebasegame.gameitems.ItemBucketWooden03;FLUIDSTORAGE,OPENSTORAGE,FLUIDROOMTEMP
1048832;net.torvald.terrarum.modulebasegame.gameitems.ItemBucketIron00;FLUIDSTORAGE,OPENSTORAGE,FLUIDSTORAGEEMPTY
1048833;net.torvald.terrarum.modulebasegame.gameitems.ItemBucketIron01;FLUIDSTORAGE,OPENSTORAGE
1048834;net.torvald.terrarum.modulebasegame.gameitems.ItemBucketIron02;FLUIDSTORAGE,OPENSTORAGE
1048835;net.torvald.terrarum.modulebasegame.gameitems.ItemBucketIron03;FLUIDSTORAGE,OPENSTORAGE
# reserved for debug items
16777216;net.torvald.terrarum.modulebasegame.gameitems.ItemBottomlessWaterBucket;DEBUG,TOOL
1 id classname tags
130 32777 net.torvald.terrarum.modulebasegame.gameitems.MusicDisc09 MUSIC,PHONO
131 # data storage (tapestries 256)
132 #33024 net.torvald.terrarum.modulebasegame.gameitems.ItemTapestry FIXTURE,BASEOBJECT
133 # data storage (text signs 256)
134 # data storage (text signs 33280 256) net.torvald.terrarum.modulebasegame.gameitems.ItemTextSignCopper FIXTURE,BASEOBJECT
135 33280 # fluids on storage
136 # fluids on storage # preferably autogenerated
153 1048833 net.torvald.terrarum.modulebasegame.gameitems.ItemBucketIron01 FLUIDSTORAGE,OPENSTORAGE
154 1048834 net.torvald.terrarum.modulebasegame.gameitems.ItemBucketIron02 FLUIDSTORAGE,OPENSTORAGE
155 1048835 net.torvald.terrarum.modulebasegame.gameitems.ItemBucketIron03 FLUIDSTORAGE,OPENSTORAGE
156 # reserved for debug items
157 16777216 net.torvald.terrarum.modulebasegame.gameitems.ItemBottomlessWaterBucket DEBUG,TOOL
158 16777217 net.torvald.terrarum.modulebasegame.gameitems.ItemBottomlessLavaBucket DEBUG,TOOL
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178

View File

@@ -1,25 +1,25 @@
"id";"item";"tags"
"1";"item@basegame:128";"COPPER,MALACHITE"
"2";"item@basegame:129";"IRON,HAEMATITE"
"3";"item@basegame:130";"COAL,CARBON"
"4";"item@basegame:131";"ZINC,SPHALERITE"
"5";"item@basegame:132";"TIN,CASSITERITE"
"6";"item@basegame:133";"GOLD,NATURAL_GOLD"
"7";"item@basegame:134";"SILVER,NATURAL_SILVER"
"8";"item@basegame:135";"LEAD,GALENA"
"9";"item@basegame:136";"URANIUM,URANINITE"
#"10";"item@basegame:143";"TITANIUM,RUTILE"
"id";"item";"tags";"versionsince"
"1";"item@basegame:128";"COPPER,MALACHITE";0
"2";"item@basegame:129";"IRON,HAEMATITE";0
"3";"item@basegame:130";"COAL,CARBON";0
"4";"item@basegame:131";"ZINC,SPHALERITE";0
"5";"item@basegame:132";"TIN,CASSITERITE";0
"6";"item@basegame:133";"GOLD,NATURAL_GOLD";0
"7";"item@basegame:134";"SILVER,NATURAL_SILVER";0
"8";"item@basegame:135";"LEAD,GALENA";0
"9";"item@basegame:136";"URANIUM,PITCHBLENDE";67108868
#"10";"item@basegame:143";"TITANIUM,RUTILE";100663296
"256";"item@basegame:146";"SALT"
"257";"item@basegame:145";"GEM,SIO2,AMETHYST"
"258";"item@basegame:144";"GEM,SIO2,QUARTZ"
"259";"item@basegame:147";"GEM,NITRE"
"256";"item@basegame:146";"SALT";0
"257";"item@basegame:145";"GEM,SIO2,AMETHYST";0
"258";"item@basegame:144";"GEM,SIO2,QUARTZ";0
"259";"item@basegame:147";"GEM,NITRE";0
#"260";"item@basegame:136";"GEM,RUBY"
#"261";"item@basegame:137";"GEM,EMERALD"
#"262";"item@basegame:138";"GEM,SAPPHIRE"
#"263";"item@basegame:139";"GEM,TOPAZ"
#"264";"item@basegame:140";"GEM,DIAMOND"
#"260";"item@basegame:136";"GEM,RUBY";100663296
#"261";"item@basegame:137";"GEM,EMERALD";100663296
#"262";"item@basegame:138";"GEM,SAPPHIRE";100663296
#"263";"item@basegame:139";"GEM,TOPAZ";100663296
#"264";"item@basegame:140";"GEM,DIAMOND";100663296
#"512";"macro@BASETILE";"GRASS"
#"513";"macro@BASETILE";"MOSS"
#"512";"macro@BASETILE";"GRASS";100663296
#"513";"macro@BASETILE";"MOSS";100663296
Can't render this file because it contains an unexpected character in line 11 and column 2.

View File

@@ -56,6 +56,7 @@ class OreCodex {
prop.id = "ores@$modname:$key"
prop.tags = record.get("tags").split(',').map { it.trim().toUpperCase() }.toHashSet()
prop.item = record.get("item").let { if (it == null) "" else if (it.contains(':')) it else "$modname:$it" }
prop.versionSince = record.get("versionsince").toLong()
oreProps[prop.id] = prop
@@ -83,6 +84,7 @@ class OreProp : TaggedProp {
var id: String = ""
var item: ItemID = ""
var tags = HashSet<String>()
var versionSince: Long = 0L
override fun hasTag(s: String) = tags.contains(s)

View File

@@ -855,7 +855,7 @@ open class GameWorld(
layerFluids.unsafeSetTile(x, y, fluidNumber, fill)
}
else {
layerFluids.unsafeSetTile(x, y, fluidNumber, 0f)
layerFluids.unsafeSetTile(x, y, tileNameToNumberMap[Fluid.NULL]!!, 0f)
}

View File

@@ -27,6 +27,9 @@ class EntryPoint : ModuleEntryPoint() {
CommonResourcePool.addToLoadingList("$moduleName.items") {
ItemSheet(ModMgr.getGdxFile(moduleName, "items/items.tga"))
}
CommonResourcePool.addToLoadingList("$moduleName.buckets") {
ItemSheet(ModMgr.getGdxFile(moduleName, "items/buckets.tga"))
}
CommonResourcePool.loadAll()

View File

@@ -0,0 +1,88 @@
package net.torvald.terrarum.modulebasegame.gameitems
import net.torvald.terrarum.BlockCodex
import net.torvald.terrarum.CommonResourcePool
import net.torvald.terrarum.INGAME
import net.torvald.terrarum.blockproperties.Fluid
import net.torvald.terrarum.gameactors.ActorWithBody
import net.torvald.terrarum.gameitems.GameItem
import net.torvald.terrarum.gameitems.ItemID
import net.torvald.terrarum.gameitems.mouseInInteractableRange
import net.torvald.terrarum.gameworld.FLUID_MIN_MASS
import net.torvald.terrarum.modulebasegame.gameactors.Pocketed
/**
* For example, `ItemFluidStoragePrototype("item@mymod:342", 3, 1, "mymod.buckets")` will result in:
* - A bucket of type #2 that holds `fluid@mymod:3`
*
* And, `ItemFluidStoragePrototype("item@mymod:339", 0, 2, "mymod.buckets")` will result in:
* - A bucket of type #3 that is empty
*
* @param originalID ID of the item. Module name is also retrieved from this string.
* @param sheetX x-position within the sheet. Also determines the fluid ID. 0 for empty storage.
* @param sheetY y-position within the sheet.
* @param sheetName resource name of the sheet image.
*
* Created by minjaesong on 2024-09-14.
*/
open class ItemFluidStoragePrototype(originalID: ItemID, sheetX: Int, sheetY: Int, sheetName: String) : GameItem(originalID) {
private val module = originalID.substringAfter('@').substringBefore(':')
override var baseMass = 1.0
override var baseToolSize: Double? = null
override var inventoryCategory = Category.POTION
override val canBeDynamic = false
override val materialId = ""
override var equipPosition = EquipPosition.HAND_GRIP
@Transient private val fluid = if (sheetX == 0) null else "fluid@$module:$sheetX"
init {
itemImage = CommonResourcePool.getAsItemSheet(sheetName).get(sheetX,sheetY)
}
@Transient val itemIDRoot = originalID.substringAfter(':').toInt().and(0x7FFF_FF00)
override fun startPrimaryUse(actor: ActorWithBody, delta: Float): Long { return mouseInInteractableRange(actor) { mx, my, mtx, mty ->
val world = INGAME.world
val terr = world.getTileFromTerrain(mtx, mty)
val fluidAtWorld = world.getFluid(mtx, mty)
val newItemID: ItemID
if (BlockCodex[terr].isSolid) return@mouseInInteractableRange -1L
// empty bucket -> filled bucket
if (fluid == null) {
if (fluidAtWorld.amount < 1f - FLUID_MIN_MASS) return@mouseInInteractableRange -1L
// TODO respect the FLUIDROOMTEMP tag
world.setFluid(mtx, mty, fluidAtWorld.type, fluidAtWorld.amount - 1f)
newItemID = "item@$module:${itemIDRoot + fluidAtWorld.type.substringAfter(':').toInt()}"
}
// filled bucket -> empty bucket
else {
if (fluidAtWorld.type != Fluid.NULL && fluidAtWorld.type != fluid) return@mouseInInteractableRange -1L
world.setFluid(mtx, mty, fluid, fluidAtWorld.amount + 1f)
newItemID = "item@$module:${itemIDRoot}"
}
// spawn newItemID and add it to the inventory
(actor as Pocketed).inventory.add(newItemID)
1L
}}
}
class ItemBucketWooden00(originalID: ItemID) : ItemFluidStoragePrototype(originalID, 0, 0, "basegame.buckets")
class ItemBucketWooden01(originalID: ItemID) : ItemFluidStoragePrototype(originalID, 1, 0, "basegame.buckets")
class ItemBucketWooden02(originalID: ItemID) : ItemFluidStoragePrototype(originalID, 2, 0, "basegame.buckets")
class ItemBucketWooden03(originalID: ItemID) : ItemFluidStoragePrototype(originalID, 3, 0, "basegame.buckets")
class ItemBucketIron00(originalID: ItemID) : ItemFluidStoragePrototype(originalID, 0, 1, "basegame.buckets")
class ItemBucketIron01(originalID: ItemID) : ItemFluidStoragePrototype(originalID, 1, 1, "basegame.buckets")
class ItemBucketIron02(originalID: ItemID) : ItemFluidStoragePrototype(originalID, 2, 1, "basegame.buckets")
class ItemBucketIron03(originalID: ItemID) : ItemFluidStoragePrototype(originalID, 3, 1, "basegame.buckets")

View File

@@ -145,7 +145,7 @@ class OreLead(originalID: ItemID) : OreItemBase(originalID, true) {
}
}
class OreUranium(originalID: ItemID) : OreItemBase(originalID, true) {
override var originalName = "ITEM_ORE_URANINITE"
override var originalName = "ITEM_ORE_PITCHBLENDE"
init {
itemImage = CommonResourcePool.getAsItemSheet("basegame.items").get(0,7)
}

View File

@@ -53,7 +53,14 @@ class Oregen(world: GameWorld, isFinal: Boolean, private val caveAttenuateBiasSc
val oreTiles = ores.map { it.tile }
val tileToPut =
noiseValues.zip(oreTiles).firstNotNullOfOrNull { (n, tile) -> if (n > 0.5) tile else null }
noiseValues.zip(oreTiles).firstNotNullOfOrNull { (n, tile) ->
// don't generate it if versionSince of the ore is newer than the world
if (INGAME.worldGenVer != null && INGAME.worldGenVer!! < OreCodex[tile].versionSince)
null
else if (n > 0.5) tile else null
}
val backingTile = world.getTileFromTerrain(x, y)
val blockTagNonGrata = ores.firstOrNull { it.tile == tileToPut }?.blockTagNonGrata ?: hashSetOf()