diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 797acea53..000000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/assets/mods/basegame/creatures/CreatureHuman.json b/assets/mods/basegame/creatures/CreatureHuman.json index c24a4b1a8..8edff9f70 100644 --- a/assets/mods/basegame/creatures/CreatureHuman.json +++ b/assets/mods/basegame/creatures/CreatureHuman.json @@ -23,10 +23,12 @@ "encumbrance": 1000, "basedefence": 100, - "basereach": 50, + "basereach": 56, "toolsize": 15, - "intelligent": true + "intelligent": true, + "barehandactionminheight": 80, + "basebarehanddiggingsize": 0.5 } \ No newline at end of file diff --git a/assets/mods/basegame/creatures/CreatureWerebeastBase.json b/assets/mods/basegame/creatures/CreatureWerebeastBase.json index b18ee0546..74ebbe3bf 100644 --- a/assets/mods/basegame/creatures/CreatureWerebeastBase.json +++ b/assets/mods/basegame/creatures/CreatureWerebeastBase.json @@ -27,6 +27,8 @@ "toolsize": 40, - "intelligent": true + "intelligent": true, + "barehandactionminheight": 40, + "basebarehanddiggingsize": 1.0 } \ No newline at end of file diff --git a/src/net/torvald/terrarum/IngameInstance.kt b/src/net/torvald/terrarum/IngameInstance.kt index 75c8d8874..8cff0cbed 100644 --- a/src/net/torvald/terrarum/IngameInstance.kt +++ b/src/net/torvald/terrarum/IngameInstance.kt @@ -184,13 +184,13 @@ open class IngameInstance(val batch: SpriteBatch) : Screen { /** * Event for triggering held item's `startPrimaryUse(Float)` */ - open fun worldPrimaryClickStart(delta: Float) { + open fun worldPrimaryClickStart(actor: ActorWithBody, delta: Float) { } /** * Event for triggering held item's `endPrimaryUse(Float)` */ - open fun worldPrimaryClickEnd(delta: Float) { + open fun worldPrimaryClickEnd(actor: ActorWithBody, delta: Float) { } /** diff --git a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt index e7fc59b4b..222811740 100644 --- a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt +++ b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt @@ -26,7 +26,7 @@ import kotlin.math.roundToInt /** - * Actor with body movable. Base class for every actor that has animated sprites. This includes furnishings, paintings, gadgets, etc. + * Actor with body movable; or more like, 'Actor that has defined XY-Position'. Base class for every actor that has animated sprites. This includes furnishings, paintings, gadgets, etc. * Also has all the usePhysics * * @param renderOrder Rendering order (BEHIND, MIDDLE, MIDTOP, FRONT) @@ -206,6 +206,41 @@ open class ActorWithBody : Actor { field = value } + var avBaseScale: Double // use canonical "scale" for apparent scale (base * buff) + get() = actorValue.getAsDouble(AVKey.SCALE) ?: 1.0 + set(value) { + actorValue[AVKey.SCALE] = value + } + /** + * Apparent strength. 1 000 is default value + */ + val avStrength: Double + get() = (actorValue.getAsDouble(AVKey.STRENGTH) ?: 1000.0) * + (actorValue.getAsDouble(AVKey.STRENGTHBUFF) ?: 1.0) * scale + var avBaseStrength: Double? + get() = actorValue.getAsDouble(AVKey.STRENGTH) + set(value) { + actorValue[AVKey.STRENGTH] = value!! + } + var avBaseMass: Double + inline get() = actorValue.getAsDouble(AVKey.BASEMASS) ?: MASS_DEFAULT + set(value) { + if (value <= 0 || value.isNaN() || value.isInfinite()) + throw IllegalArgumentException("Tried to set base mass to invalid value ($value)") + actorValue[AVKey.BASEMASS] = value + } + val avAcceleration: Double + get() { if (accelMultMovement.isNaN()) println("accelMultMovement: $accelMultMovement") + return actorValue.getAsDouble(AVKey.ACCEL)!! * + (actorValue.getAsDouble(AVKey.ACCELBUFF) ?: 1.0) * + accelMultMovement * + scale.sqrt() + } + val avSpeedCap: Double + get() = actorValue.getAsDouble(AVKey.SPEED)!! * + (actorValue.getAsDouble(AVKey.SPEEDBUFF) ?: 1.0) * + speedMultByTile * + scale.sqrt() /** * Flags and Properties @@ -1877,43 +1912,6 @@ open class ActorWithBody : Actor { @Transient private val HITBOX_COLOURS1 = Color(0xFFFF0088.toInt()) } - // gameplay-related actorvalue macros - - var avBaseScale: Double // use canonical "scale" for apparent scale (base * buff) - get() = actorValue.getAsDouble(AVKey.SCALE) ?: 1.0 - set(value) { - actorValue[AVKey.SCALE] = value - } - /** - * Apparent strength. 1 000 is default value - */ - internal val avStrength: Double - get() = (actorValue.getAsDouble(AVKey.STRENGTH) ?: 1000.0) * - (actorValue.getAsDouble(AVKey.STRENGTHBUFF) ?: 1.0) * scale - internal var avBaseStrength: Double? - get() = actorValue.getAsDouble(AVKey.STRENGTH) - set(value) { - actorValue[AVKey.STRENGTH] = value!! - } - internal var avBaseMass: Double - inline get() = actorValue.getAsDouble(AVKey.BASEMASS) ?: MASS_DEFAULT - set(value) { - if (value <= 0 || value.isNaN() || value.isInfinite()) - throw IllegalArgumentException("Tried to set base mass to invalid value ($value)") - actorValue[AVKey.BASEMASS] = value - } - internal val avAcceleration: Double - get() { if (accelMultMovement.isNaN()) println("accelMultMovement: $accelMultMovement") - return actorValue.getAsDouble(AVKey.ACCEL)!! * - (actorValue.getAsDouble(AVKey.ACCELBUFF) ?: 1.0) * - accelMultMovement * - scale.sqrt() - } - internal val avSpeedCap: Double - get() = actorValue.getAsDouble(AVKey.SPEED)!! * - (actorValue.getAsDouble(AVKey.SPEEDBUFF) ?: 1.0) * - speedMultByTile * - scale.sqrt() private fun Double.toPositiveRad() = // rad(0..pi, -pi..0) -> rad(0..2pi) if (-Math.PI <= this && this < 0.0) diff --git a/src/net/torvald/terrarum/gamecontroller/IngameController.kt b/src/net/torvald/terrarum/gamecontroller/IngameController.kt index 45072ab8e..2dbd8fa5e 100644 --- a/src/net/torvald/terrarum/gamecontroller/IngameController.kt +++ b/src/net/torvald/terrarum/gamecontroller/IngameController.kt @@ -130,8 +130,8 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() { // also, some UIs should NOT affect item usage (e.g. quickslot) and ingame's uiOpened property is doing // the very job. - if (Gdx.input.isButtonPressed(App.getConfigInt("config_mouseprimary")) && !worldPrimaryClickLatched) { - terrarumIngame.worldPrimaryClickStart(App.UPDATE_RATE) + if (terrarumIngame.actorNowPlaying != null && Gdx.input.isButtonPressed(App.getConfigInt("config_mouseprimary")) && !worldPrimaryClickLatched) { + terrarumIngame.worldPrimaryClickStart(terrarumIngame.actorNowPlaying!!, App.UPDATE_RATE) worldPrimaryClickLatched = true } /*if Gdx.input.isButtonPressed(AppLoader.getConfigInt("config_mousesecondary")) { @@ -219,9 +219,10 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() { if (terrarumIngame.uiContainer.map { if ((it?.isOpening == true || it?.isOpened == true) && it.mouseUp) 1 else 0 }.sum() == 0) { // no UI on the mouse, right? if ( - button == App.getConfigInt("config_mouseprimary") || - button == App.getConfigInt("config_mousesecondary")) { - terrarumIngame.worldPrimaryClickEnd(App.UPDATE_RATE) + terrarumIngame.actorNowPlaying != null && + (button == App.getConfigInt("config_mouseprimary") || + button == App.getConfigInt("config_mousesecondary"))) { + terrarumIngame.worldPrimaryClickEnd(terrarumIngame.actorNowPlaying!!, App.UPDATE_RATE) } /*if (button == AppLoader.getConfigInt("config_mousesecondary")) { ingame.worldSecondaryClickEnd(AppLoader.UPDATE_RATE) diff --git a/src/net/torvald/terrarum/gameitem/GameItem.kt b/src/net/torvald/terrarum/gameitem/GameItem.kt index 6cf9cf656..19dc838d0 100644 --- a/src/net/torvald/terrarum/gameitem/GameItem.kt +++ b/src/net/torvald/terrarum/gameitem/GameItem.kt @@ -3,14 +3,16 @@ package net.torvald.terrarum.gameitem import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.random.HQRNG -import net.torvald.terrarum.Codex -import net.torvald.terrarum.ItemCodex -import net.torvald.terrarum.ItemValue +import net.torvald.terrarum.* import net.torvald.terrarum.ReferencingRanges.PREFIX_DYNAMICITEM +import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED +import net.torvald.terrarum.gameactors.AVKey +import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.itemproperties.Material import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.modulebasegame.gameactors.ActorInventory import net.torvald.terrarum.modulebasegame.gameactors.Pocketed +import org.dyn4j.geometry.Vector2 typealias ItemID = String @@ -151,12 +153,12 @@ abstract class GameItem(val originalID: ItemID) : Comparable, Cloneabl /** * Effects applied continuously while in pocket */ - open fun effectWhileInPocket(delta: Float) { } + open fun effectWhileInPocket(actor: ActorWithBody, delta: Float) { } /** * Effects applied immediately only once if picked up */ - open fun effectWhenPickedUp(delta: Float) { } + open fun effectWhenPickedUp(actor: ActorWithBody, delta: Float) { } /** * Apply effects (continuously or not) while primary button is down. @@ -174,7 +176,7 @@ abstract class GameItem(val originalID: ItemID) : Comparable, Cloneabl * Consumption function is executed in net.torvald.terrarum.gamecontroller.IngameController, * in which the function itself is defined in net.torvald.terrarum.modulebasegame.gameactors.ActorInventory */ - open fun startPrimaryUse(delta: Float): Boolean = false + open fun startPrimaryUse(actor: ActorWithBody, delta: Float): Boolean = false /** * I have decided that left and right clicks must do the same thing, so no secondary use from now on. --Torvald on 2019-05-26 @@ -190,23 +192,23 @@ abstract class GameItem(val originalID: ItemID) : Comparable, Cloneabl */ //open fun startSecondaryUse(delta: Float): Boolean = false - open fun endPrimaryUse(delta: Float): Boolean = false - open fun endSecondaryUse(delta: Float): Boolean = false + open fun endPrimaryUse(actor: ActorWithBody, delta: Float): Boolean = false + open fun endSecondaryUse(actor: ActorWithBody, delta: Float): Boolean = false /** * Effects applied immediately only once if thrown (discarded) from pocket */ - open fun effectWhenThrown(delta: Float) { } + open fun effectWhenThrown(actor: ActorWithBody, delta: Float) { } /** * Effects applied (continuously or not) when equipped (drawn/pulled out) */ - open fun effectWhenEquipped(delta: Float) { } + open fun effectWhenEquipped(actor: ActorWithBody, delta: Float) { } /** * Effects applied only once when unequipped */ - open fun effectOnUnequip(delta: Float) { } + open fun effectOnUnequip(actor: ActorWithBody, delta: Float) { } override fun toString(): String { @@ -306,6 +308,7 @@ abstract class GameItem(val originalID: ItemID) : Comparable, Cloneabl return this } + companion object { val DURABILITY_NA = 0 @@ -320,7 +323,15 @@ abstract class GameItem(val originalID: ItemID) : Comparable, Cloneabl } } } - +fun inInteractableRange(actor: ActorWithBody, action: () -> Boolean): Boolean { + val mousePos1 = Vector2(Terrarum.mouseX, Terrarum.mouseY) + val mousePos2 = Vector2(Terrarum.mouseX + INGAME.world.width * TILE_SIZED, Terrarum.mouseY) + val mousePos3 = Vector2(Terrarum.mouseX - INGAME.world.width * TILE_SIZED, Terrarum.mouseY) + val actorPos = actor.centrePosVector + val dist = minOf(actorPos.distanceSquared(mousePos1), actorPos.distanceSquared(mousePos2), actorPos.distanceSquared(mousePos3)) + val distMax = actor.actorValue.getAsInt(AVKey.BASEREACH)!! * actor.scale // perform some error checking here + if (dist <= distMax.sqr()) return action() else return false +} fun IntRange.pickRandom() = HQRNG().nextInt(this.endInclusive - this.start + 1) + this.start // count() on 200 million entries? Se on vitun hyvää idea fun IntArray.pickRandom(): Int = this[HQRNG().nextInt(this.size)] fun DoubleArray.pickRandom(): Double = this[HQRNG().nextInt(this.size)] diff --git a/src/net/torvald/terrarum/itemproperties/Calculate.kt b/src/net/torvald/terrarum/itemproperties/Calculate.kt index a15267dc4..6dfd25419 100644 --- a/src/net/torvald/terrarum/itemproperties/Calculate.kt +++ b/src/net/torvald/terrarum/itemproperties/Calculate.kt @@ -1,6 +1,6 @@ package net.torvald.terrarum.itemproperties -import net.torvald.terrarum.modulebasegame.gameactors.ActorHumanoid +import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.sqrt /** @@ -16,7 +16,7 @@ object Calculate { * * TODO Newtons as unit? */ - @JvmStatic fun pickaxePower(actor: ActorHumanoid, material: Material): Float { + @JvmStatic fun pickaxePower(actor: ActorWithBody, material: Material): Float { return (4.0 * material.forceMod.toDouble().sqrt() * (actor.avStrength / 1000.0)).toFloat() } diff --git a/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt b/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt index 6f9d6d755..5122dc219 100644 --- a/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt +++ b/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt @@ -4,6 +4,7 @@ import net.torvald.terrarum.* import net.torvald.terrarum.App.IS_DEVELOPMENT_BUILD import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.blockproperties.BlockProp +import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameitem.GameItem import net.torvald.terrarum.modulebasegame.gameitems.BlockBase import net.torvald.terrarum.modulebasegame.imagefont.WatchFont @@ -82,12 +83,12 @@ class EntryPoint : ModuleEntryPoint() { equipPosition = EquipPosition.HAND_GRIP } - override fun startPrimaryUse(delta: Float): Boolean { - return BlockBase.blockStartPrimaryUse(this, dynamicID, delta) + override fun startPrimaryUse(actor: ActorWithBody, delta: Float): Boolean { + return BlockBase.blockStartPrimaryUse(actor, this, dynamicID, delta) } - override fun effectWhenEquipped(delta: Float) { - BlockBase.blockEffectWhenEquipped(delta) + override fun effectWhenEquipped(actor: ActorWithBody, delta: Float) { + BlockBase.blockEffectWhenEquipped(actor, delta) } } diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index 3b1161abb..ef7288ab6 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -13,7 +13,6 @@ import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED import net.torvald.terrarum.blockproperties.BlockPropUtil import net.torvald.terrarum.blockstats.BlockStats import net.torvald.terrarum.blockstats.MinimapComposer -import net.torvald.terrarum.concurrent.ThreadExecutor import net.torvald.terrarum.console.AVTracker import net.torvald.terrarum.console.ActorsList import net.torvald.terrarum.console.Authenticator @@ -48,7 +47,6 @@ import net.torvald.terrarum.worlddrawer.WorldCamera import net.torvald.util.CircularArray import org.khelekore.prtree.PRTree import java.util.concurrent.locks.ReentrantLock -import kotlin.math.roundToInt /** @@ -482,10 +480,10 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { }// END enter - override fun worldPrimaryClickStart(delta: Float) { + override fun worldPrimaryClickStart(actor: ActorWithBody, delta: Float) { //println("[Ingame] worldPrimaryClickStart $delta") - val itemOnGrip = ItemCodex[actorNowPlaying?.inventory?.itemEquipped?.get(GameItem.EquipPosition.HAND_GRIP)] + val itemOnGrip = ItemCodex[(actor as Pocketed).inventory.itemEquipped.get(GameItem.EquipPosition.HAND_GRIP)] // bring up the UIs of the fixtures (e.g. crafting menu from a crafting table) var uiOpened = false @@ -516,15 +514,15 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { // don't want to open the UI and use the item at the same time, would ya? if (!uiOpened) { - val consumptionSuccessful = itemOnGrip?.startPrimaryUse(delta) ?: false + val consumptionSuccessful = itemOnGrip?.startPrimaryUse(actor, delta) ?: false if (consumptionSuccessful) - actorNowPlaying?.inventory?.consumeItem(itemOnGrip!!) + (actor as Pocketed).inventory.consumeItem(itemOnGrip!!) } } - override fun worldPrimaryClickEnd(delta: Float) { - val itemOnGrip = actorNowPlaying?.inventory?.itemEquipped?.get(GameItem.EquipPosition.HAND_GRIP) - ItemCodex[itemOnGrip]?.endPrimaryUse(delta) + override fun worldPrimaryClickEnd(actor: ActorWithBody, delta: Float) { + val itemOnGrip = (actor as Pocketed).inventory.itemEquipped.get(GameItem.EquipPosition.HAND_GRIP) + ItemCodex[itemOnGrip]?.endPrimaryUse(actor, delta) } // I have decided that left and right clicks must do the same thing, so no secondary use from now on. --Torvald on 2019-05-26 @@ -897,7 +895,7 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { */ fun updateActors(delta: Float) { if (false) { // don't multithread this for now, it's SLOWER //if (Terrarum.MULTITHREAD && actorContainerActive.size > Terrarum.THREADS) { - ThreadExecutor.renew() + /*ThreadExecutor.renew() val actors = actorContainerActive.size.toFloat() // set up indices @@ -912,7 +910,7 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { ThreadExecutor.join() - actorNowPlaying?.update(delta) + actorNowPlaying?.update(delta)*/ } else { actorContainerActive.forEach { @@ -921,9 +919,9 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { if (it is Pocketed) { it.inventory.forEach { inventoryEntry -> - ItemCodex[inventoryEntry.itm]!!.effectWhileInPocket(delta) + ItemCodex[inventoryEntry.itm]!!.effectWhileInPocket(it as ActorWithBody, delta) // kind of an error checking because all Pocketed must be ActorWithBody if (it.equipped(inventoryEntry.itm)) { - ItemCodex[inventoryEntry.itm]!!.effectWhenEquipped(delta) + ItemCodex[inventoryEntry.itm]!!.effectWhenEquipped(it as ActorWithBody, delta) } } } diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt index 2d4447ea2..f4d48cb5a 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt @@ -12,7 +12,6 @@ import net.torvald.terrarum.gameitem.GameItem import net.torvald.terrarum.itemproperties.Material import net.torvald.terrarum.realestate.LandUtil import org.dyn4j.geometry.Vector2 -import java.util.* /** * Humanoid actor class to provide same controlling function (such as work, jump) @@ -213,10 +212,10 @@ open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, L // update inventory items inventory.forEach { if (!inventory.itemEquipped.contains(it.itm)) { // unequipped - ItemCodex[it.itm]!!.effectWhileInPocket(delta) + ItemCodex[it.itm]!!.effectWhileInPocket(this, delta) } else { // equipped - ItemCodex[it.itm]!!.effectWhenEquipped(delta) + ItemCodex[it.itm]!!.effectWhenEquipped(this, delta) } } } diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/HumanoidNPC.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/HumanoidNPC.kt index 72f677187..e4287f0da 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/HumanoidNPC.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/HumanoidNPC.kt @@ -4,6 +4,7 @@ import net.torvald.terrarum.INGAME import net.torvald.terrarum.Terrarum import net.torvald.terrarum.gameactors.AIControlled import net.torvald.terrarum.gameactors.AVKey +import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameactors.ai.ActorAI import net.torvald.terrarum.gameitem.GameItem import net.torvald.terrarum.itemproperties.Material @@ -49,7 +50,7 @@ open class HumanoidNPC : ActorHumanoid, AIControlled, CanBeAnItem { override val isDynamic = false override val material = Material() - override fun startPrimaryUse(delta: Float): Boolean { + override fun startPrimaryUse(actor: ActorWithBody, delta: Float): Boolean { try { // place the actor to the world this@HumanoidNPC.setPosition(Terrarum.mouseX, Terrarum.mouseY) diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/Pocketed.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/Pocketed.kt index e20f05006..195b04978 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/Pocketed.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/Pocketed.kt @@ -1,10 +1,11 @@ package net.torvald.terrarum.modulebasegame.gameactors import net.torvald.terrarum.App +import net.torvald.terrarum.ItemCodex import net.torvald.terrarum.gameactors.ActorValue +import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameitem.GameItem import net.torvald.terrarum.gameitem.ItemID -import net.torvald.terrarum.* /** * Created by minjaesong on 2016-01-15. @@ -35,7 +36,7 @@ interface Pocketed { // Relevant Actorvalue is NOT being updated on time // They're being safely handled by UIItemInventoryElem*.touchDown() and ActorInventory.remove - item.effectOnUnequip(App.UPDATE_RATE) + item.effectOnUnequip(this as ActorWithBody, App.UPDATE_RATE) } fun unequipItem(itemID: ItemID?) { @@ -66,7 +67,7 @@ interface Pocketed { if (item.equipPosition >= 0) { inventory.itemEquipped[item.equipPosition] = item.dynamicID - item.effectWhenEquipped(App.UPDATE_RATE) + item.effectWhenEquipped(this as ActorWithBody, App.UPDATE_RATE) } // else do nothing } diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/ThreadActorUpdate.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/ThreadActorUpdate.kt index 3f09cd937..afd8470bf 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/ThreadActorUpdate.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/ThreadActorUpdate.kt @@ -1,27 +1,10 @@ package net.torvald.terrarum.modulebasegame.gameactors -import net.torvald.terrarum.App -import net.torvald.terrarum.Terrarum -import java.util.concurrent.Callable -import net.torvald.terrarum.* - /** * Created by minjaesong on 2016-05-25. */ -class ThreadActorUpdate(val startIndex: Int, val endIndex: Int) : Callable { - override fun call() { - for (i in startIndex..endIndex) { - val it = INGAME.actorContainerActive[i] - it.update(App.UPDATE_RATE) +class ThreadActorUpdate(val startIndex: Int, val endIndex: Int) : Runnable { + override fun run() { - if (it is Pocketed) { - it.inventory.forEach { inventoryEntry -> - ItemCodex[inventoryEntry.itm]?.effectWhileInPocket(App.UPDATE_RATE) - if (it.equipped(inventoryEntry.itm)) { - ItemCodex[inventoryEntry.itm]?.effectWhenEquipped(App.UPDATE_RATE) - } - } - } - } } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/BlockBase.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/BlockBase.kt index e35df262c..f5b2465a9 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/BlockBase.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/BlockBase.kt @@ -1,15 +1,11 @@ package net.torvald.terrarum.modulebasegame.gameitems -import net.torvald.terrarum.Point2d -import net.torvald.terrarum.Point2i -import net.torvald.terrarum.Terrarum -import net.torvald.terrarum.blockproperties.BlockCodex -import net.torvald.terrarum.blockproperties.WireCodex +import net.torvald.terrarum.* import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameitem.GameItem import net.torvald.terrarum.gameitem.ItemID +import net.torvald.terrarum.gameitem.inInteractableRange import net.torvald.terrarum.modulebasegame.TerrarumIngame -import net.torvald.terrarum.* /** * Created by minjaesong on 2019-05-02. @@ -20,7 +16,7 @@ object BlockBase { * @param dontEncaseActors when set to true, blocks won't be placed where Actors are. You will want to set it false * for wire items, otherwise you want it to be true. */ - fun blockStartPrimaryUse(gameItem: GameItem, itemID: ItemID, delta: Float): Boolean { + fun blockStartPrimaryUse(actor: ActorWithBody, gameItem: GameItem, itemID: ItemID, delta: Float) = inInteractableRange(actor) { val ingame = Terrarum.ingame!! as TerrarumIngame val mousePoint = Point2d(Terrarum.mouseTileX.toDouble(), Terrarum.mouseTileY.toDouble()) val mouseTile = Point2i(Terrarum.mouseTileX, Terrarum.mouseTileY) @@ -38,7 +34,7 @@ object BlockBase { if (it is ActorWithBody && it.physProp.usePhysics && it.intTilewiseHitbox.intersects(mousePoint)) ret1 = false // return is not allowed here } - if (!ret1) return ret1 + if (!ret1) return@inInteractableRange ret1 } // return false if the tile underneath is: @@ -50,7 +46,7 @@ object BlockBase { gameItem.dynamicID == "wall@" + ingame.world.getTileFromWall(mouseTile.x, mouseTile.y) || BlockCodex[ingame.world.getTileFromTerrain(mouseTile.x, mouseTile.y)].nameKey.contains("ACTORBLOCK_") ) - return false + return@inInteractableRange false // filter passed, do the job // FIXME this is only useful for Player @@ -71,21 +67,21 @@ object BlockBase { ) } - return true + true } - fun blockEffectWhenEquipped(delta: Float) { + fun blockEffectWhenEquipped(actor: ActorWithBody, delta: Float) { (Terrarum.ingame!! as TerrarumIngame).selectedWireRenderClass = "" } - fun wireStartPrimaryUse(gameItem: GameItem, delta: Float): Boolean { + fun wireStartPrimaryUse(actor: ActorWithBody, gameItem: GameItem, delta: Float) = inInteractableRange(actor) { val itemID = gameItem.originalID val ingame = Terrarum.ingame!! as TerrarumIngame val mouseTile = Point2i(Terrarum.mouseTileX, Terrarum.mouseTileY) // return false if the tile is already there if (ingame.world.getAllWiresFrom(mouseTile.x, mouseTile.y)?.searchFor(itemID) != null) - return false + return@inInteractableRange false // filter passed, do the job ingame.world.setTileWire( @@ -95,7 +91,7 @@ object BlockBase { false ) - return true + true } fun wireEffectWhenEquipped(gameItem: GameItem, delta: Float) { diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/ItemLogicSignalEmitter.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/ItemLogicSignalEmitter.kt index e2f21ddb2..9df360604 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/ItemLogicSignalEmitter.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/ItemLogicSignalEmitter.kt @@ -5,6 +5,7 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.terrarum.CommonResourcePool import net.torvald.terrarum.ModMgr import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameitem.GameItem import net.torvald.terrarum.gameitem.ItemID import net.torvald.terrarum.itemproperties.Material @@ -36,18 +37,18 @@ class ItemLogicSignalEmitter(originalID: ItemID) : GameItem(originalID) { equipPosition = EquipPosition.HAND_GRIP } - override fun startPrimaryUse(delta: Float): Boolean { + override fun startPrimaryUse(actor: ActorWithBody, delta: Float): Boolean { val item = FixtureLogicSignalEmitter() return item.spawn(Terrarum.mouseTileX, Terrarum.mouseTileY) // return true when placed, false when cannot be placed } - override fun effectWhenEquipped(delta: Float) { + override fun effectWhenEquipped(actor: ActorWithBody, delta: Float) { (Terrarum.ingame!! as TerrarumIngame).selectedWireRenderClass = "signal" } - override fun effectOnUnequip(delta: Float) { + override fun effectOnUnequip(actor: ActorWithBody, delta: Float) { (Terrarum.ingame!! as TerrarumIngame).selectedWireRenderClass = "" } diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/ItemStorageChest.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/ItemStorageChest.kt index 2a681f57c..b32188f65 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/ItemStorageChest.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/ItemStorageChest.kt @@ -3,8 +3,10 @@ package net.torvald.terrarum.modulebasegame.gameitems import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.terrarum.CommonResourcePool import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameitem.GameItem import net.torvald.terrarum.gameitem.ItemID +import net.torvald.terrarum.gameitem.inInteractableRange import net.torvald.terrarum.itemproperties.Material import net.torvald.terrarum.modulebasegame.gameactors.FixtureStorageChest import net.torvald.terrarum.modulebasegame.gameactors.FixtureTikiTorch @@ -30,10 +32,10 @@ class ItemStorageChest(originalID: ItemID) : GameItem(originalID) { equipPosition = EquipPosition.HAND_GRIP } - override fun startPrimaryUse(delta: Float): Boolean { + override fun startPrimaryUse(actor: ActorWithBody, delta: Float) = inInteractableRange(actor) { val item = FixtureStorageChest() - return item.spawn(Terrarum.mouseTileX, Terrarum.mouseTileY - item.blockBox.height + 1) + item.spawn(Terrarum.mouseTileX, Terrarum.mouseTileY - item.blockBox.height + 1) // return true when placed, false when cannot be placed } diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/ItemTikiTorch.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/ItemTikiTorch.kt index 30eb746a9..d9fcf6377 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/ItemTikiTorch.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/ItemTikiTorch.kt @@ -4,8 +4,10 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.terrarum.CommonResourcePool import net.torvald.terrarum.ModMgr import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameitem.GameItem import net.torvald.terrarum.gameitem.ItemID +import net.torvald.terrarum.gameitem.inInteractableRange import net.torvald.terrarum.itemproperties.Material import net.torvald.terrarum.modulebasegame.gameactors.FixtureTikiTorch import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack @@ -38,11 +40,12 @@ class ItemTikiTorch(originalID: ItemID) : GameItem(originalID) { equipPosition = EquipPosition.HAND_GRIP } - override fun startPrimaryUse(delta: Float): Boolean { + override fun startPrimaryUse(actor: ActorWithBody, delta: Float) = inInteractableRange(actor) { val item = FixtureTikiTorch() - return item.spawn(Terrarum.mouseTileX, Terrarum.mouseTileY - item.blockBox.height + 1) + item.spawn(Terrarum.mouseTileX, Terrarum.mouseTileY - item.blockBox.height + 1) // return true when placed, false when cannot be placed + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt index 1d2997608..fe29e9f9e 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt @@ -1,36 +1,29 @@ package net.torvald.terrarum.modulebasegame.gameitems import com.badlogic.gdx.graphics.g2d.TextureRegion -import net.torvald.terrarum.CommonResourcePool -import net.torvald.terrarum.Point2d -import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.* import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.blockproperties.Block -import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.gameactors.AVKey +import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameitem.GameItem import net.torvald.terrarum.gameitem.ItemID import net.torvald.terrarum.itemproperties.Calculate -import net.torvald.terrarum.itemproperties.MaterialCodex -import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.gameactors.DroppedItem import net.torvald.terrarum.modulebasegame.gameitems.PickaxeCore.BASE_MASS_AND_SIZE import net.torvald.terrarum.modulebasegame.gameitems.PickaxeCore.TOOL_DURABILITY_BASE import kotlin.math.roundToInt -import net.torvald.terrarum.* /** * Created by minjaesong on 2019-03-10. */ object PickaxeCore { - fun startPrimaryUse(delta: Float, item: GameItem): Boolean { - val player = (Terrarum.ingame!! as TerrarumIngame).actorNowPlaying ?: return false - + fun startPrimaryUse(actor: ActorWithBody, delta: Float, item: GameItem): Boolean { val mouseTileX = Terrarum.mouseTileX val mouseTileY = Terrarum.mouseTileY val mousePoint = Point2d(mouseTileX.toDouble(), mouseTileY.toDouble()) - val actorvalue = player.actorValue + val actorvalue = actor.actorValue item.using = true @@ -53,7 +46,7 @@ object PickaxeCore { (INGAME.world).inflictTerrainDamage( mouseTileX, mouseTileY, - Calculate.pickaxePower(player, item.material) * swingDmgToFrameDmg + Calculate.pickaxePower(actor, item.material) * swingDmgToFrameDmg )?.let { tileBroken -> val drop = BlockCodex[tileBroken].drop if (drop.isNotBlank()) { @@ -64,13 +57,11 @@ object PickaxeCore { return true } - fun endPrimaryUse(delta: Float, item: GameItem): Boolean { - val player = (Terrarum.ingame!! as TerrarumIngame).actorNowPlaying - if (player == null) return false + fun endPrimaryUse(actor: ActorWithBody, delta: Float, item: GameItem): Boolean { item.using = false // reset action timer to zero - player.actorValue.set(AVKey.__ACTION_TIMER, 0.0) + actor.actorValue.set(AVKey.__ACTION_TIMER, 0.0) return true } @@ -101,8 +92,8 @@ class PickaxeCopper(originalID: ItemID) : GameItem(originalID) { super.name = "Copper Pickaxe" } - override fun startPrimaryUse(delta: Float) = PickaxeCore.startPrimaryUse(delta, this) - override fun endPrimaryUse(delta: Float) = PickaxeCore.endPrimaryUse(delta, this) + override fun startPrimaryUse(actor: ActorWithBody, delta: Float) = PickaxeCore.startPrimaryUse(actor, delta, this) + override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = PickaxeCore.endPrimaryUse(actor, delta, this) } /** @@ -128,8 +119,8 @@ class PickaxeIron(originalID: ItemID) : GameItem(originalID) { super.name = "Iron Pickaxe" } - override fun startPrimaryUse(delta: Float) = PickaxeCore.startPrimaryUse(delta, this) - override fun endPrimaryUse(delta: Float) = PickaxeCore.endPrimaryUse(delta, this) + override fun startPrimaryUse(actor: ActorWithBody, delta: Float) = PickaxeCore.startPrimaryUse(actor , delta, this) + override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = PickaxeCore.endPrimaryUse(actor, delta, this) } /** @@ -155,6 +146,6 @@ class PickaxeSteel(originalID: ItemID) : GameItem(originalID) { super.name = "Steel Pickaxe" } - override fun startPrimaryUse(delta: Float) = PickaxeCore.startPrimaryUse(delta, this) - override fun endPrimaryUse(delta: Float) = PickaxeCore.endPrimaryUse(delta, this) + override fun startPrimaryUse(actor: ActorWithBody, delta: Float) = PickaxeCore.startPrimaryUse(actor, delta, this) + override fun endPrimaryUse(actor: ActorWithBody, delta: Float) = PickaxeCore.endPrimaryUse(actor, delta, this) } \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/WireCutterAll.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/WireCutterAll.kt index 6bd657d87..164ac913d 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/WireCutterAll.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/WireCutterAll.kt @@ -4,8 +4,10 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.terrarum.CommonResourcePool import net.torvald.terrarum.Point2i import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameitem.GameItem import net.torvald.terrarum.gameitem.ItemID +import net.torvald.terrarum.gameitem.inInteractableRange import net.torvald.terrarum.itemproperties.Material import net.torvald.terrarum.modulebasegame.TerrarumIngame @@ -32,22 +34,23 @@ class WireCutterAll(originalID: ItemID) : GameItem(originalID) { super.equipPosition = GameItem.EquipPosition.HAND_GRIP } - override fun startPrimaryUse(delta: Float): Boolean { + override fun startPrimaryUse(actor: ActorWithBody, delta: Float) = inInteractableRange(actor) { val ingame = Terrarum.ingame!! as TerrarumIngame val mouseTile = Point2i(Terrarum.mouseTileX, Terrarum.mouseTileY) val wires = ingame.world.getAllWiresFrom(mouseTile.x, mouseTile.y)?.cloneToList() wires?.forEach { ingame.world.removeTileWire(mouseTile.x, mouseTile.y, it, false) - } ?: return false - return true + } ?: return@inInteractableRange false + + true } - override fun effectWhenEquipped(delta: Float) { + override fun effectWhenEquipped(actor: ActorWithBody, delta: Float) { (Terrarum.ingame!! as TerrarumIngame).selectedWireRenderClass = "wire_render_all" } - override fun effectOnUnequip(delta: Float) { + override fun effectOnUnequip(actor: ActorWithBody, delta: Float) { (Terrarum.ingame!! as TerrarumIngame).selectedWireRenderClass = "" } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/WireGraphDebugger.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/WireGraphDebugger.kt index c6ba7ede5..fc804c217 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/WireGraphDebugger.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/WireGraphDebugger.kt @@ -4,11 +4,10 @@ import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.EMDASH import net.torvald.terrarum.* -import net.torvald.terrarum.blockproperties.WireCodex +import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameactors.BlockMarkerActor import net.torvald.terrarum.gameitem.GameItem import net.torvald.terrarum.gameitem.ItemID -import net.torvald.terrarum.itemproperties.MaterialCodex import net.torvald.terrarum.modulebasegame.TerrarumIngame class WireGraphDebugger(originalID: ItemID) : GameItem(originalID) { @@ -32,7 +31,7 @@ class WireGraphDebugger(originalID: ItemID) : GameItem(originalID) { private val sb = StringBuilder() private val blockMarker = CommonResourcePool.get("blockmarking_actor") as BlockMarkerActor - override fun effectWhenEquipped(delta: Float) { + override fun effectWhenEquipped(actor: ActorWithBody, delta: Float) { (Terrarum.ingame!! as TerrarumIngame).selectedWireRenderClass = "wire_render_all" blockMarker.shape = 3 @@ -70,7 +69,7 @@ class WireGraphDebugger(originalID: ItemID) : GameItem(originalID) { } } - override fun effectOnUnequip(delta: Float) { + override fun effectOnUnequip(actor: ActorWithBody, delta: Float) { (Terrarum.ingame!! as TerrarumIngame).selectedWireRenderClass = "" (Terrarum.ingame!! as TerrarumIngame).setTooltipMessage(null) blockMarker.isVisible = false diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/WirePieceSignalWire.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/WirePieceSignalWire.kt index 287ddf502..37ebff00b 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/WirePieceSignalWire.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/WirePieceSignalWire.kt @@ -2,7 +2,7 @@ package net.torvald.terrarum.modulebasegame.gameitems import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.terrarum.CommonResourcePool -import net.torvald.terrarum.blockproperties.Wire +import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameitem.GameItem import net.torvald.terrarum.gameitem.ItemID import net.torvald.terrarum.itemproperties.Material @@ -30,15 +30,15 @@ class WirePieceSignalWire(originalID: ItemID, private val atlasID: String, priva super.equipPosition = GameItem.EquipPosition.HAND_GRIP } - override fun startPrimaryUse(delta: Float): Boolean { - return BlockBase.wireStartPrimaryUse(this, delta) + override fun startPrimaryUse(actor: ActorWithBody, delta: Float): Boolean { + return BlockBase.wireStartPrimaryUse(actor,this, delta) } - override fun effectWhenEquipped(delta: Float) { + override fun effectWhenEquipped(actor: ActorWithBody, delta: Float) { BlockBase.wireEffectWhenEquipped(this, delta) } - override fun effectOnUnequip(delta: Float) { + override fun effectOnUnequip(actor: ActorWithBody, delta: Float) { BlockBase.wireEffectWhenUnequipped(this, delta) } } \ No newline at end of file