diff --git a/assets/mods/basegame/blocks/blocks.csv b/assets/mods/basegame/blocks/blocks.csv index 8bce08425..5c2328066 100644 --- a/assets/mods/basegame/blocks/blocks.csv +++ b/assets/mods/basegame/blocks/blocks.csv @@ -28,10 +28,10 @@ "51";"51";"51";"BLOCK_PLANK_ROSEWOOD";"0.1252";"0.1252";"0.1252";"0.1252";"17";"900";"WOOD";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"WOOD,NORANDTILE" # small punchable trees -"64";"72";"64";"BLOCK_TRUNK_NORMAL";"0.0312";"0.0312";"0.0312";"0.0312";"16";"740";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREETRUNK,TREESMALL,NATURAL" -"65";"73";"65";"BLOCK_TRUNK_EBONY";"0.0312";"0.0312";"0.0312";"0.0312";"19";"1200";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREETRUNK,TREESMALL,NATURAL" -"66";"74";"66";"BLOCK_TRUNK_BIRCH";"0.0312";"0.0312";"0.0312";"0.0312";"15";"670";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREETRUNK,TREESMALL,NATURAL" -"67";"75";"67";"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,TREESMALL,NATURAL" +"64";"48";"64";"BLOCK_TRUNK_NORMAL";"0.0312";"0.0312";"0.0312";"0.0312";"16";"740";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREETRUNK,TREESMALL,NATURAL" +"65";"49";"65";"BLOCK_TRUNK_EBONY";"0.0312";"0.0312";"0.0312";"0.0312";"19";"1200";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREETRUNK,TREESMALL,NATURAL" +"66";"50";"66";"BLOCK_TRUNK_BIRCH";"0.0312";"0.0312";"0.0312";"0.0312";"15";"670";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREETRUNK,TREESMALL,NATURAL" +"67";"51";"67";"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,TREESMALL,NATURAL" # large non-punchable trees "72";"72";"72";"BLOCK_TRUNK_NORMAL";"0.0312";"0.0312";"0.0312";"0.0312";"16";"740";"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" diff --git a/assets/mods/basegame/items/itemid.csv b/assets/mods/basegame/items/itemid.csv index 4f51feae2..b949595eb 100644 --- a/assets/mods/basegame/items/itemid.csv +++ b/assets/mods/basegame/items/itemid.csv @@ -16,7 +16,9 @@ id;classname 15;net.torvald.terrarum.modulebasegame.gameitems.SledgehammerWood 16;net.torvald.terrarum.modulebasegame.gameitems.ItemWorkbench 17;net.torvald.terrarum.modulebasegame.gameitems.ItemCoalCoke +18;net.torvald.terrarum.modulebasegame.gameitems.OreStick +# ores 128;net.torvald.terrarum.modulebasegame.gameitems.OreCopper 129;net.torvald.terrarum.modulebasegame.gameitems.OreIron 130;net.torvald.terrarum.modulebasegame.gameitems.OreCoal @@ -26,6 +28,16 @@ id;classname 134;net.torvald.terrarum.modulebasegame.gameitems.OreSilver 135;net.torvald.terrarum.modulebasegame.gameitems.OreLead +# gemstones +#144; gems + +# tree seeds by tree species +160;net.torvald.terrarum.modulebasegame.gameitems.ItemOakSeed + +# tree logs +168;net.torvald.terrarum.modulebasegame.gameitems.ItemOakLogs + + 256;net.torvald.terrarum.modulebasegame.gameitems.ItemSwingingDoorOak 257;net.torvald.terrarum.modulebasegame.gameitems.ItemSwingingDoorEbony 258;net.torvald.terrarum.modulebasegame.gameitems.ItemSwingingDoorBirch diff --git a/src/net/torvald/terrarum/itemproperties/Calculate.kt b/src/net/torvald/terrarum/itemproperties/Calculate.kt index 0e8729e72..99963fedb 100644 --- a/src/net/torvald/terrarum/itemproperties/Calculate.kt +++ b/src/net/torvald/terrarum/itemproperties/Calculate.kt @@ -26,7 +26,7 @@ object Calculate { } @JvmStatic fun hatchetPower(actor: ActorWithBody, material: Material?): Float { - return (8.0 * (material?.forceMod?.toDouble() ?: 1.0).sqrt() * (actor.avStrength / 1000.0)).toFloat() + return (1.0 * (material?.forceMod?.toDouble() ?: 1.0).sqrt() * (actor.avStrength / 1000.0)).toFloat() } private val fallDamageDampenMult = (32.0 / 1176.0).sqr() diff --git a/src/net/torvald/terrarum/itemproperties/Item.kt b/src/net/torvald/terrarum/itemproperties/Item.kt new file mode 100644 index 000000000..1fcb956e7 --- /dev/null +++ b/src/net/torvald/terrarum/itemproperties/Item.kt @@ -0,0 +1,13 @@ +package net.torvald.terrarum.itemproperties + +/** + * Created by minjaesong on 2023-11-13. + */ +object Item { + + const val TREE_STICK = "item@basegame:18" + + const val TREE_SEED_OAK = "item@basegame:160" + const val TREE_LOGS_OAK = "item@basegame:168" + +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index 774cf7d71..7e3adbe0a 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -1422,7 +1422,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { val punchSize = actor.scale * actor.actorValue.getAsDouble(AVKey.BAREHAND_BASE_DIGSIZE)!! val punchBlockSize = punchSize.div(TILE_SIZED).floorToInt() - val mouseUnderPunchableTreeTrunk = BlockCodex[world.getTileFromTerrain(mtx, mty)].hasAllTagOf("TREETRUNK", "TREESMALL") + val mouseUnderPunchableTree = BlockCodex[world.getTileFromTerrain(mtx, mty)].hasAnyTagOf("LEAVES", "TREESMALL") // if there are attackable actor or fixtures val actorsUnderMouse: List = getActorsAtVicinity(mwx, mwy, punchSize / 2.0).sortedBy { @@ -1462,8 +1462,8 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { } } } - // TODO punch a small tree/shrub - else if (mouseUnderPunchableTreeTrunk) { + // punch a small tree/shrub + else if (mouseUnderPunchableTree) { barehandAxeInUse = true AxeCore.startPrimaryUse(actor, delta, null, mtx, mty, punchBlockSize.coerceAtLeast(1), punchBlockSize.coerceAtLeast(1), listOf("TREESMALL")) } diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/AxeCore.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/AxeCore.kt index c16f45b1d..9ee064b01 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/AxeCore.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/AxeCore.kt @@ -2,6 +2,7 @@ package net.torvald.terrarum.modulebasegame.gameitems import com.badlogic.gdx.graphics.Color import net.torvald.terrarum.* +import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.ActorWithBody @@ -10,6 +11,7 @@ import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.gameitems.mouseInInteractableRangeTools import net.torvald.terrarum.gameparticles.createRandomBlockParticle import net.torvald.terrarum.itemproperties.Calculate +import net.torvald.terrarum.itemproperties.Item import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.gameactors.DroppedItem import net.torvald.terrarum.worlddrawer.CreateTileAtlas @@ -24,6 +26,8 @@ object AxeCore { actor: ActorWithBody, delta: Float, item: GameItem?, mx: Int, my: Int, mw: Int = 1, mh: Int = 1, additionalCheckTags: List = listOf() ) = mouseInInteractableRangeTools(actor, item) { + val mh = 1 + // un-round the mx val ww = INGAME.world.width val hpww = ww * TerrarumAppConfiguration.TILE_SIZE / 2 @@ -40,6 +44,8 @@ object AxeCore { var usageStatus = false + val branchSize = if (item == null) 3 else 4 + for (oy in 0 until mh) for (ox in 0 until mw) { val x = mx + xoff + ox val y = my + yoff + oy @@ -60,8 +66,8 @@ object AxeCore { if (!ret1) return ret1*/ - // check if tile under mouse is a tree - if (BlockCodex[tile].hasAllTag(listOf("TREE", "TREETRUNK") + additionalCheckTags)) { + // check if tile under mouse is leaves + if (BlockCodex[tile].hasTag("LEAVES")) { val actionInterval = actorvalue.getAsDouble(AVKey.ACTION_INTERVAL)!! val swingDmgToFrameDmg = delta.toDouble() / actionInterval @@ -71,14 +77,62 @@ object AxeCore { ).let { tileBroken -> // tile busted if (tileBroken != null) { - var upCtr = 0 + removeLeaf(x, y, tileBroken.substringAfter(':').toInt() - 112) + PickaxeCore.makeDust(tile, x, y, 9) + } + // tile not busted + if (Math.random() < actionInterval) { + PickaxeCore.makeDust(tile, x, y, 1) + } + } + + usageStatus = usageStatus or true + } + // check if tile under mouse is a tree + else if (BlockCodex[tile].hasAllTag(listOf("TREE", "TREETRUNK") + additionalCheckTags)) { + val actionInterval = actorvalue.getAsDouble(AVKey.ACTION_INTERVAL)!! + val swingDmgToFrameDmg = delta.toDouble() / actionInterval + + INGAME.world.inflictTerrainDamage( + x, y, + Calculate.hatchetPower(actor, item?.material) * swingDmgToFrameDmg + ).let { tileBroken -> + // tile busted + if (tileBroken != null) { + var upCtr = 1 + var thisLeaf: ItemID? = null while (true) { val tileHere = INGAME.world.getTileFromTerrain(x, y - upCtr) + val propHere = BlockCodex[tileHere] - if (BlockCodex[tileHere].hasTag("TREETRUNK")) { - PickaxeCore.dropItem(tileHere, x, y - upCtr) // todo use log item + if (propHere.hasTag("TREETRUNK")) { + INGAME.world.setTileTerrain(x, y - upCtr, Block.AIR, false) + PickaxeCore.dropItem(tileHere, x, y - upCtr) // todo use log item if applicable } - else { // TODO check for leaves + else if (propHere.hasTag("LEAVES")) { + if (thisLeaf == null) thisLeaf = tileHere + // only remove leaves that matches the species + // scan horizontally left + for (l in -1 downTo -branchSize) { + val tileBranch = INGAME.world.getTileFromTerrain(x + l, y - upCtr) + if (tileBranch == thisLeaf) + removeLeaf(x + l, y - upCtr, thisLeaf.substringAfter(':').toInt() - 112) + else break + } + // scan horizontally right + for (l in 1 .. branchSize) { + val tileBranch = INGAME.world.getTileFromTerrain(x + l, y - upCtr) + if (tileBranch == thisLeaf) + removeLeaf(x + l, y - upCtr, thisLeaf.substringAfter(':').toInt() - 112) + else break + } + // deal with the current tile + val tileBranch = INGAME.world.getTileFromTerrain(x, y - upCtr) + if (tileBranch == thisLeaf) + removeLeaf(x, y - upCtr, thisLeaf.substringAfter(':').toInt() - 112) + else break + } + else { break } @@ -106,6 +160,18 @@ object AxeCore { usageStatus } + private fun removeLeaf(x: Int, y: Int, species: Int) { + INGAME.world.setTileTerrain(x, y, Block.AIR, false) + // drop items + when (Math.random()) { + in 0.0..0.10 -> Item.TREE_STICK + in 0.20..0.26 -> "item@basegame:${160+species}" + else -> null + }?.let { + PickaxeCore.dropItem(it, x, y) + } + } + fun endPrimaryUse(actor: ActorWithBody, item: GameItem?): Boolean { item?.using = false // reset action timer to zero diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/OreItemBase.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/OreItemBase.kt index 6b8bcd653..3e88c675c 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/OreItemBase.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/OreItemBase.kt @@ -37,7 +37,7 @@ class ItemOakLogs(originalID: ItemID) : OreItemBase(originalID) { get() = CommonResourcePool.getAsItemSheet("basegame.items").get(0,10) } -class ItemOakSEED(originalID: ItemID) : OreItemBase(originalID) { +class ItemOakSeed(originalID: ItemID) : OreItemBase(originalID) { override var originalName = "ITEM_ACORN_OAK" override val materialId = "WOOD" override val itemImage: TextureRegion