diff --git a/src/net/torvald/terrarum/gameworld/GameWorld.kt b/src/net/torvald/terrarum/gameworld/GameWorld.kt index 51c193fdb..3694b4a59 100644 --- a/src/net/torvald/terrarum/gameworld/GameWorld.kt +++ b/src/net/torvald/terrarum/gameworld/GameWorld.kt @@ -2,12 +2,11 @@ package net.torvald.terrarum.gameworld import com.badlogic.gdx.graphics.Color -import net.torvald.terrarum.AppLoader.printdbg import net.torvald.terrarum.blockproperties.Block -import net.torvald.terrarum.realestate.LandUtil import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.blockproperties.Fluid import net.torvald.terrarum.modulebasegame.gameworld.WorldSimulator +import net.torvald.terrarum.realestate.LandUtil import net.torvald.terrarum.serialise.ReadLayerDataLzma import org.dyn4j.geometry.Vector2 import kotlin.math.absoluteValue @@ -367,7 +366,7 @@ open class GameWorld { val addr = LandUtil.getBlockAddr(this, x, y) if (fill > WorldSimulator.FLUID_MIN_MASS) { - setTileTerrain(x, y, fluidTypeToBlock(fluidType)) + //setTileTerrain(x, y, fluidTypeToBlock(fluidType)) fluidFills[addr] = fill fluidTypes[addr] = fluidType } @@ -377,7 +376,7 @@ open class GameWorld { // if old tile was fluid if (BlockCodex[getTileFromTerrain(x, y) ?: Block.STONE].isFluid) { - setTileTerrain(x, y, Block.AIR) + //setTileTerrain(x, y, Block.AIR) } } @@ -403,6 +402,8 @@ open class GameWorld { } data class FluidInfo(val type: FluidType, val amount: Float) { + /** test if this fluid should be considered as one */ + fun isFluid() = type != Fluid.NULL && amount >= WorldSimulator.FLUID_MIN_MASS override fun toString() = "Fluid type: ${type.value}, amount: $amount" } diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt index 9198bf242..4d3026d29 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt @@ -42,7 +42,22 @@ open class FixtureBase(val blockBox: BlockBox) : } } -data class BlockBox(val collisionType: Int, val width: Int, val height: Int) { +data class BlockBox(var collisionType: Int, var width: Int, var height: Int) { + + fun redefine(collisionType: Int, width: Int, height: Int) { + redefine(collisionType) + redefine(width, height) + } + + fun redefine(width: Int, height: Int) { + this.width = width + this.height = height + } + + fun redefine(collisionType: Int) { + this.collisionType = collisionType + } + companion object { const val NO_COLLISION = Block.ACTORBLOCK_NO_COLLISION const val FULL_COLLISION = Block.ACTORBLOCK_FULL_COLLISION diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/TapestryObject.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/TapestryObject.kt index 2f064761f..9dd278155 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/TapestryObject.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/TapestryObject.kt @@ -4,13 +4,15 @@ import com.badlogic.gdx.graphics.Pixmap import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.terrarum.Terrarum -import net.torvald.terrarum.gameworld.GameWorld +import net.torvald.terrarum.ceilInt import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack /** * Created by minjaesong on 2017-01-07. */ -class TapestryObject(pixmap: Pixmap, val artName: String, val artAuthor: String) : FixtureBase(physics = false) { +class TapestryObject(pixmap: Pixmap, val artName: String, val artAuthor: String) : + FixtureBase(BlockBox(BlockBox.NO_COLLISION, 1, 1)) // placeholder blockbox +{ // physics = false only speeds up for ~2 frames with 50 tapestries @@ -24,6 +26,9 @@ class TapestryObject(pixmap: Pixmap, val artName: String, val artAuthor: String) setHitboxDimension(texture.width, texture.height, 0, 0) setPosition(Terrarum.mouseX, Terrarum.mouseY) // you CAN'T destroy the image + + // redefine blockbox + blockBox.redefine(texture.width.div(TILE_SIZEF).ceilInt(), texture.height.div(TILE_SIZEF).ceilInt()) } override fun update(delta: Float) { diff --git a/src/net/torvald/terrarum/modulecomputers/virtualcomputer/worldobject/FixtureBasicTerminal.kt b/src/net/torvald/terrarum/modulecomputers/virtualcomputer/worldobject/FixtureBasicTerminal.kt index 0cae28812..78a656d73 100644 --- a/src/net/torvald/terrarum/modulecomputers/virtualcomputer/worldobject/FixtureBasicTerminal.kt +++ b/src/net/torvald/terrarum/modulecomputers/virtualcomputer/worldobject/FixtureBasicTerminal.kt @@ -1,13 +1,13 @@ package net.torvald.terrarum.modulecomputers.virtualcomputer.worldobject import com.badlogic.gdx.graphics.Color +import net.torvald.terrarum.modulebasegame.gameactors.BlockBox import net.torvald.terrarum.modulebasegame.gameactors.FixtureBase -import net.torvald.terrarum.gameworld.GameWorld /** * Created by minjaesong on 2016-09-08. */ -class FixtureBasicTerminal(phosphor: Color) : FixtureBase() { +class FixtureBasicTerminal(phosphor: Color) : FixtureBase(BlockBox(BlockBox.ALLOW_MOVE_DOWN, 1, 1)) { /*val computer = TerrarumComputer(8) val vt: Terminal = SimpleTextTerminal(phosphor, 80, 25, computer) diff --git a/src/net/torvald/terrarum/modulecomputers/virtualcomputer/worldobject/FixtureComputerBase.kt b/src/net/torvald/terrarum/modulecomputers/virtualcomputer/worldobject/FixtureComputerBase.kt index 1d0c259a3..fd2325c98 100644 --- a/src/net/torvald/terrarum/modulecomputers/virtualcomputer/worldobject/FixtureComputerBase.kt +++ b/src/net/torvald/terrarum/modulecomputers/virtualcomputer/worldobject/FixtureComputerBase.kt @@ -1,12 +1,12 @@ package net.torvald.terrarum.modulecomputers.virtualcomputer.worldobject +import net.torvald.terrarum.modulebasegame.gameactors.BlockBox import net.torvald.terrarum.modulebasegame.gameactors.FixtureBase -import net.torvald.terrarum.gameworld.GameWorld /** * Created by minjaesong on 2016-09-08. */ -open class FixtureComputerBase : FixtureBase() { +open class FixtureComputerBase : FixtureBase(BlockBox(BlockBox.NO_COLLISION, 1, 1)) { /** Connected terminal */ var terminal: FixtureBasicTerminal? = null @@ -18,7 +18,6 @@ open class FixtureComputerBase : FixtureBase() { actorValue["computerid"] = "none" - collisionFlag = COLLISION_PLATFORM } //////////////////////////////////// diff --git a/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt b/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt index c86615794..c81a4bcb2 100644 --- a/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt +++ b/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt @@ -400,28 +400,7 @@ internal object BlocksDrawer { * * As a consequence, fluids.tga must have the same width as tiles.tga. */ - private fun GameWorld.FluidInfo.toFluidTile(): Int { - /* - val fluid = world.getFluid(x, y) - - if (AppLoader.IS_DEVELOPMENT_BUILD && fluid.type == Fluid.NULL && fluid.amount != 0f) { - throw Error("Illegal fluid at ($x,$y): $fluid") - } - - if (fluid.amount >= WorldSimulator.FLUID_MIN_MASS) { - val fluidLevel = fluid.amount.coerceIn(0f,1f).times(PairedMapLayer.RANGE - 1).roundToInt() - val baseTileID = (GameWorld.TILES_SUPPORTED) - fluid.type.abs() - val tileX = fluidLevel + (baseTileID % 16) * PairedMapLayer.RANGE - val tileY = baseTileID / 16 - - //printdbg(this, "$fluid") - //printdbg(this, "$fluidLevel, $baseTileID, $tileX, $tileY") - - writeToBuffer(mode, bufferX, bufferY, tileX, tileY, 0) - } - */ - - + private fun GameWorld.FluidInfo.toTileInFluidAtlas(): Int { val fluidNum = this.type.abs() if (this.amount >= WorldSimulator.FLUID_MIN_MASS) { @@ -471,7 +450,7 @@ internal object BlocksDrawer { WALL -> world.getTileFromWall(x, y) TERRAIN -> world.getTileFromTerrain(x, y) WIRE -> world.getTileFromWire(x, y) - FLUID -> world.getFluid(x, y).toFluidTile() + FLUID -> world.getFluid(x, y).toTileInFluidAtlas() else -> throw IllegalArgumentException() } @@ -578,16 +557,19 @@ internal object BlocksDrawer { */ internal fun getNearbyTilesInfoFluids(x: Int, y: Int): Int { val nearbyTiles = IntArray(4) - nearbyTiles[NEARBY_TILE_KEY_LEFT] = world.getTileFromTerrain(x - 1, y) ?: Block.NULL + nearbyTiles[NEARBY_TILE_KEY_UP] = world.getTileFromTerrain(x , y - 1) ?: Block.NULL nearbyTiles[NEARBY_TILE_KEY_RIGHT] = world.getTileFromTerrain(x + 1, y) ?: Block.NULL - nearbyTiles[NEARBY_TILE_KEY_UP] = world.getTileFromTerrain(x , y - 1) ?: Block.NULL - nearbyTiles[NEARBY_TILE_KEY_DOWN] = world.getTileFromTerrain(x , y + 1) ?: Block.NULL + nearbyTiles[NEARBY_TILE_KEY_DOWN] = world.getTileFromTerrain(x , y + 1) ?: Block.NULL + nearbyTiles[NEARBY_TILE_KEY_LEFT] = world.getTileFromTerrain(x - 1, y) ?: Block.NULL + + val nearX = intArrayOf(x, x+1, x, x-1) + val nearY = intArrayOf(y-1, y, y+1, y) // try for var ret = 0 for (i in 0..3) { try { - if (!BlockCodex[nearbyTiles[i]].isFluid && + if (!world.getFluid(nearX[i], nearY[i]).isFluid() && // is not a fluid and... !BlockCodex[nearbyTiles[i]].isSolid) { ret += (1 shl i) // add 1, 2, 4, 8 for i = 0, 1, 2, 3 } @@ -601,7 +583,7 @@ internal object BlocksDrawer { val upTile = world.getTileFromTerrain(x , y - 1) ?: Block.NULL return if (ret == 15 || ret == 10) ret - else if (BlockCodex[upTile].isFluid) + else if (world.getFluid(x, y-1).isFluid()) 0 else 1 diff --git a/work_files/todo_platforms.png b/work_files/todo_platforms.png new file mode 100644 index 000000000..9ca8feeda Binary files /dev/null and b/work_files/todo_platforms.png differ