Files
Terrarum/src/net/torvald/terrarum/itemproperties/Material.kt
2022-06-28 22:51:09 +09:00

91 lines
2.8 KiB
Kotlin

package net.torvald.terrarum.itemproperties
import net.torvald.terrarum.App.printdbg
import net.torvald.terrarum.Codex
import net.torvald.terrarum.blockproperties.floatVal
import net.torvald.terrarum.blockproperties.intVal
import net.torvald.terrarum.utils.CSVFetcher
import org.apache.commons.csv.CSVRecord
import java.io.IOException
/**
* To be used with items AND TILES (electricity resistance, thermal conductivity)
*
* Created by minjaesong on 2016-03-18.
*/
class Material {
var strength: Int = 1 // actually tensile strength
var density: Int = 1000 // grams per litre
var thermalConductivity: Float = 10f // watts per metre-kelven
var forceMod: Int = 1 // arbitrary unit. See Pickaxe_Power.xlsx
var enduranceMod: Float = 1f // multiplier. Copper as 1.0
//var armourMod: Float // multiplier. Copper as 1.0
var durability: Int = 0 // tools only
var identifier: String = "Name not set"
var toolReach: Int = 6
/**
* Mainly intended to be used by third-party modules
*/
val extra = Codex()
}
class MaterialCodex {
@Transient val materialProps = HashMap<String, Material>()
@Transient internal val nullMaterial = Material()
internal constructor()
fun fromModule(module: String, path: String) {
printdbg(this, "Building material properties table")
try {
register(CSVFetcher.readFromModule(module, path))
}
catch (e: IOException) { e.printStackTrace() }
}
fun fromCSV(module: String, csvString: String) {
val csvParser = org.apache.commons.csv.CSVParser.parse(
csvString,
CSVFetcher.terrarumCSVFormat
)
val csvRecordList = csvParser.records
csvParser.close()
register(csvRecordList)
}
private fun register(records: List<CSVRecord>) {
records.forEach {
val prop = Material()
prop.strength = it.intVal("tens")
prop.density = it.intVal("dsty")
prop.forceMod = it.intVal("fmod")
prop.enduranceMod = it.floatVal("endurance")
prop.thermalConductivity = it.floatVal("tcond")
prop.identifier = it.get("idst").toUpperCase()
prop.toolReach = it.intVal("reach")
materialProps[prop.identifier] = prop
printdbg(this, "${prop.identifier}\t${prop.strength}\t${prop.density}\t${prop.forceMod}\t${prop.enduranceMod}")
}
}
fun clear() = materialProps.clear()
operator fun get(identifier: String) = try {
materialProps[identifier.toUpperCase()]!!
}
catch (e: NullPointerException) {
throw NullPointerException("Material with id $identifier does not exist.")
}
fun getOrDefault(identifier: String) = materialProps[identifier.toUpperCase()] ?: nullMaterial
}