mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-07 20:31:51 +09:00
more axe wip
This commit is contained in:
@@ -18,6 +18,7 @@ import net.torvald.terrarum.gameitems.ItemID
|
||||
import net.torvald.terrarum.gameparticles.createRandomBlockParticle
|
||||
import net.torvald.terrarum.gameworld.BlockAddress
|
||||
import net.torvald.terrarum.gameworld.GameWorld
|
||||
import net.torvald.terrarum.itemproperties.Calculate
|
||||
import net.torvald.terrarum.modulebasegame.TerrarumIngame
|
||||
import net.torvald.terrarum.modulebasegame.gameactors.ActorHumanoid
|
||||
import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer
|
||||
@@ -356,9 +357,6 @@ open class ActorWithBody : Actor {
|
||||
@Transient internal val BASE_FRICTION = 0.3
|
||||
|
||||
@Transient internal val BASE_FALLDAMAGE_DAMPEN = 50.0
|
||||
val fallDamageDampening: Double
|
||||
get() = BASE_FALLDAMAGE_DAMPEN * (actorValue.getAsDouble(AVKey.FALLDAMPENMULT) ?: 1.0)
|
||||
|
||||
|
||||
var collisionType = COLLISION_DYNAMIC
|
||||
|
||||
@@ -1107,10 +1105,9 @@ open class ActorWithBody : Actor {
|
||||
// val avrFeetTileStrength = feetTileStregthSum.toDouble() / feetTileCount
|
||||
// val adjustedTileStr = avrFeetTileStrength / 1176
|
||||
// val fallDamageDampenMult = (adjustedTileStr / (adjustedTileStr + 1)).sqr()
|
||||
val fallDamageDampenMult = (32.0 / 1176.0).sqr()
|
||||
// slam-into-whatever damage (such dirty; much hack; wow)
|
||||
// vvvv hack (supposed to be 1.0) vvv 50% hack
|
||||
collisionDamage = mass * (vectorSum.magnitude / (10.0 / Terrarum.PHYS_TIME_FRAME).sqr()) * fallDamageDampenMult * GAME_TO_SI_ACC
|
||||
|
||||
collisionDamage = Calculate.collisionDamage(this, vectorSum)
|
||||
|
||||
// kg * m / s^2 (mass * acceleration), acceleration -> (vectorMagn / (0.01)^2).gameToSI()
|
||||
// take material softness(?) into account
|
||||
if (collisionDamage != 0.0) debug1("Collision damage: $collisionDamage N")
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
package net.torvald.terrarum.itemproperties
|
||||
|
||||
import net.torvald.terrarum.Terrarum
|
||||
import net.torvald.terrarum.gameactors.AVKey
|
||||
import net.torvald.terrarum.gameactors.ActorWithBody
|
||||
import net.torvald.terrarum.gameactors.ActorWithBody.Companion.GAME_TO_SI_ACC
|
||||
import net.torvald.terrarum.sqr
|
||||
import net.torvald.terrarum.sqrt
|
||||
import org.dyn4j.geometry.Vector2
|
||||
|
||||
/**
|
||||
* Created by minjaesong on 2017-04-17.
|
||||
@@ -20,6 +25,18 @@ object Calculate {
|
||||
return (16.0 * (material?.forceMod?.toDouble() ?: 1.0).sqrt() * (actor.avStrength / 1000.0)).toFloat()
|
||||
}
|
||||
|
||||
@JvmStatic fun hatchetPower(actor: ActorWithBody, material: Material?): Float {
|
||||
return (8.0 * (material?.forceMod?.toDouble() ?: 1.0).sqrt() * (actor.avStrength / 1000.0)).toFloat()
|
||||
}
|
||||
|
||||
private val fallDamageDampenMult = (32.0 / 1176.0).sqr()
|
||||
@JvmStatic fun collisionDamage(actor: ActorWithBody, movement: Vector2): Double {
|
||||
return actor.mass * (movement.magnitude / (10.0 / Terrarum.PHYS_TIME_FRAME).sqr()) *
|
||||
fallDamageDampenMult * // dampen factor (magic number)
|
||||
(actor.actorValue.getAsDouble(AVKey.FALLDAMPENMULT) ?: 1.0) * // additional dampen factor (actorvalue)
|
||||
GAME_TO_SI_ACC // unit conversion
|
||||
}
|
||||
|
||||
|
||||
fun armorwhatever() { TODO() }
|
||||
fun yogafire() { TODO() }
|
||||
|
||||
@@ -103,7 +103,7 @@ open class FancyWorldReadLoadScreen(screenToBeLoaded: IngameInstance, private va
|
||||
}
|
||||
|
||||
protected open fun getStage(): Int {
|
||||
return 3 // fixed value for Read screen
|
||||
return 5 // fixed value for Read screen
|
||||
}
|
||||
|
||||
protected val batchColour = Color(-1) // create new Color instance just for the progress bar
|
||||
|
||||
@@ -667,7 +667,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) {
|
||||
ItemCodex[itemOnGrip]?.endPrimaryUse(actor, delta)
|
||||
|
||||
if (canPerformBarehandAction) {
|
||||
actor.actorValue.set(AVKey.__ACTION_TIMER, 0.0)
|
||||
endPerformBarehandAction(actor)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1389,6 +1389,20 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) {
|
||||
particlesContainer.appendHead(particle)
|
||||
}
|
||||
|
||||
private var barehandAxeInUse = false
|
||||
private var barehandPickInUse = false
|
||||
|
||||
fun endPerformBarehandAction(actor: ActorWithBody) {
|
||||
if (barehandAxeInUse) {
|
||||
barehandAxeInUse = false
|
||||
AxeCore.endPrimaryUse(actor, null)
|
||||
}
|
||||
if (barehandPickInUse) {
|
||||
barehandPickInUse = false
|
||||
PickaxeCore.endPrimaryUse(actor, null)
|
||||
}
|
||||
}
|
||||
|
||||
fun performBarehandAction(actor: ActorWithBody, delta: Float, mwx: Double, mwy: Double, mtx: Int, mty: Int) {
|
||||
|
||||
val canAttackOrDig = actor.scale * actor.baseHitboxH >= (actor.actorValue.getAsDouble(AVKey.BAREHAND_MINHEIGHT) ?: 4294967296.0)
|
||||
@@ -1450,6 +1464,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) {
|
||||
}
|
||||
// TODO punch a small tree/shrub
|
||||
else if (mouseUnderPunchableTreeTrunk) {
|
||||
barehandAxeInUse = true
|
||||
AxeCore.startPrimaryUse(actor, delta, null, mtx, mty, punchBlockSize.coerceAtLeast(1), punchBlockSize.coerceAtLeast(1), listOf("TREESMALL"))
|
||||
}
|
||||
// TODO attack a mob
|
||||
@@ -1458,6 +1473,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) {
|
||||
// else, punch a block
|
||||
else if (canAttackOrDig) {
|
||||
if (punchBlockSize > 0) {
|
||||
barehandPickInUse = true
|
||||
PickaxeCore.startPrimaryUse(actor, delta, null, mtx, mty, 1.0 / punchBlockSize, punchBlockSize, punchBlockSize)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,22 +67,24 @@ object AxeCore {
|
||||
|
||||
INGAME.world.inflictTerrainDamage(
|
||||
x, y,
|
||||
Calculate.pickaxePower(actor, item?.material) * swingDmgToFrameDmg
|
||||
Calculate.hatchetPower(actor, item?.material) * swingDmgToFrameDmg
|
||||
).let { tileBroken ->
|
||||
// tile busted
|
||||
if (tileBroken != null) {
|
||||
// make tree fell by scanning upwards
|
||||
TODO()
|
||||
var drop = ""
|
||||
if (drop.isNotBlank()) {
|
||||
INGAME.queueActorAddition(
|
||||
DroppedItem(
|
||||
drop,
|
||||
(x + 0.5) * TerrarumAppConfiguration.TILE_SIZED,
|
||||
(y + 1.0) * TerrarumAppConfiguration.TILE_SIZED
|
||||
)
|
||||
)
|
||||
var upCtr = 0
|
||||
while (true) {
|
||||
val tileHere = INGAME.world.getTileFromTerrain(x, y - upCtr)
|
||||
|
||||
if (BlockCodex[tileHere].hasTag("TREETRUNK")) {
|
||||
PickaxeCore.dropItem(tileHere, x, y - upCtr) // todo use log item
|
||||
}
|
||||
else { // TODO check for leaves
|
||||
break
|
||||
}
|
||||
|
||||
upCtr += 1
|
||||
}
|
||||
|
||||
PickaxeCore.makeDust(tile, x, y, 9)
|
||||
}
|
||||
// tile not busted
|
||||
@@ -104,45 +106,8 @@ object AxeCore {
|
||||
usageStatus
|
||||
}
|
||||
|
||||
private val pixelOffs = intArrayOf(2, 7, 12) // hard-coded assuming TILE_SIZE=16
|
||||
fun makeDust(tile: ItemID, x: Int, y: Int, density: Int = 9, drawCol: Color = Color.WHITE) {
|
||||
val pw = 3
|
||||
val ph = 3
|
||||
val xo = App.GLOBAL_RENDER_TIMER and 1
|
||||
val yo = App.GLOBAL_RENDER_TIMER.ushr(1) and 1
|
||||
|
||||
val renderTag = App.tileMaker.getRenderTag(tile)
|
||||
val baseTilenum = renderTag.tileNumber
|
||||
val representativeTilenum = when (renderTag.maskType) {
|
||||
CreateTileAtlas.RenderTag.MASK_47 -> 17
|
||||
CreateTileAtlas.RenderTag.MASK_PLATFORM -> 7
|
||||
else -> 0
|
||||
}
|
||||
val tileNum = baseTilenum + representativeTilenum // the particle won't match the visible tile anyway because of the seasons stuff
|
||||
|
||||
val indices = (0..8).toList().shuffled().subList(0, density)
|
||||
for (it in indices) {
|
||||
val u = pixelOffs[it % 3]
|
||||
val v = pixelOffs[it / 3]
|
||||
val pos = Vector2(
|
||||
TerrarumAppConfiguration.TILE_SIZED * x + u + xo + 0.5,
|
||||
TerrarumAppConfiguration.TILE_SIZED * y + v + yo + 2,
|
||||
)
|
||||
val veloMult = Vector2(
|
||||
1.0 * (if (Math.random() < 0.5) -1 else 1),
|
||||
(2.0 - (it / 3)) / 2.0 // 1, 0.5, 0
|
||||
)
|
||||
createRandomBlockParticle(tileNum, pos, veloMult, u, v, pw, ph).let {
|
||||
it.despawnUponCollision = true
|
||||
it.drawColour.set(drawCol)
|
||||
(Terrarum.ingame as TerrarumIngame).addParticle(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun endPrimaryUse(actor: ActorWithBody, delta: Float, item: GameItem): Boolean {
|
||||
|
||||
item.using = false
|
||||
fun endPrimaryUse(actor: ActorWithBody, item: GameItem?): Boolean {
|
||||
item?.using = false
|
||||
// reset action timer to zero
|
||||
actor.actorValue.set(AVKey.__ACTION_TIMER, 0.0)
|
||||
return true
|
||||
|
||||
@@ -102,7 +102,7 @@ object PickaxeCore {
|
||||
BlockCodex[tileBroken].drop
|
||||
|
||||
if (drop.isNotBlank()) {
|
||||
INGAME.queueActorAddition(DroppedItem(drop, (x + 0.5) * TILE_SIZED, (y + 1.0) * TILE_SIZED))
|
||||
dropItem(drop, x, y)
|
||||
}
|
||||
makeDust(tile, x, y, 9)
|
||||
}
|
||||
@@ -120,6 +120,16 @@ object PickaxeCore {
|
||||
usageStatus
|
||||
}
|
||||
|
||||
fun dropItem(item: ItemID, tx: Int, ty: Int) {
|
||||
INGAME.queueActorAddition(
|
||||
DroppedItem(
|
||||
item,
|
||||
(tx + 0.5) * TerrarumAppConfiguration.TILE_SIZED,
|
||||
(ty + 1.0) * TerrarumAppConfiguration.TILE_SIZED
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
private val pixelOffs = intArrayOf(2, 7, 12) // hard-coded assuming TILE_SIZE=16
|
||||
fun makeDust(tile: ItemID, x: Int, y: Int, density: Int = 9, drawCol: Color = Color.WHITE) {
|
||||
val pw = 3
|
||||
@@ -156,9 +166,8 @@ object PickaxeCore {
|
||||
}
|
||||
}
|
||||
|
||||
fun endPrimaryUse(actor: ActorWithBody, delta: Float, item: GameItem): Boolean {
|
||||
|
||||
item.using = false
|
||||
fun endPrimaryUse(actor: ActorWithBody, item: GameItem?): Boolean {
|
||||
item?.using = false
|
||||
// reset action timer to zero
|
||||
actor.actorValue.set(AVKey.__ACTION_TIMER, 0.0)
|
||||
return true
|
||||
@@ -219,7 +228,7 @@ class PickaxeCopper(originalID: ItemID) : GameItem(originalID) {
|
||||
|
||||
override fun startPrimaryUse(actor: ActorWithBody, delta: Float) =
|
||||
if (PickaxeCore.startPrimaryUse(actor, delta, this, Terrarum.mouseTileX, Terrarum.mouseTileY)) 0L else -1L
|
||||
override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = PickaxeCore.endPrimaryUse(actor, delta, this)
|
||||
override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = PickaxeCore.endPrimaryUse(actor, this)
|
||||
override fun effectWhileEquipped(actor: ActorWithBody, delta: Float) = PickaxeCore.showOresTooltip(actor, this, Terrarum.mouseTileX, Terrarum.mouseTileY)
|
||||
override fun effectOnUnequip(actor: ActorWithBody) { INGAME.setTooltipMessage(null) }
|
||||
|
||||
@@ -249,7 +258,7 @@ class PickaxeIron(originalID: ItemID) : GameItem(originalID) {
|
||||
|
||||
override fun startPrimaryUse(actor: ActorWithBody, delta: Float) =
|
||||
if (PickaxeCore.startPrimaryUse(actor , delta, this, Terrarum.mouseTileX, Terrarum.mouseTileY)) 0L else -1L
|
||||
override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = PickaxeCore.endPrimaryUse(actor, delta, this)
|
||||
override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = PickaxeCore.endPrimaryUse(actor, this)
|
||||
override fun effectWhileEquipped(actor: ActorWithBody, delta: Float) = PickaxeCore.showOresTooltip(actor, this, Terrarum.mouseTileX, Terrarum.mouseTileY)
|
||||
override fun effectOnUnequip(actor: ActorWithBody) { INGAME.setTooltipMessage(null) }
|
||||
|
||||
@@ -279,7 +288,7 @@ class PickaxeSteel(originalID: ItemID) : GameItem(originalID) {
|
||||
|
||||
override fun startPrimaryUse(actor: ActorWithBody, delta: Float) =
|
||||
if (PickaxeCore.startPrimaryUse(actor, delta, this, Terrarum.mouseTileX, Terrarum.mouseTileY)) 0L else -1L
|
||||
override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = PickaxeCore.endPrimaryUse(actor, delta, this)
|
||||
override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = PickaxeCore.endPrimaryUse(actor, this)
|
||||
override fun effectWhileEquipped(actor: ActorWithBody, delta: Float) = PickaxeCore.showOresTooltip(actor, this, Terrarum.mouseTileX, Terrarum.mouseTileY)
|
||||
override fun effectOnUnequip(actor: ActorWithBody) { INGAME.setTooltipMessage(null) }
|
||||
|
||||
@@ -309,7 +318,7 @@ class PickaxeWood(originalID: ItemID) : GameItem(originalID) {
|
||||
|
||||
override fun startPrimaryUse(actor: ActorWithBody, delta: Float) =
|
||||
if (PickaxeCore.startPrimaryUse(actor, delta, this, Terrarum.mouseTileX, Terrarum.mouseTileY)) 0L else -1L
|
||||
override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = PickaxeCore.endPrimaryUse(actor, delta, this)
|
||||
override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = PickaxeCore.endPrimaryUse(actor, this)
|
||||
override fun effectWhileEquipped(actor: ActorWithBody, delta: Float) = PickaxeCore.showOresTooltip(actor, this, Terrarum.mouseTileX, Terrarum.mouseTileY)
|
||||
override fun effectOnUnequip(actor: ActorWithBody) { INGAME.setTooltipMessage(null) }
|
||||
|
||||
|
||||
@@ -101,7 +101,7 @@ object SledgehammerCore {
|
||||
if (Math.random() < dropProbability) {
|
||||
val drop = BlockCodex[tileBroken].drop
|
||||
if (drop.isNotBlank()) {
|
||||
INGAME.queueActorAddition(DroppedItem("wall@$drop", (x + 0.5) * TILE_SIZED, (y + 1.0) * TILE_SIZED))
|
||||
PickaxeCore.dropItem("wall@$drop", x, y)
|
||||
}
|
||||
PickaxeCore.makeDust(wall, x, y, 9, WALL_OVERLAY_COLOUR)
|
||||
}
|
||||
@@ -119,9 +119,8 @@ object SledgehammerCore {
|
||||
usageStatus
|
||||
}
|
||||
|
||||
fun endPrimaryUse(actor: ActorWithBody, delta: Float, item: GameItem): Boolean {
|
||||
|
||||
item.using = false
|
||||
fun endPrimaryUse(actor: ActorWithBody, item: GameItem?): Boolean {
|
||||
item?.using = false
|
||||
// reset action timer to zero
|
||||
actor.actorValue.set(AVKey.__ACTION_TIMER, 0.0)
|
||||
return true
|
||||
@@ -152,7 +151,7 @@ class SledgehammerCopper(originalID: ItemID) : GameItem(originalID) {
|
||||
|
||||
override fun startPrimaryUse(actor: ActorWithBody, delta: Float) =
|
||||
if (SledgehammerCore.startPrimaryUse(actor, delta, this, Terrarum.mouseTileX, Terrarum.mouseTileY)) 0L else -1L
|
||||
override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = SledgehammerCore.endPrimaryUse(actor, delta, this)
|
||||
override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = SledgehammerCore.endPrimaryUse(actor, this)
|
||||
}
|
||||
|
||||
class SledgehammerIron(originalID: ItemID) : GameItem(originalID) {
|
||||
@@ -176,7 +175,7 @@ class SledgehammerIron(originalID: ItemID) : GameItem(originalID) {
|
||||
|
||||
override fun startPrimaryUse(actor: ActorWithBody, delta: Float) =
|
||||
if (SledgehammerCore.startPrimaryUse(actor , delta, this, Terrarum.mouseTileX, Terrarum.mouseTileY)) 0L else -1L
|
||||
override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = SledgehammerCore.endPrimaryUse(actor, delta, this)
|
||||
override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = SledgehammerCore.endPrimaryUse(actor, this)
|
||||
}
|
||||
|
||||
class SledgehammerSteel(originalID: ItemID) : GameItem(originalID) {
|
||||
@@ -200,7 +199,7 @@ class SledgehammerSteel(originalID: ItemID) : GameItem(originalID) {
|
||||
|
||||
override fun startPrimaryUse(actor: ActorWithBody, delta: Float) =
|
||||
if (SledgehammerCore.startPrimaryUse(actor, delta, this, Terrarum.mouseTileX, Terrarum.mouseTileY)) 0L else -1L
|
||||
override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = SledgehammerCore.endPrimaryUse(actor, delta, this)
|
||||
override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = SledgehammerCore.endPrimaryUse(actor, this)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -227,5 +226,5 @@ class SledgehammerWood(originalID: ItemID) : GameItem(originalID) {
|
||||
|
||||
override fun startPrimaryUse(actor: ActorWithBody, delta: Float) =
|
||||
if (SledgehammerCore.startPrimaryUse(actor, delta, this, Terrarum.mouseTileX, Terrarum.mouseTileY)) 0L else -1L
|
||||
override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = SledgehammerCore.endPrimaryUse(actor, delta, this)
|
||||
override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = SledgehammerCore.endPrimaryUse(actor, this)
|
||||
}
|
||||
Reference in New Issue
Block a user