mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-10 02:24:05 +09:00
103 lines
3.9 KiB
Kotlin
103 lines
3.9 KiB
Kotlin
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.gameactors.ActorWBMovable
|
|
import net.torvald.terrarum.gameitem.GameItem
|
|
import net.torvald.terrarum.gameworld.GameWorld
|
|
import net.torvald.terrarum.itemproperties.ItemCodex
|
|
import net.torvald.terrarum.modulebasegame.TerrarumIngame
|
|
import net.torvald.terrarum.modulebasegame.IngameRenderer
|
|
import net.torvald.terrarum.realestate.LandUtil
|
|
|
|
/**
|
|
* Created by minjaesong on 2019-05-02.
|
|
*/
|
|
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: Int, delta: Float): Boolean {
|
|
val ingame = Terrarum.ingame!! as TerrarumIngame
|
|
val mousePoint = Point2d(Terrarum.mouseTileX.toDouble(), Terrarum.mouseTileY.toDouble())
|
|
val mouseTile = Point2i(Terrarum.mouseTileX, Terrarum.mouseTileY)
|
|
|
|
// check for collision with actors (BLOCK only)
|
|
// FIXME properly fix the collision detection: it OVERRIDES the tiki-torches which should not happen AT ALL
|
|
// FIXME (h)IntTilewiseHitbox is badly defined
|
|
// FIXME actually it's this code: not recognising hitbox's starting point correctly. Use F9 for visualisation
|
|
// FIXME the above issue is resolved by using intTilewise instead of hInt, but the hitbox itself is still
|
|
// FIXME badly defined
|
|
|
|
if (gameItem.inventoryCategory == GameItem.Category.BLOCK) {
|
|
var ret1 = true
|
|
ingame.actorContainerActive.forEach {
|
|
if (it is ActorWBMovable && it.intTilewiseHitbox.intersects(mousePoint))
|
|
ret1 = false // return is not allowed here
|
|
}
|
|
if (!ret1) return ret1
|
|
}
|
|
|
|
// return false if the tile is already there
|
|
if (gameItem.inventoryCategory == GameItem.Category.BLOCK &&
|
|
gameItem.dynamicID == ingame.world.getTileFromTerrain(mouseTile.x, mouseTile.y) ||
|
|
gameItem.inventoryCategory == GameItem.Category.WALL &&
|
|
gameItem.dynamicID - ItemCodex.ITEM_WALLS.start == ingame.world.getTileFromWall(mouseTile.x, mouseTile.y)
|
|
)
|
|
return false
|
|
|
|
// filter passed, do the job
|
|
// FIXME this is only useful for Player
|
|
if (itemID in ItemCodex.ITEM_TILES) {
|
|
ingame.world.setTileTerrain(
|
|
mouseTile.x,
|
|
mouseTile.y,
|
|
itemID
|
|
)
|
|
}
|
|
else {
|
|
ingame.world.setTileWall(
|
|
mouseTile.x,
|
|
mouseTile.y,
|
|
itemID
|
|
)
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
fun blockEffectWhenEquipped(delta: Float) {
|
|
IngameRenderer.selectedWireBitToDraw = 0
|
|
}
|
|
|
|
fun wireStartPrimaryUse(gameItem: GameItem, wireTypeBit: Int, delta: Float): Boolean {
|
|
val ingame = Terrarum.ingame!! as TerrarumIngame
|
|
val mouseTile = Point2i(Terrarum.mouseTileX, Terrarum.mouseTileY)
|
|
|
|
// return false if the tile is already there
|
|
if (ingame.world.getWiringBlocks(mouseTile.x, mouseTile.y) and wireTypeBit != 0)
|
|
return false
|
|
|
|
// filter passed, do the job
|
|
// FIXME this is only useful for Player
|
|
ingame.world.addNewConduitTo(
|
|
mouseTile.x,
|
|
mouseTile.y,
|
|
GameWorld.WiringNode(
|
|
LandUtil.getBlockAddr(ingame.world, mouseTile.x, mouseTile.y),
|
|
wireTypeBit,
|
|
0f
|
|
)
|
|
)
|
|
|
|
return true
|
|
}
|
|
|
|
fun wireEffectWhenEquipped(typebit: Int, delta: Float) {
|
|
IngameRenderer.selectedWireBitToDraw = typebit
|
|
}
|
|
|
|
} |