diff --git a/assets/mods/basegame/blocks/blocks.csv b/assets/mods/basegame/blocks/blocks.csv index 4e9522225..d96d85c98 100644 --- a/assets/mods/basegame/blocks/blocks.csv +++ b/assets/mods/basegame/blocks/blocks.csv @@ -46,8 +46,8 @@ "145"; "0";"BLOCK_ICE_FRAGILE" ;"0.0508";"0.0508";"0.0508";"0.0508"; "5"; "930";"ICEI"; "1"; "0"; "1"; "0"; "0"; "0"; "N/A"; "0"; "4";"0.0000";"0.0000";"0.0000";"0.0000" "146"; "146";"BLOCK_ICE_NATURAL" ;"0.1016";"0.1016";"0.1016";"0.1016"; "35"; "930";"ICEI"; "1"; "0"; "1"; "1"; "0"; "0"; "N/A"; "0"; "4";"0.0000";"0.0000";"0.0000";"0.0000" "147"; "147";"BLOCK_ICE_CLEAR_MAGICAL" ;"0.1252";"0.1252";"0.1252";"0.1252"; "48";"3720";"ICEX"; "1"; "0"; "1"; "1"; "0"; "0"; "N/A"; "0"; "4";"0.0744";"0.1252";"0.2268";"0.0000" - "148"; "148";"BLOCK_GLASS_CRUDE" ;"0.0120";"0.0040";"0.0120";"0.0080"; "5";"2500";"GLAS"; "1"; "0"; "1"; "1"; "0"; "0"; "N/A"; "0";"16";"0.0000";"0.0000";"0.0000";"0.0000" - "149"; "149";"BLOCK_GLASS_CLEAN" ;"0.0040";"0.0040";"0.0040";"0.0020"; "5";"2203";"GLAS"; "1"; "0"; "1"; "1"; "0"; "0"; "N/A"; "0";"16";"0.0000";"0.0000";"0.0000";"0.0000" + "148"; "148";"BLOCK_GLASS_CRUDE" ;"0.0876";"0.0424";"0.0876";"0.1252"; "5";"2500";"GLAS"; "1"; "0"; "1"; "1"; "0"; "0"; "N/A"; "0";"16";"0.0000";"0.0000";"0.0000";"0.0000" + "149"; "149";"BLOCK_GLASS_CLEAN" ;"0.0424";"0.0424";"0.0424";"0.0636"; "5";"2203";"GLAS"; "1"; "0"; "1"; "1"; "0"; "0"; "N/A"; "0";"16";"0.0000";"0.0000";"0.0000";"0.0000" "160"; "160";"BLOCK_PLATFORM_STONE" ;"0.0312";"0.0312";"0.0312";"0.0312"; "5"; "N/A";"ROCK"; "0"; "1"; "1"; "0"; "0"; "0"; "N/A"; "0";"16";"0.0000";"0.0000";"0.0000";"0.0000" "161"; "161";"BLOCK_PLATFORM_WOODEN" ;"0.0312";"0.0312";"0.0312";"0.0312"; "5"; "N/A";"WOOD"; "0"; "1"; "1"; "0"; "0"; "0"; "N/A"; "0";"16";"0.0000";"0.0000";"0.0000";"0.0000" "162"; "162";"BLOCK_PLATFORM_EBONY" ;"0.0312";"0.0312";"0.0312";"0.0312"; "5"; "N/A";"WOOD"; "0"; "1"; "1"; "0"; "0"; "0"; "N/A"; "0";"16";"0.0000";"0.0000";"0.0000";"0.0000" @@ -98,7 +98,7 @@ "256"; "256";"BLOCK_LANTERN_IRON_REGULAR" ;"0.0312";"0.0312";"0.0312";"0.0312"; "1"; "N/A";"FXTR"; "0"; "0"; "1"; "0"; "0"; "0"; "N/A"; "0";"16";"1.0000";"0.6372";"0.0000";"0.0000" "257"; "257";"BLOCK_SUNSTONE" ;"0.1252";"0.1252";"0.1252";"0.1252"; "1"; "N/A";"ROCK"; "1"; "0"; "0"; "0"; "0"; "2"; "N/A"; "0";"16";"0.0000";"0.0000";"0.0000";"0.0000" "258"; "258";"BLOCK_DAYLIGHT_CAPACITOR" ;"0.1252";"0.1252";"0.1252";"0.1252"; "1"; "N/A";"GLAS"; "1"; "0"; "0"; "0"; "0"; "3"; "N/A"; "0";"16";"0.0000";"0.0000";"0.0000";"0.0000" -"4096"; "0";"BLOCK_WATER" ;"0.1016";"0.0744";"0.0508";"0.0508";"100";"1000";"WATR"; "0"; "0"; "1"; "0"; "0"; "0"; "16"; "0";"16";"0.0000";"0.0000";"0.0000";"0.0000" +"4096"; "0";"BLOCK_WATER" ;"0.1016";"0.0744";"0.0508";"0.0826";"100";"1000";"WATR"; "0"; "0"; "1"; "0"; "0"; "0"; "16"; "0";"16";"0.0000";"0.0000";"0.0000";"0.0000" "4097"; "0";"BLOCK_LAVA" ;"0.9696";"0.9696";"0.9696";"0.9696";"100";"2600";"ROCK"; "0"; "0"; "1"; "0"; "0"; "0"; "32"; "0";"16";"0.7664";"0.2032";"0.0000";"0.0000" "-1"; "0";"BLOCK_NULL" ;"4.0000";"4.0000";"4.0000";"4.0000"; "-1";"2600";"NULL"; "0"; "0"; "1"; "1"; "0"; "0"; "N/A"; "0";"16";"0.0000";"0.0000";"0.0000";"0.0000" diff --git a/src/net/torvald/terrarum/itemproperties/ItemCodex.kt b/src/net/torvald/terrarum/itemproperties/ItemCodex.kt index 2cd91e704..ddc712ed1 100644 --- a/src/net/torvald/terrarum/itemproperties/ItemCodex.kt +++ b/src/net/torvald/terrarum/itemproperties/ItemCodex.kt @@ -192,12 +192,38 @@ object ItemCodex { override fun startSecondaryUse(delta: Float): Boolean { val ingame = Terrarum.ingame!! as Ingame // must be in here - ingame.world.setFluid(Terrarum.mouseTileX, Terrarum.mouseTileY, Fluid.WATER, 1f) + ingame.world.setFluid(Terrarum.mouseTileX, Terrarum.mouseTileY, Fluid.WATER, 4f) return true } } + // test lava bucket + itemCodex[9001] = object : GameItem() { + override var dynamicID: ItemID = 9001 + override val originalID: ItemID = 9001 + + override val isUnique: Boolean = true + override val originalName: String = "Infinite Lava Bucket" + + override var baseMass: Double = 1000.0 + override var baseToolSize: Double? = null + + override var inventoryCategory: String = "tool" + override var stackable: Boolean = false + + override val isDynamic: Boolean = false + override val material: Material = Material(1,1,1,1,1,1,1,1,1,1.0) + + override val equipPosition: Int = EquipPosition.HAND_GRIP + + override fun startSecondaryUse(delta: Float): Boolean { + val ingame = Terrarum.ingame!! as Ingame // must be in here + ingame.world.setFluid(Terrarum.mouseTileX, Terrarum.mouseTileY, Fluid.LAVA, 4f) + return true + } + } + // read from save (if applicable) and fill dynamicItemDescription diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderSigrid.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderSigrid.kt index 8f14bd6d3..8697ca7ff 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderSigrid.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderSigrid.kt @@ -99,5 +99,6 @@ object PlayerBuilderSigrid { walls.forEach { inventory.add(it + 4096, 9995) } inventory.add(ItemCodex.ITEM_STATIC.first) inventory.add(9000) + inventory.add(9001) } } diff --git a/src/net/torvald/terrarum/modulebasegame/items/PickaxeGeneric.kt b/src/net/torvald/terrarum/modulebasegame/items/PickaxeGeneric.kt index 0e0dd8be6..ea2c86c06 100644 --- a/src/net/torvald/terrarum/modulebasegame/items/PickaxeGeneric.kt +++ b/src/net/torvald/terrarum/modulebasegame/items/PickaxeGeneric.kt @@ -23,7 +23,7 @@ class PickaxeGeneric(override val originalID: ItemID) : GameItem() { override var stackable = true override var maxDurability = 147 override var durability = maxDurability.toFloat() - override val equipPosition = 9 + override val equipPosition = GameItem.EquipPosition.HAND_GRIP override var inventoryCategory = Category.TOOL override val isUnique = false override val isDynamic = true @@ -47,10 +47,10 @@ class PickaxeGeneric(override val originalID: ItemID) : GameItem() { // linear search filter (check for intersection with tilewise mouse point and tilewise hitbox) // return false if hitting actors - Terrarum.ingame!!.actorContainer.forEach({ + Terrarum.ingame!!.actorContainer.forEach { if (it is ActorWBMovable && it.hIntTilewiseHitbox.intersects(mousePoint)) return false - }) + } // return false if here's no tile if (Block.AIR == (Terrarum.ingame!!.world).getTileFromTerrain(mouseTileX, mouseTileY)) diff --git a/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt b/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt index 823a4dc98..601d19da1 100644 --- a/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt +++ b/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt @@ -407,14 +407,15 @@ object LightmapRenderer { //private val ambientAccumulator = Color(0f,0f,0f,0f) - private val lightLevelThis = Color(0f,0f,0f,0f) + private val lightLevelThis = Color(0) private var thisTerrain = 0 - private var thisFluid = Fluid.NULL + private var thisFluid = GameWorld.FluidInfo(Fluid.NULL, 0f) + private val fluidAmountToCol = Color(0) private var thisWall = 0 - private val thisTileLuminosity = Color(0f,0f,0f,0f) - private val thisTileOpacity = Color(0f,0f,0f,0f) - private val thisTileOpacity2 = Color(0f,0f,0f,0f) // thisTileOpacity * sqrt(2) - private val sunLight = Color(0f,0f,0f,0f) + private val thisTileLuminosity = Color(0) + private val thisTileOpacity = Color(0) + private val thisTileOpacity2 = Color(0) // thisTileOpacity * sqrt(2) + private val sunLight = Color(0) /** @@ -422,8 +423,12 @@ object LightmapRenderer { */ private fun calculate(x: Int, y: Int): Color { + // TODO is JEP 338 released yet? + + // TODO if we only use limited set of operations (max, mul, sub) then int-ify should be possible. // 0xiiii_ffff, 65536 for 1.0 + // Tested it, no perf gain :( // O(9n) == O(n) where n is a size of the map // TODO devise multithreading on this @@ -433,20 +438,21 @@ object LightmapRenderer { // this six fetch tasks take 2 ms ?! lightLevelThis.set(colourNull) thisTerrain = world.getTileFromTerrain(x, y) ?: Block.STONE - thisFluid = world.getFluid(x, y).type + thisFluid = world.getFluid(x, y) thisWall = world.getTileFromWall(x, y) ?: Block.STONE - if (thisFluid != Fluid.NULL) { + if (thisFluid.type != Fluid.NULL) { + fluidAmountToCol.set(thisFluid.amount, thisFluid.amount, thisFluid.amount, thisFluid.amount) + thisTileLuminosity.set(BlockCodex[thisTerrain].luminosity) - thisTileLuminosity.maxAndAssign(BlockCodex[thisFluid].luminosity) // already been div by four + thisTileLuminosity.maxAndAssign(BlockCodex[thisFluid.type].luminosity mul fluidAmountToCol) // already been div by four thisTileOpacity.set(BlockCodex[thisTerrain].opacity) - thisTileOpacity.maxAndAssign(BlockCodex[thisFluid].opacity) // already been div by four + thisTileOpacity.maxAndAssign(BlockCodex[thisFluid.type].opacity mul fluidAmountToCol) // already been div by four } else { thisTileLuminosity.set(BlockCodex[thisTerrain].luminosity) thisTileOpacity.set(BlockCodex[thisTerrain].opacity) } - // TODO thisTileOpacity: take fluid amount into account thisTileOpacity2.set(thisTileOpacity); thisTileOpacity2.mul(1.41421356f) sunLight.set(world.globalLight); sunLight.mul(DIV_FLOAT) @@ -480,7 +486,7 @@ object LightmapRenderer { /* * */lightLevelThis.maxAndAssign(darkenColoured(getLightInternal(x + 1, y) ?: colourNull, thisTileOpacity)) - return lightLevelThis.cpy() // it HAS to be a cpy() + return lightLevelThis.cpy() // it HAS to be a cpy(), otherwise all cells gets the same instance } private fun getLightForOpaque(x: Int, y: Int): Color? { // ...so that they wouldn't appear too dark @@ -542,20 +548,6 @@ object LightmapRenderer { lightBuffer.drawPixel(x - this_x_start, lightBuffer.height - 1 - y + this_y_start) // flip Y } } - //println() - - // FIXME FUCKS SAKE: this_y_start is sometimes fixed at zero, which fucked old light sys with black screen - // -> recalculate event not being fired - - - // so this code actually works now... - /*for (y in 0 until lightBuffer.height) { - for (x in 0 until lightBuffer.width) { - val rnd = Math.random().toFloat() - lightBuffer.setColor(Color(rnd, rnd, rnd, 1f)) - lightBuffer.drawPixel(x, y) - } - }*/ // draw to the batch