mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-09 18:14:06 +09:00
wire actor renders; functionality still wip
This commit is contained in:
@@ -53,7 +53,7 @@ object AssembleSheetPixmap {
|
|||||||
val animRow = theAnim.row
|
val animRow = theAnim.row
|
||||||
val animFrame = properties.getFrameNumberFromName(frameName)
|
val animFrame = properties.getFrameNumberFromName(frameName)
|
||||||
|
|
||||||
AppLoader.printdbg(this, "Frame to draw: $frameName (R$animRow C$animFrame)")
|
// AppLoader.printdbg(this, "Frame to draw: $frameName (R$animRow C$animFrame)")
|
||||||
|
|
||||||
drawFrame(animRow, animFrame, canvas, properties, bodyparts, transformList)
|
drawFrame(animRow, animFrame, canvas, properties, bodyparts, transformList)
|
||||||
|
|
||||||
|
|||||||
@@ -225,7 +225,7 @@ object ModMgr {
|
|||||||
object GameBlockLoader {
|
object GameBlockLoader {
|
||||||
@JvmStatic operator fun invoke(module: String) {
|
@JvmStatic operator fun invoke(module: String) {
|
||||||
BlockCodex(module, "blocks/blocks.csv")
|
BlockCodex(module, "blocks/blocks.csv")
|
||||||
WireCodex(module, "wires/wires.csv")
|
WireCodex(module, "wires/")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,9 +32,10 @@ object TerrarumAppConfiguration {
|
|||||||
*/
|
*/
|
||||||
const val VERSION_RAW = 0x000206D3
|
const val VERSION_RAW = 0x000206D3
|
||||||
|
|
||||||
//////////////////////////////////
|
//////////////////////////////////////////////////////////
|
||||||
// CONFIGURATION FOR TILE MAKER //
|
// CONFIGURATION FOR TILE MAKER //
|
||||||
//////////////////////////////////
|
// MAKE SURE THESE VALUES ARE UNIQUE IN THE SOURCE CODE //
|
||||||
|
//////////////////////////////////////////////////////////
|
||||||
const val TILE_SIZE = 16
|
const val TILE_SIZE = 16
|
||||||
const val TILE_SIZEF = TILE_SIZE.toFloat()
|
const val TILE_SIZEF = TILE_SIZE.toFloat()
|
||||||
const val TILE_SIZED = TILE_SIZE.toDouble()
|
const val TILE_SIZED = TILE_SIZE.toDouble()
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
package net.torvald.terrarum.blockproperties
|
package net.torvald.terrarum.blockproperties
|
||||||
|
|
||||||
import net.torvald.terrarum.AppLoader
|
import net.torvald.terrarum.AppLoader
|
||||||
|
import net.torvald.terrarum.CommonResourcePool
|
||||||
|
import net.torvald.terrarum.ModMgr
|
||||||
|
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
|
||||||
import net.torvald.terrarum.gameitem.GameItem
|
import net.torvald.terrarum.gameitem.GameItem
|
||||||
import net.torvald.terrarum.gameitem.ItemID
|
import net.torvald.terrarum.gameitem.ItemID
|
||||||
import net.torvald.terrarum.itemproperties.ItemCodex
|
import net.torvald.terrarum.itemproperties.ItemCodex
|
||||||
import net.torvald.terrarum.utils.CSVFetcher
|
import net.torvald.terrarum.utils.CSVFetcher
|
||||||
|
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
|
||||||
import org.apache.commons.csv.CSVRecord
|
import org.apache.commons.csv.CSVRecord
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
|
||||||
@@ -17,23 +21,34 @@ object WireCodex {
|
|||||||
|
|
||||||
private val nullProp = WireProp()
|
private val nullProp = WireProp()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* `wire.csv` and texture for all wires are expected to be found in the given path.
|
||||||
|
*
|
||||||
|
* @param module name of the module
|
||||||
|
* @param path to the "wires" directory, not path to the CSV; must end with a slash!
|
||||||
|
*/
|
||||||
operator fun invoke(module: String, path: String) {
|
operator fun invoke(module: String, path: String) {
|
||||||
try {
|
AppLoader.printmsg(this, "Building wire properties table for module $module")
|
||||||
val records = CSVFetcher.readFromModule(module, path)
|
|
||||||
|
try {
|
||||||
|
val records = CSVFetcher.readFromModule(module, path + "wires.csv")
|
||||||
|
|
||||||
AppLoader.printmsg(this, "Building wire properties table")
|
|
||||||
|
|
||||||
records.forEach {
|
records.forEach {
|
||||||
/*if (intVal(it, "id") == -1) {
|
|
||||||
setProp(nullProp, it)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
setProp(wireProps[intVal(it, "id")], it)
|
|
||||||
}*/
|
|
||||||
|
|
||||||
WireCodex.setProp(module, intVal(it, "id"), it)
|
WireCodex.setProp(module, intVal(it, "id"), it)
|
||||||
//val tileId = "$module:${intVal(it, "id")}"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AppLoader.printmsg(this, "Registering wire textures into the resource pool")
|
||||||
|
wireProps.keys.forEach { id ->
|
||||||
|
val wireid = id.split(':').last().toInt()
|
||||||
|
|
||||||
|
CommonResourcePool.addToLoadingList(id) {
|
||||||
|
val t = TextureRegionPack(ModMgr.getPath(module, "$path$wireid.tga"), TILE_SIZE, TILE_SIZE)
|
||||||
|
/*return*/t
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CommonResourcePool.loadAll()
|
||||||
}
|
}
|
||||||
catch (e: IOException) {
|
catch (e: IOException) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
|
|||||||
@@ -214,9 +214,13 @@ open class ActorWithBody(renderOrder: RenderOrder, val physProp: PhysProperties)
|
|||||||
(world!!.gravitation.y > 0 && isWalled(hitbox, COLLIDING_BOTTOM) ||
|
(world!!.gravitation.y > 0 && isWalled(hitbox, COLLIDING_BOTTOM) ||
|
||||||
world!!.gravitation.y < 0 && isWalled(hitbox, COLLIDING_TOP))
|
world!!.gravitation.y < 0 && isWalled(hitbox, COLLIDING_TOP))
|
||||||
}
|
}
|
||||||
/** Default to 'true' */
|
/**
|
||||||
|
* Toggles rendering
|
||||||
|
* Default to 'true' */
|
||||||
var isVisible = true
|
var isVisible = true
|
||||||
/** Default to 'true' */
|
/**
|
||||||
|
* Toggles the actual update
|
||||||
|
* Default to 'true' */
|
||||||
var isUpdate = true
|
var isUpdate = true
|
||||||
var isNoSubjectToGrav = false
|
var isNoSubjectToGrav = false
|
||||||
var isNoCollideWorld = false
|
var isNoCollideWorld = false
|
||||||
@@ -230,6 +234,11 @@ open class ActorWithBody(renderOrder: RenderOrder, val physProp: PhysProperties)
|
|||||||
*/
|
*/
|
||||||
var isChronostasis = false
|
var isChronostasis = false
|
||||||
|
|
||||||
|
/**
|
||||||
|
* if set to TRUE, the ingame will not move the actor into the active list
|
||||||
|
*/
|
||||||
|
var forceDormant = false
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gravitational Constant G. Load from gameworld.
|
* Gravitational Constant G. Load from gameworld.
|
||||||
* [m / s^2]
|
* [m / s^2]
|
||||||
|
|||||||
@@ -1,10 +1,44 @@
|
|||||||
package net.torvald.terrarum.gameactors
|
package net.torvald.terrarum.gameactors
|
||||||
|
|
||||||
|
import net.torvald.terrarum.CommonResourcePool
|
||||||
|
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
|
||||||
|
import net.torvald.terrarum.gameitem.ItemID
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by minjaesong on 2021-07-30.
|
* Created by minjaesong on 2021-07-30.
|
||||||
*/
|
*/
|
||||||
class WireActor(id: ActorID) : ActorWithBody(RenderOrder.WIRES, PhysProperties.IMMOBILE) {
|
class WireActor(id: ActorID) : ActorWithBody(RenderOrder.WIRES, PhysProperties.IMMOBILE) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
this.referenceID = id
|
referenceID = id
|
||||||
|
setHitboxDimension(2, 2, 0, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var oldWireId = ""
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param itemID must start with "wire@"
|
||||||
|
*/
|
||||||
|
fun setWire(itemID: ItemID, worldX: Int, worldY: Int) {
|
||||||
|
if (oldWireId != itemID) {
|
||||||
|
if (sprite == null) {
|
||||||
|
makeNewSprite(CommonResourcePool.getAsTextureRegionPack(itemID))
|
||||||
|
sprite!!.delays = floatArrayOf(1f,1f)
|
||||||
|
sprite!!.setRowsAndFrames(2, 16)
|
||||||
|
}
|
||||||
|
else sprite!!.setSpriteImage(CommonResourcePool.getAsTextureRegionPack(itemID))
|
||||||
|
|
||||||
|
oldWireId = itemID
|
||||||
|
}
|
||||||
|
setPosition(worldX * TILE_SIZE + 1.0, (worldY + 1.0) * TILE_SIZE - 1.0) // what the fuck?
|
||||||
|
sprite!!.currentRow = 1
|
||||||
|
sprite!!.currentFrame = 15
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun update(delta: Float) {
|
||||||
|
// set autotiling here
|
||||||
|
// hint: manipulate `sprite!!.currentFrame`
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -654,9 +654,9 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun fillUpWiresBuffer() {
|
private fun fillUpWiresBuffer() {
|
||||||
fun getOrMakeWireActor(num: Int): ActorWithBody {
|
fun getOrMakeWireActor(num: Int): WireActor {
|
||||||
return try {
|
return try {
|
||||||
getActorByID(ReferencingRanges.ACTORS_WIRES.first + num) as ActorWithBody
|
getActorByID(ReferencingRanges.ACTORS_WIRES.first + num) as WireActor
|
||||||
}
|
}
|
||||||
catch (_: IllegalArgumentException) {
|
catch (_: IllegalArgumentException) {
|
||||||
val actor = WireActor(ReferencingRanges.ACTORS_WIRES.first + num)
|
val actor = WireActor(ReferencingRanges.ACTORS_WIRES.first + num)
|
||||||
@@ -665,29 +665,35 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selectedWireRenderClass.isNotBlank()) {
|
val for_y_start = (WorldCamera.y.toFloat() / TILE_SIZE).floorInt()
|
||||||
val for_y_start = (WorldCamera.y.toFloat() / TILE_SIZE).floorInt()
|
val for_y_end = for_y_start + BlocksDrawer.tilesInVertical - 1
|
||||||
val for_y_end = for_y_start + BlocksDrawer.tilesInVertical - 1
|
|
||||||
|
|
||||||
val for_x_start = (WorldCamera.x.toFloat() / TILE_SIZE).floorInt()
|
val for_x_start = (WorldCamera.x.toFloat() / TILE_SIZE).floorInt()
|
||||||
val for_x_end = for_x_start + BlocksDrawer.tilesInHorizontal - 1
|
val for_x_end = for_x_start + BlocksDrawer.tilesInHorizontal - 1
|
||||||
|
|
||||||
var wiringCounter = 0
|
var wiringCounter = 0
|
||||||
for (y in for_y_start..for_y_end) {
|
for (y in for_y_start..for_y_end) {
|
||||||
for (x in for_x_start..for_x_end) {
|
for (x in for_x_start..for_x_end) {
|
||||||
val wires = world.getAllWiresFrom(x, y)
|
val wires = world.getAllWiresFrom(x, y)
|
||||||
|
|
||||||
wires?.forEach {
|
wires?.forEach {
|
||||||
if (WireCodex[it].renderClass == selectedWireRenderClass) {
|
val wireActor = getOrMakeWireActor(wiringCounter)
|
||||||
val wireActor = getOrMakeWireActor(wiringCounter)
|
|
||||||
|
|
||||||
// TODO setup the wire actor
|
if (WireCodex[it].renderClass == selectedWireRenderClass) {
|
||||||
|
wireActor.isUpdate = true
|
||||||
wiringCounter += 1
|
wireActor.isVisible = true
|
||||||
}
|
wireActor.forceDormant = false
|
||||||
|
wireActor.setWire(it, x, y)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
wireActor.isUpdate = false
|
||||||
|
wireActor.isVisible = false
|
||||||
|
wireActor.forceDormant = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wiringCounter += 1
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -746,7 +752,7 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
|
|||||||
var i = 0
|
var i = 0
|
||||||
while (i < actorContainerSize) { // loop through actorContainerInactive
|
while (i < actorContainerSize) { // loop through actorContainerInactive
|
||||||
val actor = actorContainerInactive[i]
|
val actor = actorContainerInactive[i]
|
||||||
if (actor is ActorWithBody && actor.inUpdateRange()) {
|
if (actor is ActorWithBody && actor.inUpdateRange() && !actor.forceDormant) {
|
||||||
activateDormantActor(actor) // duplicates are checked here
|
activateDormantActor(actor) // duplicates are checked here
|
||||||
actorContainerSize -= 1
|
actorContainerSize -= 1
|
||||||
i-- // array removed 1 elem, so we also decrement counter by 1
|
i-- // array removed 1 elem, so we also decrement counter by 1
|
||||||
@@ -773,7 +779,7 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
|
|||||||
i-- // array removed 1 elem, so we also decrement counter by 1
|
i-- // array removed 1 elem, so we also decrement counter by 1
|
||||||
}
|
}
|
||||||
// inactivate distant actors
|
// inactivate distant actors
|
||||||
else if (actor is ActorWithBody && !actor.inUpdateRange()) {
|
else if (actor is ActorWithBody && (!actor.inUpdateRange() || actor.forceDormant)) {
|
||||||
if (actor !is Projectile) { // if it's a projectile, don't inactivate it; just kill it.
|
if (actor !is Projectile) { // if it's a projectile, don't inactivate it; just kill it.
|
||||||
actorContainerInactive.add(actor) // naïve add; duplicates are checked when the actor is re-activated
|
actorContainerInactive.add(actor) // naïve add; duplicates are checked when the actor is re-activated
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import com.badlogic.gdx.graphics.Color
|
|||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
||||||
import com.badlogic.gdx.graphics.glutils.ShapeRenderer
|
import com.badlogic.gdx.graphics.glutils.ShapeRenderer
|
||||||
import net.torvald.terrarum.*
|
import net.torvald.terrarum.*
|
||||||
|
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
|
||||||
import net.torvald.terrarum.gameactors.AVKey
|
import net.torvald.terrarum.gameactors.AVKey
|
||||||
import net.torvald.terrarum.gameitem.GameItem
|
import net.torvald.terrarum.gameitem.GameItem
|
||||||
import net.torvald.terrarum.langpack.Lang
|
import net.torvald.terrarum.langpack.Lang
|
||||||
@@ -40,7 +41,7 @@ internal class FixtureStorageChest(nameFun: () -> String) : FixtureBase(
|
|||||||
(mainUI as UIStorageChest).chestInventory = this.inventory!!
|
(mainUI as UIStorageChest).chestInventory = this.inventory!!
|
||||||
(mainUI as UIStorageChest).chestNameFun = this.nameFun
|
(mainUI as UIStorageChest).chestNameFun = this.nameFun
|
||||||
|
|
||||||
setHitboxDimension(16, 16, 0, 0)
|
setHitboxDimension(TILE_SIZE, TILE_SIZE, 0, -1)
|
||||||
|
|
||||||
makeNewSprite(TextureRegionPack(CommonResourcePool.getAsTextureRegion("itemplaceholder_16").texture, 16, 16))
|
makeNewSprite(TextureRegionPack(CommonResourcePool.getAsTextureRegion("itemplaceholder_16").texture, 16, 16))
|
||||||
sprite!!.setRowsAndFrames(1, 1)
|
sprite!!.setRowsAndFrames(1, 1)
|
||||||
|
|||||||
Reference in New Issue
Block a user