From d179d090c5aeb17a2003cc3e14395c32c4c0472b Mon Sep 17 00:00:00 2001 From: Song Minjae Date: Fri, 16 Dec 2016 23:57:46 +0900 Subject: [PATCH] tiles won't place to the position where occupied by actors Former-commit-id: 745558470933aea8d1f03da30ca5042a82c69eac Former-commit-id: 09e741f5eaec3eb18b8a76c82fcc2aa62378e82e --- src/net/torvald/terrarum/gameactors/ActorWithBody.kt | 8 ++++++++ .../torvald/terrarum/itemproperties/ItemPropCodex.kt | 11 +++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt index a18d968f1..1e057402b 100644 --- a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt +++ b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt @@ -44,6 +44,14 @@ open class ActorWithBody : Actor() { val hitbox = Hitbox(0.0, 0.0, 0.0, 0.0) // Hitbox is implemented using Double; @Transient val nextHitbox = Hitbox(0.0, 0.0, 0.0, 0.0) // 52 mantissas ought to be enough for anybody... + val tilewiseHitbox: Hitbox + get() = Hitbox.fromTwoPoints( + hitbox.posX.div(TILE_SIZE).floor(), + hitbox.posY.div(TILE_SIZE).floor(), + hitbox.endPointX.div(TILE_SIZE).floor(), + hitbox.endPointY.div(TILE_SIZE).floor() + ) + /** * Velocity vector for newtonian sim. * Acceleration: used in code like: diff --git a/src/net/torvald/terrarum/itemproperties/ItemPropCodex.kt b/src/net/torvald/terrarum/itemproperties/ItemPropCodex.kt index 25d06976a..fbed042a5 100644 --- a/src/net/torvald/terrarum/itemproperties/ItemPropCodex.kt +++ b/src/net/torvald/terrarum/itemproperties/ItemPropCodex.kt @@ -1,11 +1,13 @@ package net.torvald.terrarum.itemproperties +import net.torvald.point.Point2d import net.torvald.random.HQRNG import net.torvald.terrarum.KVHashMap import net.torvald.terrarum.gameactors.CanBeAnItem import net.torvald.terrarum.gameitem.InventoryItem import net.torvald.terrarum.Terrarum import net.torvald.terrarum.gameactors.AVKey +import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gamecontroller.mouseTileX import net.torvald.terrarum.gamecontroller.mouseTileY import net.torvald.terrarum.gameitem.EquipPosition @@ -49,8 +51,13 @@ object ItemPropCodex { } override fun secondaryUse(gc: GameContainer, delta: Int) { - // TODO check if occupied by ANY ActorWithBodies - + val mousePoint = Point2d(gc.mouseTileX.toDouble(), gc.mouseTileY.toDouble()) + // linear search filter (check for intersection with tilewise mouse point and tilewise hitbox) + Terrarum.ingame.actorContainer.forEach { + if (it is ActorWithBody && it.tilewiseHitbox.intersects(mousePoint)) + return + } + // filter passed, do the job Terrarum.ingame.world.setTileTerrain( gc.mouseTileX, gc.mouseTileY,