the-flattening wip

This commit is contained in:
minjaesong
2021-02-10 17:48:01 +09:00
parent 73acaea025
commit 8fdc11288c
21 changed files with 513 additions and 503 deletions

View File

@@ -5,128 +5,128 @@ package net.torvald.terrarum.blockproperties
*/
object Block {
const val AIR = 0 // hard coded; this is the standard
const val AIR = "basegame:0" // hard coded; this is the standard
const val STONE = 16
const val STONE_QUARRIED = 17
const val STONE_TILE_WHITE = 18
const val STONE_BRICKS = 19
const val STONE = "basegame:16"
const val STONE_QUARRIED = "basegame:17"
const val STONE_TILE_WHITE = "basegame:18"
const val STONE_BRICKS = "basegame:19"
const val DIRT = 32
const val GRASS = 33
const val GRASSWALL = 34
const val DIRT = "basegame:32"
const val GRASS = "basegame:33"
const val GRASSWALL = "basegame:34"
const val PLANK_NORMAL = 48
const val PLANK_EBONY = 49
const val PLANK_BIRCH = 50
const val PLANK_BLOODROSE = 51
const val PLANK_NORMAL = "basegame:48"
const val PLANK_EBONY = "basegame:49"
const val PLANK_BIRCH = "basegame:50"
const val PLANK_BLOODROSE = "basegame:51"
const val TRUNK_NORMAL = 64
const val TRUNK_EBONY = 65
const val TRUNK_BIRCH = 66
const val TRUNK_BLOODROSE = 67
const val TRUNK_NORMAL = "basegame:64"
const val TRUNK_EBONY = "basegame:65"
const val TRUNK_BIRCH = "basegame:66"
const val TRUNK_BLOODROSE = "basegame:67"
const val SAND = 80
const val SAND_WHITE = 81
const val SAND_RED = 82
const val SAND_DESERT = 83
const val SAND_BLACK = 84
const val SAND_GREEN = 85
const val SAND = "basegame:80"
const val SAND_WHITE = "basegame:81"
const val SAND_RED = "basegame:82"
const val SAND_DESERT = "basegame:83"
const val SAND_BLACK = "basegame:84"
const val SAND_GREEN = "basegame:85"
const val GRAVEL = 96
const val GRAVEL_GREY = 97
const val GRAVEL = "basegame:96"
const val GRAVEL_GREY = "basegame:97"
const val ORE_COPPER = 112
const val ORE_IRON = 113
const val ORE_GOLD = 114
const val ORE_SILVER = 115
const val ORE_ILMENITE = 116
const val ORE_AURICHALCUM = 117
const val ORE_COPPER = "basegame:112"
const val ORE_IRON = "basegame:113"
const val ORE_GOLD = "basegame:114"
const val ORE_SILVER = "basegame:115"
const val ORE_ILMENITE = "basegame:116"
const val ORE_AURICHALCUM = "basegame:117"
const val RAW_RUBY = 128
const val RAW_EMERALD = 129
const val RAW_SAPPHIRE = 130
const val RAW_TOPAZ = 131
const val RAW_DIAMOND = 132
const val RAW_AMETHYST = 133
const val RAW_RUBY = "basegame:128"
const val RAW_EMERALD = "basegame:129"
const val RAW_SAPPHIRE = "basegame:130"
const val RAW_TOPAZ = "basegame:131"
const val RAW_DIAMOND = "basegame:132"
const val RAW_AMETHYST = "basegame:133"
const val SNOW = 144
const val ICE_FRAGILE = 145
const val ICE_NATURAL = 146
const val ICE_MAGICAL = 147
const val SNOW = "basegame:144"
const val ICE_FRAGILE = "basegame:145"
const val ICE_NATURAL = "basegame:146"
const val ICE_MAGICAL = "basegame:147"
const val GLASS_CRUDE = 148
const val GLASS_CLEAN = 149
const val GLASS_CRUDE = "basegame:148"
const val GLASS_CLEAN = "basegame:149"
const val PLATFORM_STONE = 160
const val PLATFORM_WOODEN = 161
const val PLATFORM_EBONY = 162
const val PLATFORM_BIRCH = 163
const val PLATFORM_BLOODROSE = 164
const val PLATFORM_STONE = "basegame:160"
const val PLATFORM_WOODEN = "basegame:161"
const val PLATFORM_EBONY = "basegame:162"
const val PLATFORM_BIRCH = "basegame:163"
const val PLATFORM_BLOODROSE = "basegame:164"
const val TORCH = 176
const val TORCH_FROST = 177
const val TORCH = "basegame:176"
const val TORCH_FROST = "basegame:177"
const val TORCH_OFF = 192
const val TORCH_FROST_OFF = 193
const val TORCH_OFF = "basegame:192"
const val TORCH_FROST_OFF = "basegame:193"
const val ILLUMINATOR_WHITE = 208
const val ILLUMINATOR_YELLOW = 209
const val ILLUMINATOR_ORANGE = 210
const val ILLUMINATOR_RED = 211
const val ILLUMINATOR_FUCHSIA = 212
const val ILLUMINATOR_PURPLE = 213
const val ILLUMINATOR_BLUE = 214
const val ILLUMINATOR_CYAN = 215
const val ILLUMINATOR_GREEN = 216
const val ILLUMINATOR_GREEN_DARK = 217
const val ILLUMINATOR_BROWN = 218
const val ILLUMINATOR_TAN = 219
const val ILLUMINATOR_GREY_LIGHT = 220
const val ILLUMINATOR_GREY_MED = 221
const val ILLUMINATOR_GREY_DARK = 222
const val ILLUMINATOR_BLACK = 223
const val ILLUMINATOR_WHITE = "basegame:208"
const val ILLUMINATOR_YELLOW = "basegame:209"
const val ILLUMINATOR_ORANGE = "basegame:210"
const val ILLUMINATOR_RED = "basegame:211"
const val ILLUMINATOR_FUCHSIA = "basegame:212"
const val ILLUMINATOR_PURPLE = "basegame:213"
const val ILLUMINATOR_BLUE = "basegame:214"
const val ILLUMINATOR_CYAN = "basegame:215"
const val ILLUMINATOR_GREEN = "basegame:216"
const val ILLUMINATOR_GREEN_DARK = "basegame:217"
const val ILLUMINATOR_BROWN = "basegame:218"
const val ILLUMINATOR_TAN = "basegame:219"
const val ILLUMINATOR_GREY_LIGHT = "basegame:220"
const val ILLUMINATOR_GREY_MED = "basegame:221"
const val ILLUMINATOR_GREY_DARK = "basegame:222"
const val ILLUMINATOR_BLACK = "basegame:223"
const val ILLUMINATOR_WHITE_OFF = 224
const val ILLUMINATOR_YELLOW_OFF = 225
const val ILLUMINATOR_ORANGE_OFF = 226
const val ILLUMINATOR_RED_OFF = 227
const val ILLUMINATOR_FUCHSIA_OFF = 228
const val ILLUMINATOR_PURPLE_OFF = 229
const val ILLUMINATOR_BLUE_OFF = 230
const val ILLUMINATOR_CYAN_OFF = 231
const val ILLUMINATOR_GREEN_OFF = 232
const val ILLUMINATOR_GREEN_DARK_OFF = 233
const val ILLUMINATOR_BROWN_OFF = 234
const val ILLUMINATOR_TAN_OFF = 235
const val ILLUMINATOR_GREY_LIGHT_OFF = 236
const val ILLUMINATOR_GREY_MED_OFF = 237
const val ILLUMINATOR_GREY_DARK_OFF = 238
const val ILLUMINATOR_BLACK_OFF = 239
const val ILLUMINATOR_WHITE_OFF = "basegame:224"
const val ILLUMINATOR_YELLOW_OFF = "basegame:225"
const val ILLUMINATOR_ORANGE_OFF = "basegame:226"
const val ILLUMINATOR_RED_OFF = "basegame:227"
const val ILLUMINATOR_FUCHSIA_OFF = "basegame:228"
const val ILLUMINATOR_PURPLE_OFF = "basegame:229"
const val ILLUMINATOR_BLUE_OFF = "basegame:230"
const val ILLUMINATOR_CYAN_OFF = "basegame:231"
const val ILLUMINATOR_GREEN_OFF = "basegame:232"
const val ILLUMINATOR_GREEN_DARK_OFF = "basegame:233"
const val ILLUMINATOR_BROWN_OFF = "basegame:234"
const val ILLUMINATOR_TAN_OFF = "basegame:235"
const val ILLUMINATOR_GREY_LIGHT_OFF = "basegame:236"
const val ILLUMINATOR_GREY_MED_OFF = "basegame:237"
const val ILLUMINATOR_GREY_DARK_OFF = "basegame:238"
const val ILLUMINATOR_BLACK_OFF = "basegame:239"
const val SANDSTONE = 240
const val SANDSTONE_WHITE = 241
const val SANDSTONE_RED = 242
const val SANDSTONE_DESERT = 243
const val SANDSTONE_BLACK = 244
const val SANDSTONE_GREEN = 245
const val SANDSTONE = "basegame:240"
const val SANDSTONE_WHITE = "basegame:241"
const val SANDSTONE_RED = "basegame:242"
const val SANDSTONE_DESERT = "basegame:243"
const val SANDSTONE_BLACK = "basegame:244"
const val SANDSTONE_GREEN = "basegame:245"
const val LANTERN = 256
const val SUNSTONE = 257
const val DAYLIGHT_CAPACITOR = 258
const val LANTERN = "basegame:256"
const val SUNSTONE = "basegame:257"
const val DAYLIGHT_CAPACITOR = "basegame:258"
const val ACTORBLOCK_NO_COLLISION = 4091
const val ACTORBLOCK_FULL_COLLISION = 4092
const val ACTORBLOCK_ALLOW_MOVE_DOWN = 4093
const val ACTORBLOCK_NO_PASS_RIGHT = 4094
const val ACTORBLOCK_NO_PASS_LEFT = 4095
const val ACTORBLOCK_NO_COLLISION = "basegame:4091"
const val ACTORBLOCK_FULL_COLLISION = "basegame:4092"
const val ACTORBLOCK_ALLOW_MOVE_DOWN = "basegame:4093"
const val ACTORBLOCK_NO_PASS_RIGHT = "basegame:4094"
const val ACTORBLOCK_NO_PASS_LEFT = "basegame:4095"
const val LAVA = 4094
const val WATER = 4095
const val LAVA = "basegame:4094"
const val WATER = "basegame:4095"
const val NULL = -1
const val NULL = "basegame:-1"
val actorblocks = listOf(
ACTORBLOCK_NO_COLLISION,

View File

@@ -5,6 +5,7 @@ import net.torvald.terrarum.AppLoader
import net.torvald.terrarum.AppLoader.printdbg
import net.torvald.terrarum.AppLoader.printmsg
import net.torvald.terrarum.ReferencingRanges
import net.torvald.terrarum.gameitem.ItemID
import net.torvald.terrarum.gameworld.FluidType
import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.utils.CSVFetcher
@@ -18,12 +19,12 @@ import java.io.IOException
*/
object BlockCodex {
private var blockProps = HashMap<Int, BlockProp>()
private var blockProps = HashMap<ItemID, BlockProp>()
val dynamicLights = SortedArrayList<Int>() // does not include virtual ones
val dynamicLights = SortedArrayList<ItemID>() // does not include virtual ones
/** 65536 */
val MAX_TERRAIN_TILES = GameWorld.TILES_SUPPORTED
//val MAX_TERRAIN_TILES = GameWorld.TILES_SUPPORTED
private val nullProp = BlockProp()
@@ -32,12 +33,9 @@ object BlockCodex {
// fake props for "randomised" dynamic lights
const val DYNAMIC_RANDOM_CASES = 64
var virtualPropsCount = 0
private set
/** always points to the HIGHEST prop ID. <Original ID, Virtual ID> */
val dynamicToVirtualPropMapping = ArrayList<Pair<Int, Int>>()
/** for random access dont iterate over this */
val dynamicToVirtualMap = hashMapOf<Int, Int>()
private var virtualTileCursor = 0
val tileToVirtual = HashMap<ItemID, List<ItemID>>()
val virtualToTile = HashMap<ItemID, ItemID>()
/**
* Later entry (possible from other modules) will replace older ones
@@ -56,27 +54,29 @@ object BlockCodex {
setProp(blockProps[intVal(it, "id")], it)
}*/
val id = intVal(it, "id")
setProp(id, it)
val numericID = intVal(it, "id")
setProp(module, numericID, it)
val tileId = "tile@$module:$numericID"
// register tiles with dynamic light
if ((blockProps[id]?.dynamicLuminosityFunction ?: 0) != 0) {
dynamicLights.add(id)
if ((blockProps[tileId]?.dynamicLuminosityFunction ?: 0) != 0) {
dynamicLights.add(tileId)
// add virtual props for dynamic lights
val virtualIDMax = ReferencingRanges.VIRTUAL_TILES.first - virtualPropsCount
dynamicToVirtualPropMapping.add(id to virtualIDMax)
dynamicToVirtualMap[id] = virtualIDMax
repeat(DYNAMIC_RANDOM_CASES) { i ->
setProp(virtualIDMax - i, it)
printdbg(this, "Block ID $id -> Virtual ID ${virtualIDMax - i}, baseLum: ${blockProps[virtualIDMax - i]?.baseLumCol}")
val virtualChunk = ArrayList<ItemID>()
repeat(DYNAMIC_RANDOM_CASES) { _ ->
val virtualID = "virt:$virtualTileCursor"
virtualPropsCount += 1
virtualToTile[virtualID] = tileId
virtualChunk.add(virtualID)
setProp("virt", virtualTileCursor, it)
printdbg(this, "Block ID $tileId -> Virtual ID $virtualID, baseLum: ${blockProps[virtualID]?.baseLumCol}")
virtualTileCursor += 1
}
tileToVirtual[tileId] = virtualChunk.sorted().toList()
}
if (id > highestNumber)
highestNumber = id
}
}
catch (e: IOException) {
@@ -84,6 +84,8 @@ object BlockCodex {
}
}
fun getAll() = blockProps.values
/*fun get(index: Int): BlockProp {
try {
return blockProps[index]
@@ -97,7 +99,7 @@ object BlockCodex {
}
}*/
operator fun get(rawIndex: Int?): BlockProp {
/*operator fun get(rawIndex: Int?): BlockProp {
if (rawIndex == null || rawIndex == Block.NULL) {
return nullProp
}
@@ -108,31 +110,45 @@ object BlockCodex {
catch (e: NullPointerException) {
throw NullPointerException("Blockprop with raw id $rawIndex does not exist.")
}
}
operator fun get(fluidType: FluidType?): BlockProp {
if (fluidType == null || fluidType.value == 0) {
return blockProps[Block.AIR]!!
}*/
operator fun get(blockID: ItemID?): BlockProp {
if (blockID == null || blockID == "basegame:"+Block.NULL) {
return nullProp
}
try {
return blockProps[fluidType.abs() + GameWorld.TILES_SUPPORTED - 1]!!
return blockProps[blockID]!!
}
catch (e: NullPointerException) {
throw NullPointerException("Blockprop with raw id $fluidType does not exist.")
throw NullPointerException("Blockprop with id $blockID does not exist.")
}
}
fun getOrNull(rawIndex: Int?): BlockProp? {//<O>
return blockProps[rawIndex]
operator fun get(fluidType: FluidType?): BlockProp {
// TODO fluid from other mods
if (fluidType == null || fluidType.value == 0) {
return blockProps["basegame:"+Block.AIR]!!
}
try {
return blockProps["basegame:${fluidType.abs() + GameWorld.TILES_SUPPORTED - 1}"]!!
}
catch (e: NullPointerException) {
throw NullPointerException("Blockprop with id $fluidType does not exist.")
}
}
private fun setProp(key: Int, record: CSVRecord) {
fun getOrNull(blockID: ItemID?): BlockProp? {//<O>
return blockProps[blockID]
}
private fun setProp(modname: String, key: Int, record: CSVRecord) {
val prop = BlockProp()
prop.nameKey = record.get("name")
prop.id = if (key == -1) 0 else intVal(record, "id")
prop.drop = intVal(record, "drop")
prop.id = "$modname:${(if (key == -1) 0 else intVal(record, "id"))}"
prop.drop = "$modname:${intVal(record, "drop")}"
prop.shadeColR = floatVal(record, "shdr")
prop.shadeColG = floatVal(record, "shdg")
@@ -163,9 +179,9 @@ object BlockCodex {
prop.dynamicLuminosityFunction = intVal(record, "dlfn")
blockProps[key] = prop
blockProps["$modname:$key"] = prop
printmsg(this, "${intVal(record, "id")}\t" + prop.nameKey)
printmsg(this, "$modname:${intVal(record, "id")}\t" + prop.nameKey)
}
}

View File

@@ -2,6 +2,7 @@ package net.torvald.terrarum.blockproperties
import net.torvald.gdx.graphics.Cvec
import net.torvald.random.XXHash32
import net.torvald.terrarum.gameitem.ItemID
import net.torvald.terrarum.gameworld.fmod
import net.torvald.terrarum.serialise.toLittle
@@ -10,7 +11,7 @@ import net.torvald.terrarum.serialise.toLittle
*/
class BlockProp {
var id: Int = 0
var id: ItemID = ""
var nameKey: String = ""
@@ -62,14 +63,14 @@ class BlockProp {
baseLumCol
} else {
val offset = XXHash32.hash(((x and 0xFFFF).shl(16) or (y and 0xFFFF)).toLittle(), 10000).fmod(BlockCodex.DYNAMIC_RANDOM_CASES)
BlockCodex[BlockCodex.dynamicToVirtualMap[id]!! - offset]._lumCol
BlockCodex[BlockCodex.tileToVirtual[id]!![offset]]._lumCol
}
fun getLumCol(x: Int, y: Int, channel: Int): Float = if (dynamicLuminosityFunction == 0) {
baseLumCol.getElem(channel)
} else {
val offset = XXHash32.hash(((x and 0xFFFF).shl(16) or (y and 0xFFFF)).toLittle(), 10000).fmod(BlockCodex.DYNAMIC_RANDOM_CASES)
BlockCodex[BlockCodex.dynamicToVirtualMap[id]!! - offset]._lumCol.getElem(channel)
BlockCodex[BlockCodex.tileToVirtual[id]!![offset]]._lumCol.getElem(channel)
}
/**
@@ -80,7 +81,7 @@ class BlockProp {
//fun getLum(channel: Int) = lumCol.getElem(channel)
var drop: Int = 0
var drop: ItemID = ""
var maxSupport: Int = -1 // couldn't use NULL at all...