mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-07 12:21:52 +09:00
always sorting arraylist; more wire stuffs
This commit is contained in:
26
shit.kts
Normal file
26
shit.kts
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
val list = intArrayOf(0,2,4,6,9,13,16,54,88)
|
||||||
|
|
||||||
|
val ID = 555
|
||||||
|
|
||||||
|
var low = 0
|
||||||
|
var high = list.size
|
||||||
|
var mid = -1
|
||||||
|
|
||||||
|
while (low < high) {
|
||||||
|
mid = (low + high).ushr(1)
|
||||||
|
|
||||||
|
if (list[mid] > ID)
|
||||||
|
high = mid
|
||||||
|
else
|
||||||
|
low = mid + 1
|
||||||
|
|
||||||
|
low
|
||||||
|
}
|
||||||
|
|
||||||
|
println("$low, $high, $mid")
|
||||||
|
|
||||||
|
val ll = arrayListOf(1,1,1,1,1)
|
||||||
|
ll.add(5, 8)
|
||||||
|
println(ll)
|
||||||
|
|
||||||
|
// take mid value? (except for ID < list[0])
|
||||||
@@ -35,9 +35,6 @@
|
|||||||
|
|
||||||
package com.jme3.math;
|
package com.jme3.math;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Random;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <code>FastMath</code> provides 'fast' math approximations and float equivalents of Math
|
* <code>FastMath</code> provides 'fast' math approximations and float equivalents of Math
|
||||||
* functions. These are all used as static values and functions.
|
* functions. These are all used as static values and functions.
|
||||||
@@ -118,10 +115,24 @@ final public class FastMath {
|
|||||||
* Throws runtimeException for all numbers <= 1.
|
* Throws runtimeException for all numbers <= 1.
|
||||||
*
|
*
|
||||||
* @param number The number to obtain the POT for.
|
* @param number The number to obtain the POT for.
|
||||||
* @return The next power of two.
|
* @return The next power of two. (0 -> 0, 1 -> 0, 2 -> 1, 4 -> 2, 8 -> 3, 16 -> 4, etc.)
|
||||||
*/
|
*/
|
||||||
public static int intLog2(int number) {
|
public static int intLog2(int number) {
|
||||||
if (number == 0) return 0;
|
return intLog2(number, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the next binary log of the given number.
|
||||||
|
*
|
||||||
|
* E.g. for an input 100, this returns 6.
|
||||||
|
* Throws runtimeException for all numbers <= 1.
|
||||||
|
*
|
||||||
|
* @param number The number to obtain the POT for.
|
||||||
|
* @param zeroCase What to return if the input number is zero.
|
||||||
|
* @return The next power of two. (0 -> zeroCase, 1 -> 0, 2 -> 1, 4 -> 2, 8 -> 3, 16 -> 4, etc.)
|
||||||
|
*/
|
||||||
|
public static int intLog2(int number, int zeroCase) { // zeroCase can't be null, for some reason...
|
||||||
|
if (number == 0) return zeroCase;
|
||||||
int log = 0;
|
int log = 0;
|
||||||
if( ( number & 0xffff0000 ) != 0 ) { number >>>= 16; log = 16; }
|
if( ( number & 0xffff0000 ) != 0 ) { number >>>= 16; log = 16; }
|
||||||
if( number >= 256 ) { number >>>= 8; log += 8; }
|
if( number >= 256 ) { number >>>= 8; log += 8; }
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package net.torvald.parametricsky
|
package net.torvald.parametricsky
|
||||||
|
|
||||||
import net.torvald.dataclass.Matrix
|
import net.torvald.util.Matrix
|
||||||
import kotlin.math.pow
|
import kotlin.math.pow
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import com.github.strikerx3.jxinput.XInputDevice;
|
|||||||
import com.google.gson.JsonArray;
|
import com.google.gson.JsonArray;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.google.gson.JsonPrimitive;
|
import com.google.gson.JsonPrimitive;
|
||||||
import net.torvald.dataclass.ArrayListMap;
|
import net.torvald.util.ArrayListMap;
|
||||||
import net.torvald.getcpuname.GetCpuName;
|
import net.torvald.getcpuname.GetCpuName;
|
||||||
import net.torvald.terrarum.blockstats.MinimapComposer;
|
import net.torvald.terrarum.blockstats.MinimapComposer;
|
||||||
import net.torvald.terrarum.controller.GdxControllerAdapter;
|
import net.torvald.terrarum.controller.GdxControllerAdapter;
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ import net.torvald.terrarum.gameworld.GameWorld
|
|||||||
import net.torvald.terrarum.modulebasegame.gameactors.ActorHumanoid
|
import net.torvald.terrarum.modulebasegame.gameactors.ActorHumanoid
|
||||||
import net.torvald.terrarum.realestate.LandUtil
|
import net.torvald.terrarum.realestate.LandUtil
|
||||||
import net.torvald.terrarum.ui.ConsoleWindow
|
import net.torvald.terrarum.ui.ConsoleWindow
|
||||||
|
import net.torvald.util.SortedArrayList
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.locks.Lock
|
import java.util.concurrent.locks.Lock
|
||||||
import java.util.concurrent.locks.ReentrantLock
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Although the game (as product) can have infinitely many stages/planets/etc., those stages must be manually managed by YOU;
|
* Although the game (as product) can have infinitely many stages/planets/etc., those stages must be manually managed by YOU;
|
||||||
@@ -48,8 +48,8 @@ open class IngameInstance(val batch: SpriteBatch) : Screen {
|
|||||||
internal set
|
internal set
|
||||||
|
|
||||||
val ACTORCONTAINER_INITIAL_SIZE = 64
|
val ACTORCONTAINER_INITIAL_SIZE = 64
|
||||||
val actorContainerActive = ArrayList<Actor>(ACTORCONTAINER_INITIAL_SIZE)
|
val actorContainerActive = SortedArrayList<Actor>(ACTORCONTAINER_INITIAL_SIZE)
|
||||||
val actorContainerInactive = ArrayList<Actor>(ACTORCONTAINER_INITIAL_SIZE)
|
val actorContainerInactive = SortedArrayList<Actor>(ACTORCONTAINER_INITIAL_SIZE)
|
||||||
|
|
||||||
protected val terrainChangeQueue = Queue<BlockChangeQueueItem>()
|
protected val terrainChangeQueue = Queue<BlockChangeQueueItem>()
|
||||||
protected val wallChangeQueue = Queue<BlockChangeQueueItem>()
|
protected val wallChangeQueue = Queue<BlockChangeQueueItem>()
|
||||||
@@ -184,6 +184,9 @@ open class IngameInstance(val batch: SpriteBatch) : Screen {
|
|||||||
return -(low + 1) // key not found
|
return -(low + 1) // key not found
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun SortedArrayList<*>.binarySearch(actor: Actor) = this.toArrayList().binarySearch(actor.referenceID!!)
|
||||||
|
fun SortedArrayList<*>.binarySearch(ID: Int) = this.toArrayList().binarySearch(ID)
|
||||||
|
|
||||||
open fun removeActor(ID: Int) = removeActor(getActorByID(ID))
|
open fun removeActor(ID: Int) = removeActor(getActorByID(ID))
|
||||||
/**
|
/**
|
||||||
* get index of the actor and delete by the index.
|
* get index of the actor and delete by the index.
|
||||||
@@ -213,7 +216,6 @@ open class IngameInstance(val batch: SpriteBatch) : Screen {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
actorContainerActive.add(actor)
|
actorContainerActive.add(actor)
|
||||||
insertionSortLastElem(actorContainerActive) // we can do this as we are only adding single actor
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -240,19 +242,6 @@ open class IngameInstance(val batch: SpriteBatch) : Screen {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
fun insertionSortLastElem(arr: ArrayList<Actor>) {
|
|
||||||
ReentrantLock().lock {
|
|
||||||
var j = arr.lastIndex - 1
|
|
||||||
val x = arr.last()
|
|
||||||
while (j >= 0 && arr[j] > x) {
|
|
||||||
arr[j + 1] = arr[j]
|
|
||||||
j -= 1
|
|
||||||
}
|
|
||||||
arr[j + 1] = x
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
data class BlockChangeQueueItem(val old: Int, val new: Int, val posX: Int, val posY: Int)
|
data class BlockChangeQueueItem(val old: Int, val new: Int, val posX: Int, val posY: Int)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import com.badlogic.gdx.graphics.Pixmap
|
|||||||
import com.badlogic.gdx.graphics.Texture
|
import com.badlogic.gdx.graphics.Texture
|
||||||
import com.badlogic.gdx.graphics.glutils.FrameBuffer
|
import com.badlogic.gdx.graphics.glutils.FrameBuffer
|
||||||
import com.jme3.math.FastMath
|
import com.jme3.math.FastMath
|
||||||
import net.torvald.dataclass.HistoryArray
|
import net.torvald.util.HistoryArray
|
||||||
import net.torvald.terrarum.langpack.Lang
|
import net.torvald.terrarum.langpack.Lang
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import com.badlogic.gdx.graphics.glutils.ShaderProgram
|
|||||||
import com.badlogic.gdx.graphics.glutils.ShapeRenderer
|
import com.badlogic.gdx.graphics.glutils.ShapeRenderer
|
||||||
import com.badlogic.gdx.utils.GdxRuntimeException
|
import com.badlogic.gdx.utils.GdxRuntimeException
|
||||||
import com.jme3.math.FastMath
|
import com.jme3.math.FastMath
|
||||||
import net.torvald.dataclass.CircularArray
|
import net.torvald.util.CircularArray
|
||||||
import net.torvald.random.HQRNG
|
import net.torvald.random.HQRNG
|
||||||
import net.torvald.terrarum.AppLoader.*
|
import net.torvald.terrarum.AppLoader.*
|
||||||
import net.torvald.terrarum.gameactors.Actor
|
import net.torvald.terrarum.gameactors.Actor
|
||||||
|
|||||||
26
src/net/torvald/terrarum/blockproperties/Wire.kt
Normal file
26
src/net/torvald/terrarum/blockproperties/Wire.kt
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package net.torvald.terrarum.blockproperties
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 2019-03-12.
|
||||||
|
*/
|
||||||
|
object Wire {
|
||||||
|
|
||||||
|
/* A mapping for World's conduitTypes bits */
|
||||||
|
const val BIT_NONE = 0
|
||||||
|
const val BIT_SIGNAL_RED = 1
|
||||||
|
const val BIT_UTILITY_PROTOTYPE = 2
|
||||||
|
const val BIT_POWER_LOW = 4
|
||||||
|
const val BIT_POWER_HIGHT = 8
|
||||||
|
const val BIT_ETHERNET = 16
|
||||||
|
|
||||||
|
/* A mapping for World's conduitFills[] index */
|
||||||
|
const val FILL_ID_SIGNAL_RED = 0
|
||||||
|
const val FILL_ID_UTILITY_PROTOTYPE = 1
|
||||||
|
|
||||||
|
fun bitToConduitFillID(bit: Int) = when(bit) {
|
||||||
|
BIT_SIGNAL_RED -> FILL_ID_SIGNAL_RED
|
||||||
|
BIT_UTILITY_PROTOTYPE -> FILL_ID_UTILITY_PROTOTYPE
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,18 +1,17 @@
|
|||||||
package net.torvald.terrarum.debuggerapp
|
package net.torvald.terrarum.debuggerapp
|
||||||
|
|
||||||
import net.torvald.terrarum.gameactors.Actor
|
import net.torvald.terrarum.gameactors.Actor
|
||||||
|
import net.torvald.util.SortedArrayList
|
||||||
import java.awt.BorderLayout
|
import java.awt.BorderLayout
|
||||||
import java.awt.Dimension
|
import java.awt.Dimension
|
||||||
import java.awt.GridLayout
|
|
||||||
import java.util.*
|
|
||||||
import javax.swing.*
|
import javax.swing.*
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by minjaesong on 2016-12-29.
|
* Created by minjaesong on 2016-12-29.
|
||||||
*/
|
*/
|
||||||
class ActorsLister(
|
class ActorsLister(
|
||||||
val actorContainer: ArrayList<Actor>,
|
val actorContainer: SortedArrayList<Actor>,
|
||||||
val actorContainerInactive: ArrayList<Actor>) : JFrame() {
|
val actorContainerInactive: SortedArrayList<Actor>) : JFrame() {
|
||||||
|
|
||||||
private val activeActorArea = JTextArea()
|
private val activeActorArea = JTextArea()
|
||||||
private val activeActorScroller = JScrollPane(activeActorArea)
|
private val activeActorScroller = JScrollPane(activeActorArea)
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
package net.torvald.terrarum.gameworld
|
package net.torvald.terrarum.gameworld
|
||||||
|
|
||||||
import com.badlogic.gdx.graphics.Color
|
import com.badlogic.gdx.graphics.Color
|
||||||
|
import net.torvald.util.SortedArrayList
|
||||||
import net.torvald.terrarum.AppLoader.printdbg
|
import net.torvald.terrarum.AppLoader.printdbg
|
||||||
import net.torvald.terrarum.Terrarum
|
import net.torvald.terrarum.Terrarum
|
||||||
import net.torvald.terrarum.blockproperties.Block
|
import net.torvald.terrarum.blockproperties.Block
|
||||||
@@ -10,8 +11,10 @@ import net.torvald.terrarum.blockproperties.Fluid
|
|||||||
import net.torvald.terrarum.modulebasegame.gameworld.WorldSimulator
|
import net.torvald.terrarum.modulebasegame.gameworld.WorldSimulator
|
||||||
import net.torvald.terrarum.realestate.LandUtil
|
import net.torvald.terrarum.realestate.LandUtil
|
||||||
import net.torvald.terrarum.serialise.ReadLayerDataZip
|
import net.torvald.terrarum.serialise.ReadLayerDataZip
|
||||||
|
import net.torvald.terrarum.toInt
|
||||||
import org.dyn4j.geometry.Vector2
|
import org.dyn4j.geometry.Vector2
|
||||||
import kotlin.math.absoluteValue
|
import kotlin.math.absoluteValue
|
||||||
|
import kotlin.math.sign
|
||||||
|
|
||||||
typealias BlockAddress = Long
|
typealias BlockAddress = Long
|
||||||
|
|
||||||
@@ -80,6 +83,8 @@ open class GameWorld {
|
|||||||
val conduitFills1: HashMap<BlockAddress, Float> // size of gas packet on the block
|
val conduitFills1: HashMap<BlockAddress, Float> // size of gas packet on the block
|
||||||
get() = conduitFills[1]
|
get() = conduitFills[1]
|
||||||
|
|
||||||
|
private val wiringNodes = SortedArrayList<WiringNode>()
|
||||||
|
|
||||||
//public World physWorld = new World( new Vec2(0, -Terrarum.game.gravitationalAccel) );
|
//public World physWorld = new World( new Vec2(0, -Terrarum.game.gravitationalAccel) );
|
||||||
//physics
|
//physics
|
||||||
/** Meter per second squared. Currently only the downward gravity is supported. No reverse gravity :p */
|
/** Meter per second squared. Currently only the downward gravity is supported. No reverse gravity :p */
|
||||||
@@ -183,7 +188,7 @@ open class GameWorld {
|
|||||||
//val wireArray: ByteArray
|
//val wireArray: ByteArray
|
||||||
// get() = layerWire.data
|
// get() = layerWire.data
|
||||||
|
|
||||||
private fun coerceXY(x: Int, y: Int) = (x fmod width) to (y.coerceWorld())
|
private fun coerceXY(x: Int, y: Int) = (x fmod width) to (y.coerceIn(0, height - 1))
|
||||||
|
|
||||||
fun getTileFromWall(x: Int, y: Int): Int? {
|
fun getTileFromWall(x: Int, y: Int): Int? {
|
||||||
val (x, y) = coerceXY(x, y)
|
val (x, y) = coerceXY(x, y)
|
||||||
@@ -205,12 +210,7 @@ open class GameWorld {
|
|||||||
terrain * PairedMapLayer.RANGE + terrainDamage
|
terrain * PairedMapLayer.RANGE + terrainDamage
|
||||||
}
|
}
|
||||||
|
|
||||||
/*fun getTileFromWire(x: Int, y: Int): Int? {
|
fun getWires(x: Int, y: Int): Int {
|
||||||
val (x, y) = coerceXY(x, y)
|
|
||||||
return layerWire.getTile(x, y)
|
|
||||||
}*/
|
|
||||||
|
|
||||||
fun getWires(x: Int, y: Int): Int? {
|
|
||||||
return conduitTypes.getOrDefault(LandUtil.getBlockAddr(this, x, y), 0)
|
return conduitTypes.getOrDefault(LandUtil.getBlockAddr(this, x, y), 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -291,6 +291,28 @@ open class GameWorld {
|
|||||||
Terrarum.ingame?.queueWireChangedEvent(oldWire, tile.toUint(), LandUtil.getBlockAddr(this, x, y))
|
Terrarum.ingame?.queueWireChangedEvent(oldWire, tile.toUint(), LandUtil.getBlockAddr(this, x, y))
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overrides entire bits with given value. DO NOT USE THIS if you don't know what this means, you'll want to use setWire().
|
||||||
|
* Besides, this function won't fire WireChangedEvent
|
||||||
|
*/
|
||||||
|
fun setWires(x: Int, y: Int, wireBits: Int) {
|
||||||
|
val (x, y) = coerceXY(x, y)
|
||||||
|
conduitTypes[LandUtil.getBlockAddr(this, x, y)] = wireBits
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets single bit for given tile. YOU'LL WANT TO USE THIS instead of setWires()
|
||||||
|
* @param selectedWire wire-bit to modify, must be power of two
|
||||||
|
*/
|
||||||
|
fun setWire(x: Int, y: Int, selectedWire: Int, bitToSet: Boolean) {
|
||||||
|
val oldWireBits = getWires(x, y)
|
||||||
|
val oldStatus = getWires(x, y) or selectedWire != 0
|
||||||
|
if (oldStatus != bitToSet) {
|
||||||
|
setWires(x, y, (oldWireBits and selectedWire.inv()) or (selectedWire * oldStatus.toInt()))
|
||||||
|
Terrarum.ingame?.queueWireChangedEvent(selectedWire * oldStatus.toInt(), selectedWire * bitToSet.toInt(), LandUtil.getBlockAddr(this, x, y))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun getTileFrom(mode: Int, x: Int, y: Int): Int? {
|
fun getTileFrom(mode: Int, x: Int, y: Int): Int? {
|
||||||
if (mode == TERRAIN) {
|
if (mode == TERRAIN) {
|
||||||
return getTileFromTerrain(x, y)
|
return getTileFromTerrain(x, y)
|
||||||
@@ -460,6 +482,17 @@ open class GameWorld {
|
|||||||
override fun toString() = "Fluid type: ${type.value}, amount: $amount"
|
override fun toString() = "Fluid type: ${type.value}, amount: $amount"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private data class WiringNode(
|
||||||
|
val position: BlockAddress,
|
||||||
|
/** One defined in WireCodex, always power of two */
|
||||||
|
val typeBitMask: Int,
|
||||||
|
var fills: Float = 0f,
|
||||||
|
var connectedNodes: ArrayList<WiringNode>
|
||||||
|
) : Comparable<WiringNode> {
|
||||||
|
override fun compareTo(other: WiringNode): Int {
|
||||||
|
return (this.position - other.position).sign
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun getTemperature(worldTileX: Int, worldTileY: Int): Float? {
|
fun getTemperature(worldTileX: Int, worldTileY: Int): Float? {
|
||||||
return null
|
return null
|
||||||
@@ -470,8 +503,6 @@ open class GameWorld {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun Int.coerceWorld() = this.coerceIn(0, height - 1)
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@Transient val WALL = 0
|
@Transient val WALL = 0
|
||||||
@Transient val TERRAIN = 1
|
@Transient val TERRAIN = 1
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
package net.torvald.terrarum.gameworld
|
package net.torvald.terrarum.gameworld
|
||||||
|
|
||||||
import net.torvald.dataclass.Float16
|
import net.torvald.util.Float16
|
||||||
import net.torvald.dataclass.Float16Bits
|
import net.torvald.util.Float16Bits
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MapLayer that contains raw Float16 values
|
* MapLayer that contains raw Float16 values
|
||||||
*
|
*
|
||||||
* Created by minjaesong on 2017-04-21.
|
* Created by minjaesong on 2017-04-21.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated("Don't need this anymore")
|
||||||
open class MapLayerHalfFloat(val width: Int, val height: Int) : Iterable<Float16Bits> {
|
open class MapLayerHalfFloat(val width: Int, val height: Int) : Iterable<Float16Bits> {
|
||||||
|
|
||||||
constructor(width: Int, height: Int, init: Float) : this(width, height) {
|
constructor(width: Int, height: Int, init: Float) : this(width, height) {
|
||||||
|
|||||||
@@ -80,10 +80,12 @@ class EntryPoint : ModuleEntryPoint() {
|
|||||||
|
|
||||||
// check for collision with actors (BLOCK only)
|
// check for collision with actors (BLOCK only)
|
||||||
if (this.inventoryCategory == Category.BLOCK) {
|
if (this.inventoryCategory == Category.BLOCK) {
|
||||||
|
var ret1 = true
|
||||||
ingame.actorContainerActive.forEach {
|
ingame.actorContainerActive.forEach {
|
||||||
if (it is ActorWBMovable && it.hIntTilewiseHitbox.intersects(mousePoint))
|
if (it is ActorWBMovable && it.hIntTilewiseHitbox.intersects(mousePoint))
|
||||||
return false
|
ret1 = false // return is not allowed here
|
||||||
}
|
}
|
||||||
|
if (!ret1) return ret1
|
||||||
}
|
}
|
||||||
|
|
||||||
// return false if the tile is already there
|
// return false if the tile is already there
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import com.badlogic.gdx.Gdx
|
|||||||
import com.badlogic.gdx.Input
|
import com.badlogic.gdx.Input
|
||||||
import com.badlogic.gdx.graphics.Camera
|
import com.badlogic.gdx.graphics.Camera
|
||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
||||||
import net.torvald.dataclass.CircularArray
|
|
||||||
import net.torvald.terrarum.*
|
import net.torvald.terrarum.*
|
||||||
import net.torvald.terrarum.AppLoader.printdbg
|
import net.torvald.terrarum.AppLoader.printdbg
|
||||||
import net.torvald.terrarum.blockproperties.BlockPropUtil
|
import net.torvald.terrarum.blockproperties.BlockPropUtil
|
||||||
@@ -34,6 +33,7 @@ import net.torvald.terrarum.worlddrawer.CreateTileAtlas
|
|||||||
import net.torvald.terrarum.worlddrawer.FeaturesDrawer
|
import net.torvald.terrarum.worlddrawer.FeaturesDrawer
|
||||||
import net.torvald.terrarum.worlddrawer.LightmapRenderer
|
import net.torvald.terrarum.worlddrawer.LightmapRenderer
|
||||||
import net.torvald.terrarum.worlddrawer.WorldCamera
|
import net.torvald.terrarum.worlddrawer.WorldCamera
|
||||||
|
import net.torvald.util.CircularArray
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.locks.ReentrantLock
|
import java.util.concurrent.locks.ReentrantLock
|
||||||
|
|
||||||
@@ -795,7 +795,6 @@ open class Ingame(batch: SpriteBatch) : IngameInstance(batch) {
|
|||||||
printStackTrace()
|
printStackTrace()
|
||||||
|
|
||||||
actorContainerActive.add(actor)
|
actorContainerActive.add(actor)
|
||||||
insertionSortLastElem(actorContainerActive) // we can do this as we are only adding single actor
|
|
||||||
|
|
||||||
if (actor is ActorWithBody) {
|
if (actor is ActorWithBody) {
|
||||||
when (actor.renderOrder) {
|
when (actor.renderOrder) {
|
||||||
@@ -829,7 +828,6 @@ open class Ingame(batch: SpriteBatch) : IngameInstance(batch) {
|
|||||||
else {
|
else {
|
||||||
actorContainerInactive.remove(actor)
|
actorContainerInactive.remove(actor)
|
||||||
actorContainerActive.add(actor)
|
actorContainerActive.add(actor)
|
||||||
insertionSortLastElem(actorContainerActive) // we can do this as we are only adding single actor
|
|
||||||
|
|
||||||
if (actor is ActorWithBody) {
|
if (actor is ActorWithBody) {
|
||||||
when (actor.renderOrder) {
|
when (actor.renderOrder) {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import com.badlogic.gdx.graphics.*
|
|||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
||||||
import com.badlogic.gdx.graphics.glutils.FrameBuffer
|
import com.badlogic.gdx.graphics.glutils.FrameBuffer
|
||||||
import com.badlogic.gdx.utils.ScreenUtils
|
import com.badlogic.gdx.utils.ScreenUtils
|
||||||
import net.torvald.dataclass.CircularArray
|
import net.torvald.util.CircularArray
|
||||||
import net.torvald.terrarum.*
|
import net.torvald.terrarum.*
|
||||||
import net.torvald.terrarum.gameactors.ActorWithBody
|
import net.torvald.terrarum.gameactors.ActorWithBody
|
||||||
import net.torvald.terrarum.gamecontroller.KeyToggler
|
import net.torvald.terrarum.gamecontroller.KeyToggler
|
||||||
@@ -94,7 +94,7 @@ object IngameRenderer {
|
|||||||
LightmapRenderer.fireRecalculateEvent(actorsRenderBehind, actorsRenderFront, actorsRenderMidTop, actorsRenderMiddle, actorsRenderOverlay)
|
LightmapRenderer.fireRecalculateEvent(actorsRenderBehind, actorsRenderFront, actorsRenderMidTop, actorsRenderMiddle, actorsRenderOverlay)
|
||||||
|
|
||||||
prepLightmapRGBA()
|
prepLightmapRGBA()
|
||||||
BlocksDrawer.renderData()
|
BlocksDrawer.renderData(selectedWireBitToDraw)
|
||||||
drawToRGB(actorsRenderBehind, actorsRenderMiddle, actorsRenderMidTop, actorsRenderFront, particlesContainer)
|
drawToRGB(actorsRenderBehind, actorsRenderMiddle, actorsRenderMidTop, actorsRenderFront, particlesContainer)
|
||||||
drawToA(actorsRenderBehind, actorsRenderMiddle, actorsRenderMidTop, actorsRenderFront, particlesContainer)
|
drawToA(actorsRenderBehind, actorsRenderMiddle, actorsRenderMidTop, actorsRenderFront, particlesContainer)
|
||||||
drawOverlayActors(actorsRenderOverlay)
|
drawOverlayActors(actorsRenderOverlay)
|
||||||
@@ -216,7 +216,7 @@ object IngameRenderer {
|
|||||||
batch.color = Color.WHITE
|
batch.color = Color.WHITE
|
||||||
|
|
||||||
|
|
||||||
drawWires = false
|
selectedWireBitToDraw = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -235,7 +235,19 @@ object IngameRenderer {
|
|||||||
|
|
||||||
internal var fboRGBexportRequested = false
|
internal var fboRGBexportRequested = false
|
||||||
|
|
||||||
var drawWires = false
|
/**
|
||||||
|
* Which wires should be drawn. Normally this value is set by the wiring item (e.g. wire pieces, wirecutters)
|
||||||
|
* This number is directly related with the World's wire bits:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* world.getWires(x, y) -> 0000101 (for example)
|
||||||
|
* value of 3 selects this ^ ^
|
||||||
|
* value of 1 selects this |
|
||||||
|
*
|
||||||
|
* The wire piece gets rendered when selected bit is set.
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
var selectedWireBitToDraw = 0
|
||||||
|
|
||||||
private fun drawToRGB(
|
private fun drawToRGB(
|
||||||
actorsRenderBehind: List<ActorWithBody>?,
|
actorsRenderBehind: List<ActorWithBody>?,
|
||||||
@@ -279,7 +291,7 @@ object IngameRenderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setCameraPosition(0f, 0f)
|
setCameraPosition(0f, 0f)
|
||||||
BlocksDrawer.drawFront(batch.projectionMatrix, drawWires) // blue coloured filter of water, etc.
|
BlocksDrawer.drawFront(batch.projectionMatrix, selectedWireBitToDraw) // blue coloured filter of water, etc.
|
||||||
|
|
||||||
batch.inUse {
|
batch.inUse {
|
||||||
FeaturesDrawer.drawEnvOverlay(batch)
|
FeaturesDrawer.drawEnvOverlay(batch)
|
||||||
|
|||||||
@@ -1,16 +1,14 @@
|
|||||||
package net.torvald.terrarum.modulebasegame.console
|
package net.torvald.terrarum.modulebasegame.console
|
||||||
|
|
||||||
import net.torvald.colourutil.Col4096
|
|
||||||
import net.torvald.terrarum.AppLoader
|
import net.torvald.terrarum.AppLoader
|
||||||
import net.torvald.terrarum.utils.RasterWriter
|
|
||||||
import net.torvald.terrarum.Terrarum
|
import net.torvald.terrarum.Terrarum
|
||||||
import net.torvald.terrarum.blockproperties.Block
|
|
||||||
import net.torvald.terrarum.console.ConsoleCommand
|
import net.torvald.terrarum.console.ConsoleCommand
|
||||||
import net.torvald.terrarum.console.Echo
|
import net.torvald.terrarum.console.Echo
|
||||||
import net.torvald.terrarum.console.EchoError
|
import net.torvald.terrarum.console.EchoError
|
||||||
|
import net.torvald.terrarum.utils.RasterWriter
|
||||||
import java.io.*
|
import net.torvald.terrarum.worlddrawer.CreateTileAtlas
|
||||||
import java.util.HashMap
|
import java.io.File
|
||||||
|
import java.io.IOException
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by minjaesong on 2016-01-17.
|
* Created by minjaesong on 2016-01-17.
|
||||||
@@ -20,57 +18,20 @@ internal object ExportMap : ConsoleCommand {
|
|||||||
//private var mapData: ByteArray? = null
|
//private var mapData: ByteArray? = null
|
||||||
// private var mapDataPointer = 0
|
// private var mapDataPointer = 0
|
||||||
|
|
||||||
private val colorTable = HashMap<Int, Col4096>()
|
|
||||||
|
|
||||||
init {
|
|
||||||
colorTable.put(Block.AIR, Col4096(0xCEF))
|
|
||||||
colorTable.put(Block.STONE, Col4096(0x888))
|
|
||||||
colorTable.put(Block.DIRT, Col4096(0x753))
|
|
||||||
colorTable.put(Block.GRASS, Col4096(0x472))
|
|
||||||
|
|
||||||
colorTable.put(Block.ORE_COPPER, Col4096(0x6A8))
|
|
||||||
colorTable.put(Block.ORE_IRON, Col4096(0xC75))
|
|
||||||
colorTable.put(Block.ORE_GOLD, Col4096(0xA87))
|
|
||||||
colorTable.put(Block.ORE_ILMENITE, Col4096(0x8AB))
|
|
||||||
colorTable.put(Block.ORE_AURICHALCUM, Col4096(0xD92))
|
|
||||||
colorTable.put(Block.ORE_SILVER, Col4096(0xDDD))
|
|
||||||
|
|
||||||
colorTable.put(Block.RAW_DIAMOND, Col4096(0x2BF))
|
|
||||||
colorTable.put(Block.RAW_RUBY, Col4096(0xB10))
|
|
||||||
colorTable.put(Block.RAW_EMERALD, Col4096(0x0B1))
|
|
||||||
colorTable.put(Block.RAW_SAPPHIRE, Col4096(0x01B))
|
|
||||||
colorTable.put(Block.RAW_TOPAZ, Col4096(0xC70))
|
|
||||||
colorTable.put(Block.RAW_AMETHYST, Col4096(0x70C))
|
|
||||||
|
|
||||||
colorTable.put(Block.WATER, Col4096(0x038))
|
|
||||||
|
|
||||||
colorTable.put(Block.SAND, Col4096(0xDDB))
|
|
||||||
colorTable.put(Block.SAND_WHITE, Col4096(0xFFD))
|
|
||||||
colorTable.put(Block.SAND_RED, Col4096(0xA32))
|
|
||||||
colorTable.put(Block.SAND_DESERT, Col4096(0xEDB))
|
|
||||||
colorTable.put(Block.SAND_BLACK, Col4096(0x444))
|
|
||||||
colorTable.put(Block.SAND_GREEN, Col4096(0x9A6))
|
|
||||||
|
|
||||||
colorTable.put(Block.GRAVEL, Col4096(0x664))
|
|
||||||
colorTable.put(Block.GRAVEL_GREY, Col4096(0x999))
|
|
||||||
|
|
||||||
colorTable.put(Block.ICE_NATURAL, Col4096(0x9AB))
|
|
||||||
colorTable.put(Block.ICE_MAGICAL, Col4096(0x7AC))
|
|
||||||
colorTable.put(Block.ICE_FRAGILE, Col4096(0x6AF))
|
|
||||||
colorTable.put(Block.SNOW, Col4096(0xCDE))
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun execute(args: Array<String>) {
|
override fun execute(args: Array<String>) {
|
||||||
val world = (Terrarum.ingame!!.world)
|
val world = (Terrarum.ingame!!.world)
|
||||||
|
|
||||||
if (args.size == 2) {
|
if (args.size == 2) {
|
||||||
|
|
||||||
|
// TODO rewrite to use Pixmap and PixmapIO
|
||||||
|
|
||||||
var mapData = ByteArray(world.width * world.height * 3)
|
var mapData = ByteArray(world.width * world.height * 3)
|
||||||
var mapDataPointer = 0
|
var mapDataPointer = 0
|
||||||
|
|
||||||
for (tile in world.terrainIterator()) {
|
for (tile in world.terrainIterator()) {
|
||||||
val colArray = (colorTable as Map<Int, Col4096>)
|
val colArray = CreateTileAtlas.terrainTileColourMap.getRaw(tile % 16, tile / 16).toByteArray()
|
||||||
.getOrElse(tile, { Col4096(0xFFF) }).toByteArray()
|
|
||||||
|
|
||||||
for (i in 0..2) {
|
for (i in 0..2) {
|
||||||
mapData[mapDataPointer + i] = colArray[i]
|
mapData[mapDataPointer + i] = colArray[i]
|
||||||
@@ -107,6 +68,16 @@ internal object ExportMap : ConsoleCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
* R-G-B-A order for RGBA input value
|
||||||
|
*/
|
||||||
|
private fun Int.toByteArray() = byteArrayOf(
|
||||||
|
this.shl(24).and(0xff).toByte(),
|
||||||
|
this.shl(16).and(0xff).toByte(),
|
||||||
|
this.shl(8).and(0xff).toByte(),
|
||||||
|
this.and(0xff).toByte()
|
||||||
|
)
|
||||||
|
|
||||||
override fun printUsage() {
|
override fun printUsage() {
|
||||||
|
|
||||||
Echo("Usage: export <name>")
|
Echo("Usage: export <name>")
|
||||||
|
|||||||
@@ -588,7 +588,7 @@ open class ActorHumanoid(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onActorValueChange(key: String, value: Any?) {
|
override fun onActorValueChange(key: String, value: Any?) {
|
||||||
// quickslot implementation
|
// make quickslot work
|
||||||
if (key == AVKey.__PLAYER_QUICKSLOTSEL && value != null) {
|
if (key == AVKey.__PLAYER_QUICKSLOTSEL && value != null) {
|
||||||
// ONLY FOR HAND_GRIPs!!
|
// ONLY FOR HAND_GRIPs!!
|
||||||
val quickBarItem = ItemCodex[inventory.getQuickslot(actorValue.getAsInt(key)!!)?.item]
|
val quickBarItem = ItemCodex[inventory.getQuickslot(actorValue.getAsInt(key)!!)?.item]
|
||||||
@@ -596,6 +596,9 @@ open class ActorHumanoid(
|
|||||||
if (quickBarItem != null && quickBarItem.equipPosition == GameItem.EquipPosition.HAND_GRIP) {
|
if (quickBarItem != null && quickBarItem.equipPosition == GameItem.EquipPosition.HAND_GRIP) {
|
||||||
equipItem(quickBarItem)
|
equipItem(quickBarItem)
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
unequipSlot(GameItem.EquipPosition.HAND_GRIP)
|
||||||
|
}
|
||||||
|
|
||||||
// force update inventory UI
|
// force update inventory UI
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -35,10 +35,12 @@ object PickaxeCore {
|
|||||||
|
|
||||||
// linear search filter (check for intersection with tilewise mouse point and tilewise hitbox)
|
// linear search filter (check for intersection with tilewise mouse point and tilewise hitbox)
|
||||||
// return false if hitting actors
|
// return false if hitting actors
|
||||||
|
var ret1 = true
|
||||||
Terrarum.ingame!!.actorContainerActive.forEach {
|
Terrarum.ingame!!.actorContainerActive.forEach {
|
||||||
if (it is ActorWBMovable && it.hIntTilewiseHitbox.intersects(mousePoint))
|
if (it is ActorWBMovable && it.hIntTilewiseHitbox.intersects(mousePoint))
|
||||||
return false
|
ret1 = false // return is not allowed here
|
||||||
}
|
}
|
||||||
|
if (!ret1) return ret1
|
||||||
|
|
||||||
// return false if here's no tile
|
// return false if here's no tile
|
||||||
if (Block.AIR == (Terrarum.ingame!!.world).getTileFromTerrain(mouseTileX, mouseTileY))
|
if (Block.AIR == (Terrarum.ingame!!.world).getTileFromTerrain(mouseTileX, mouseTileY))
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package net.torvald.terrarum.modulebasegame.items
|
|||||||
|
|
||||||
import com.badlogic.gdx.graphics.g2d.TextureRegion
|
import com.badlogic.gdx.graphics.g2d.TextureRegion
|
||||||
import net.torvald.terrarum.AppLoader
|
import net.torvald.terrarum.AppLoader
|
||||||
|
import net.torvald.terrarum.blockproperties.Wire
|
||||||
import net.torvald.terrarum.itemproperties.GameItem
|
import net.torvald.terrarum.itemproperties.GameItem
|
||||||
import net.torvald.terrarum.itemproperties.ItemID
|
import net.torvald.terrarum.itemproperties.ItemID
|
||||||
import net.torvald.terrarum.itemproperties.Material
|
import net.torvald.terrarum.itemproperties.Material
|
||||||
@@ -35,6 +36,7 @@ class WirePieceSignalWire(override val originalID: ItemID) : GameItem() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun effectWhenEquipped(delta: Float) {
|
override fun effectWhenEquipped(delta: Float) {
|
||||||
IngameRenderer.drawWires = true
|
IngameRenderer.selectedWireBitToDraw = Wire.BIT_SIGNAL_RED
|
||||||
|
//println("wires!")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package net.torvald.terrarum.modulebasegame.worldgenerator
|
package net.torvald.terrarum.modulebasegame.worldgenerator
|
||||||
|
|
||||||
import com.badlogic.gdx.graphics.Color
|
import com.badlogic.gdx.graphics.Color
|
||||||
import net.torvald.dataclass.IntArrayStack
|
import net.torvald.util.IntArrayStack
|
||||||
import net.torvald.colourutil.Col4096
|
import net.torvald.colourutil.Col4096
|
||||||
import net.torvald.random.HQRNG
|
import net.torvald.random.HQRNG
|
||||||
import net.torvald.terrarum.modulebasegame.RNGConsumer
|
import net.torvald.terrarum.modulebasegame.RNGConsumer
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import net.torvald.terrarum.gameworld.fmod
|
|||||||
*/
|
*/
|
||||||
object LandUtil {
|
object LandUtil {
|
||||||
fun getBlockAddr(world: GameWorld, x: Int, y: Int): BlockAddress =
|
fun getBlockAddr(world: GameWorld, x: Int, y: Int): BlockAddress =
|
||||||
// coercing and fmod-ing follows ROUNDWORLD rule
|
// coercing and fmod-ing follows ROUNDWORLD rule. See: GameWorld.coerceXY()
|
||||||
(world.width * y.coerceIn(0, world.height - 1)).toLong() + x.fmod(world.width)
|
(world.width * y.coerceIn(0, world.height - 1)).toLong() + x.fmod(world.width)
|
||||||
|
|
||||||
fun resolveBlockAddr(world: GameWorld, t: BlockAddress): Pair<Int, Int> =
|
fun resolveBlockAddr(world: GameWorld, t: BlockAddress): Pair<Int, Int> =
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import net.torvald.dataclass.CircularArray
|
import net.torvald.util.CircularArray
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by minjaesong on 2019-01-09.
|
* Created by minjaesong on 2019-01-09.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.badlogic.gdx.Input
|
|||||||
import com.badlogic.gdx.graphics.Camera
|
import com.badlogic.gdx.graphics.Camera
|
||||||
import com.badlogic.gdx.graphics.Color
|
import com.badlogic.gdx.graphics.Color
|
||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
||||||
import net.torvald.dataclass.HistoryArray
|
import net.torvald.util.HistoryArray
|
||||||
import net.torvald.terrarum.langpack.Lang
|
import net.torvald.terrarum.langpack.Lang
|
||||||
import net.torvald.terrarum.Terrarum
|
import net.torvald.terrarum.Terrarum
|
||||||
import net.torvald.terrarum.AppLoader
|
import net.torvald.terrarum.AppLoader
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package net.torvald.terrarum.worlddrawer
|
|||||||
import com.badlogic.gdx.Gdx
|
import com.badlogic.gdx.Gdx
|
||||||
import com.badlogic.gdx.graphics.*
|
import com.badlogic.gdx.graphics.*
|
||||||
import com.badlogic.gdx.math.Matrix4
|
import com.badlogic.gdx.math.Matrix4
|
||||||
|
import com.jme3.math.FastMath
|
||||||
import net.torvald.terrarum.*
|
import net.torvald.terrarum.*
|
||||||
import net.torvald.terrarum.AppLoader.printdbg
|
import net.torvald.terrarum.AppLoader.printdbg
|
||||||
import net.torvald.terrarum.blockproperties.Block
|
import net.torvald.terrarum.blockproperties.Block
|
||||||
@@ -184,7 +185,7 @@ internal object BlocksDrawer {
|
|||||||
// NO draw lightmap using colour filter, actors must also be hidden behind the darkness
|
// NO draw lightmap using colour filter, actors must also be hidden behind the darkness
|
||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
|
|
||||||
internal fun renderData() {
|
internal fun renderData(wireBit: Int) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
drawTIME_T = (world as GameWorldExtension).time.TIME_T - (WorldTime.DAY_LENGTH * 15) // offset by -15 days
|
drawTIME_T = (world as GameWorldExtension).time.TIME_T - (WorldTime.DAY_LENGTH * 15) // offset by -15 days
|
||||||
@@ -197,7 +198,7 @@ internal object BlocksDrawer {
|
|||||||
|
|
||||||
drawTiles(WALL)
|
drawTiles(WALL)
|
||||||
drawTiles(TERRAIN) // regular tiles
|
drawTiles(TERRAIN) // regular tiles
|
||||||
drawTiles(WIRE)
|
drawTiles(WIRE, wireBit)
|
||||||
drawTiles(FLUID)
|
drawTiles(FLUID)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -214,7 +215,7 @@ internal object BlocksDrawer {
|
|||||||
renderUsingBuffer(FLUID, projectionMatrix)
|
renderUsingBuffer(FLUID, projectionMatrix)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun drawFront(projectionMatrix: Matrix4, drawWires: Boolean) {
|
internal fun drawFront(projectionMatrix: Matrix4, drawWires: Int) {
|
||||||
// blend mul
|
// blend mul
|
||||||
Gdx.gl.glEnable(GL20.GL_TEXTURE_2D)
|
Gdx.gl.glEnable(GL20.GL_TEXTURE_2D)
|
||||||
Gdx.gl.glEnable(GL20.GL_BLEND)
|
Gdx.gl.glEnable(GL20.GL_BLEND)
|
||||||
@@ -227,7 +228,8 @@ internal object BlocksDrawer {
|
|||||||
|
|
||||||
gdxSetBlendNormal()
|
gdxSetBlendNormal()
|
||||||
|
|
||||||
if (drawWires) {
|
if (drawWires != 0) {
|
||||||
|
//println("drawing wires")
|
||||||
renderUsingBuffer(WIRE, projectionMatrix)
|
renderUsingBuffer(WIRE, projectionMatrix)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -257,12 +259,24 @@ internal object BlocksDrawer {
|
|||||||
|
|
||||||
private val tileDrawLightThreshold = 2f / LightmapRenderer.MUL
|
private val tileDrawLightThreshold = 2f / LightmapRenderer.MUL
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Turns bitmask-with-single-bit-set into its bit index. The LSB is counted as 1, and thus the index starts at one.
|
||||||
|
* @return 0 -> null, 1 -> 0, 2 -> 1, 4 -> 2, 8 -> 3, 16 -> 4, ...
|
||||||
|
*/
|
||||||
|
private fun Int.toBitOrd(): Int? =
|
||||||
|
if (this > 0 && !FastMath.isPowerOfTwo(this)) throw IllegalArgumentException("value must be power of two: $this")
|
||||||
|
else {
|
||||||
|
val k = FastMath.intLog2(this, -1)
|
||||||
|
if (k == -1) null else k
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes to buffer. Actual draw code must be called after this operation.
|
* Writes to buffer. Actual draw code must be called after this operation.
|
||||||
*
|
*
|
||||||
* @param drawModeTilesBlendMul If current drawing mode is MULTIPLY. Doesn't matter if mode is FLUID.
|
* @param drawModeTilesBlendMul If current drawing mode is MULTIPLY. Doesn't matter if mode is FLUID.
|
||||||
|
* @param wire coduitTypes bit that is selected to be drawn. Must be the power of two.
|
||||||
*/
|
*/
|
||||||
private fun drawTiles(mode: Int) {
|
private fun drawTiles(mode: Int, wireBit: Int = 0) {
|
||||||
// can't be "WorldCamera.y / TILE_SIZE":
|
// can't be "WorldCamera.y / TILE_SIZE":
|
||||||
// ( 3 / 16) == 0
|
// ( 3 / 16) == 0
|
||||||
// (-3 / 16) == -1 <-- We want it to be '-1', not zero
|
// (-3 / 16) == -1 <-- We want it to be '-1', not zero
|
||||||
@@ -291,7 +305,7 @@ internal object BlocksDrawer {
|
|||||||
val thisTile = when (mode) {
|
val thisTile = when (mode) {
|
||||||
WALL -> world.getTileFromWall(x, y)
|
WALL -> world.getTileFromWall(x, y)
|
||||||
TERRAIN -> world.getTileFromTerrain(x, y)
|
TERRAIN -> world.getTileFromTerrain(x, y)
|
||||||
WIRE -> world.getWires(x, y)
|
WIRE -> world.getWires(x, y).and(wireBit).toBitOrd()
|
||||||
FLUID -> world.getFluid(x, y).type.abs()
|
FLUID -> world.getFluid(x, y).type.abs()
|
||||||
else -> throw IllegalArgumentException()
|
else -> throw IllegalArgumentException()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package net.torvald.dataclass
|
package net.torvald.util
|
||||||
|
|
||||||
import java.util.function.BiConsumer
|
import java.util.function.BiConsumer
|
||||||
import java.util.function.BiFunction
|
import java.util.function.BiFunction
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package net.torvald.dataclass
|
package net.torvald.util
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package net.torvald.dataclass
|
package net.torvald.util
|
||||||
|
|
||||||
import kotlin.experimental.or
|
import kotlin.experimental.or
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package net.torvald.dataclass
|
package net.torvald.util
|
||||||
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package net.torvald.dataclass
|
package net.torvald.util
|
||||||
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package net.torvald.dataclass
|
package net.torvald.util
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Taken and improved from https://introcs.cs.princeton.edu/java/95linear/Matrix.java.html
|
* Taken and improved from https://introcs.cs.princeton.edu/java/95linear/Matrix.java.html
|
||||||
86
src/net/torvald/util/SortedArrayList.kt
Normal file
86
src/net/torvald/util/SortedArrayList.kt
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
package net.torvald.util
|
||||||
|
|
||||||
|
import net.torvald.terrarum.lock
|
||||||
|
import java.util.concurrent.locks.ReentrantLock
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The modification of the arraylist that its element is always sorted.
|
||||||
|
*
|
||||||
|
* Created by minjaesong on 2019-03-12.
|
||||||
|
*/
|
||||||
|
class SortedArrayList<T: Comparable<T>>(initialSize: Int = 10) {
|
||||||
|
|
||||||
|
private val arrayList = ArrayList<T>(initialSize)
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
fun add(elem: T) {
|
||||||
|
// don't append-at-tail-and-sort; just insert at right index
|
||||||
|
ReentrantLock().lock {
|
||||||
|
var low = 0
|
||||||
|
var high = arrayList.size
|
||||||
|
|
||||||
|
while (low < high) {
|
||||||
|
val mid = (low + high).ushr(1)
|
||||||
|
|
||||||
|
if (arrayList[mid] > elem)
|
||||||
|
high = mid
|
||||||
|
else
|
||||||
|
low = mid + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
arrayList.add(low, elem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val size: Int
|
||||||
|
get() = arrayList.size
|
||||||
|
|
||||||
|
fun removeAt(index: Int) = arrayList.removeAt(index)
|
||||||
|
fun remove(element: T) = arrayList.remove(element)
|
||||||
|
fun removeLast() = arrayList.removeAt(arrayList.size)
|
||||||
|
|
||||||
|
operator fun get(index: Int) = arrayList[index]
|
||||||
|
|
||||||
|
fun iterator() = arrayList.iterator()
|
||||||
|
fun forEach(action: (T) -> Unit) = arrayList.forEach(action)
|
||||||
|
fun forEachIndexed(action: (Int, T) -> Unit) = arrayList.forEachIndexed(action)
|
||||||
|
//fun <R> map(transformation: (T) -> R) = arrayList.map(transformation)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select one unsorted element from the array and put it onto the sorted spot.
|
||||||
|
*
|
||||||
|
* The list must be fully sorted except for that one "renegade", otherwise the operation is undefined behaviour.
|
||||||
|
*/
|
||||||
|
private fun sortThisRenegade(index: Int) {
|
||||||
|
if (
|
||||||
|
(index == arrayList.lastIndex && arrayList[index - 1] <= arrayList[index]) ||
|
||||||
|
(index == 0 && arrayList[index] <= arrayList[index + 1]) ||
|
||||||
|
(arrayList[index - 1] <= arrayList[index] && arrayList[index] <= arrayList[index + 1])
|
||||||
|
) return
|
||||||
|
|
||||||
|
// modified binary search
|
||||||
|
ReentrantLock().lock {
|
||||||
|
val renegade = arrayList.removeAt(index)
|
||||||
|
|
||||||
|
var low = 0
|
||||||
|
var high = arrayList.size
|
||||||
|
|
||||||
|
while (low < high) {
|
||||||
|
val mid = (low + high).ushr(1)
|
||||||
|
|
||||||
|
if (arrayList[mid] > renegade)
|
||||||
|
high = mid
|
||||||
|
else
|
||||||
|
low = mid + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
arrayList.add(low, renegade)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does NOT create copies!
|
||||||
|
*/
|
||||||
|
fun toArrayList() = arrayList
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user