:PunchTrees:

This commit is contained in:
minjaesong
2023-11-13 18:36:29 +09:00
parent 483f770198
commit f7ce946787
7 changed files with 106 additions and 15 deletions

View File

@@ -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"
Can't render this file because it contains an unexpected character in line 17 and column 2.

View File

@@ -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
1 id classname
16 15 net.torvald.terrarum.modulebasegame.gameitems.SledgehammerWood
17 16 net.torvald.terrarum.modulebasegame.gameitems.ItemWorkbench
18 17 net.torvald.terrarum.modulebasegame.gameitems.ItemCoalCoke
19 18 net.torvald.terrarum.modulebasegame.gameitems.OreStick
20 128 # ores
21 128 net.torvald.terrarum.modulebasegame.gameitems.OreCopper
22 129 net.torvald.terrarum.modulebasegame.gameitems.OreIron
23 130 net.torvald.terrarum.modulebasegame.gameitems.OreCoal
24 131 net.torvald.terrarum.modulebasegame.gameitems.OreZinc
28 135 net.torvald.terrarum.modulebasegame.gameitems.OreLead
29 256 # gemstones
30 257 #144 net.torvald.terrarum.modulebasegame.gameitems.ItemSwingingDoorEbony gems
31 # tree seeds by tree species
32 160 net.torvald.terrarum.modulebasegame.gameitems.ItemOakSeed
33 # tree logs
34 168 net.torvald.terrarum.modulebasegame.gameitems.ItemOakLogs
35 256 net.torvald.terrarum.modulebasegame.gameitems.ItemSwingingDoorOak
36 257 net.torvald.terrarum.modulebasegame.gameitems.ItemSwingingDoorEbony
37 258 net.torvald.terrarum.modulebasegame.gameitems.ItemSwingingDoorBirch
38 259 net.torvald.terrarum.modulebasegame.gameitems.ItemSwingingDoorRosewood
39 320 net.torvald.terrarum.modulebasegame.gameitems.ItemWorldPortal
40 999999 net.torvald.terrarum.modulebasegame.gameitems.ItemTapestry
41
42
43

View File

@@ -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()

View File

@@ -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"
}

View File

@@ -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<ActorWithBody> = 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"))
}

View File

@@ -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<String> = 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

View File

@@ -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