Matter reconstructor rebalanced values
This commit is contained in:
parent
8567e75b6f
commit
7bc58bb7ff
@ -25,6 +25,7 @@ import ru.dbotthepony.mc.otm.capability.matter.PatternState
|
|||||||
import ru.dbotthepony.mc.otm.capability.matter.MatterStorageImpl
|
import ru.dbotthepony.mc.otm.capability.matter.MatterStorageImpl
|
||||||
import ru.dbotthepony.mc.otm.capability.matter.ProfiledMatterStorage
|
import ru.dbotthepony.mc.otm.capability.matter.ProfiledMatterStorage
|
||||||
import ru.dbotthepony.mc.otm.config.EnergyBalanceValues
|
import ru.dbotthepony.mc.otm.config.EnergyBalanceValues
|
||||||
|
import ru.dbotthepony.mc.otm.config.MachinesConfig
|
||||||
import ru.dbotthepony.mc.otm.container.HandlerFilter
|
import ru.dbotthepony.mc.otm.container.HandlerFilter
|
||||||
import ru.dbotthepony.mc.otm.container.MatteryContainer
|
import ru.dbotthepony.mc.otm.container.MatteryContainer
|
||||||
import ru.dbotthepony.mc.otm.container.UpgradeContainer
|
import ru.dbotthepony.mc.otm.container.UpgradeContainer
|
||||||
@ -60,8 +61,8 @@ class MatterReconstructorBlockEntity(blockPos: BlockPos, blockState: BlockState)
|
|||||||
private set
|
private set
|
||||||
|
|
||||||
val upgrades = UpgradeContainer(this::setChangedLight, 3, UpgradeType.REPLICATOR)
|
val upgrades = UpgradeContainer(this::setChangedLight, 3, UpgradeType.REPLICATOR)
|
||||||
val matter = ProfiledMatterStorage(MatterStorageImpl(::setChangedLight, FlowDirection.INPUT, upgrades.matterCapacity(::CAPACITY)))
|
val matter = ProfiledMatterStorage(MatterStorageImpl(::setChangedLight, FlowDirection.INPUT, upgrades.matterCapacity(MachinesConfig.MatterReconstructor.VALUES::matterCapacity)))
|
||||||
val energy = ProfiledEnergyStorage(WorkerEnergyStorage(::setChangedLight, upgrades.transform(ENERGY_VALUES)))
|
val energy = ProfiledEnergyStorage(WorkerEnergyStorage(::setChangedLight, upgrades.transform(MachinesConfig.MatterReconstructor.VALUES)))
|
||||||
|
|
||||||
val matterNode = object : MatterNode() {
|
val matterNode = object : MatterNode() {
|
||||||
override fun getMatterHandler(): IMatterStorage {
|
override fun getMatterHandler(): IMatterStorage {
|
||||||
@ -107,7 +108,7 @@ class MatterReconstructorBlockEntity(blockPos: BlockPos, blockState: BlockState)
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ALLOW_TO_SKIP_ANVIL && !ONLY_ANVIL) {
|
if (MachinesConfig.MatterReconstructor.ALLOW_TO_SKIP_ANVIL && !MachinesConfig.MatterReconstructor.ONLY_ANVIL) {
|
||||||
if (MatterManager.get(stack.item).hasMatterValue) {
|
if (MatterManager.get(stack.item).hasMatterValue) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -172,13 +173,13 @@ class MatterReconstructorBlockEntity(blockPos: BlockPos, blockState: BlockState)
|
|||||||
visualItemStack = item
|
visualItemStack = item
|
||||||
visualProgress = 0f
|
visualProgress = 0f
|
||||||
} else {
|
} else {
|
||||||
if (ALLOW_TO_SKIP_ANVIL && !ONLY_ANVIL) {
|
if (MachinesConfig.MatterReconstructor.ALLOW_TO_SKIP_ANVIL && !MachinesConfig.MatterReconstructor.ONLY_ANVIL) {
|
||||||
val matter = MatterManager.get(item.item)
|
val matter = MatterManager.get(item.item)
|
||||||
|
|
||||||
if (matter.hasMatterValue) {
|
if (matter.hasMatterValue) {
|
||||||
failureChance = FAILURE_CHANCE
|
failureChance = MachinesConfig.MatterReconstructor.FAILURE_CHANCE
|
||||||
progressPerTick = (item.maxDamage / matter.complexity) / DIVISOR
|
progressPerTick = (item.maxDamage / matter.complexity) / MachinesConfig.MatterReconstructor.DIVISOR
|
||||||
matterPerTick = (matter.matter / matter.complexity) / DIVISOR
|
matterPerTick = (matter.matter / matter.complexity) / MachinesConfig.MatterReconstructor.DIVISOR
|
||||||
return@once
|
return@once
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -186,14 +187,14 @@ class MatterReconstructorBlockEntity(blockPos: BlockPos, blockState: BlockState)
|
|||||||
val found = matterNode.graph.patterns.filter { item.item.isValidRepairItem(item, ItemStack(it.item, 1)) }.findFirst().orElse(null)
|
val found = matterNode.graph.patterns.filter { item.item.isValidRepairItem(item, ItemStack(it.item, 1)) }.findFirst().orElse(null)
|
||||||
|
|
||||||
if (found != null) {
|
if (found != null) {
|
||||||
failureChance = (1.0 - found.researchPercent) + FAILURE_CHANCE
|
failureChance = (1.0 - found.researchPercent) + MachinesConfig.MatterReconstructor.FAILURE_CHANCE
|
||||||
|
|
||||||
if (!ONLY_ANVIL) {
|
if (!MachinesConfig.MatterReconstructor.ONLY_ANVIL) {
|
||||||
val matter = MatterManager.get(item.item)
|
val matter = MatterManager.get(item.item)
|
||||||
|
|
||||||
if (matter.hasMatterValue) {
|
if (matter.hasMatterValue) {
|
||||||
progressPerTick = (item.maxDamage / matter.complexity) / DIVISOR
|
progressPerTick = (item.maxDamage / matter.complexity) / MachinesConfig.MatterReconstructor.DIVISOR
|
||||||
matterPerTick = (matter.matter / matter.complexity) / DIVISOR
|
matterPerTick = (matter.matter / matter.complexity) / MachinesConfig.MatterReconstructor.DIVISOR
|
||||||
return@once
|
return@once
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -201,8 +202,8 @@ class MatterReconstructorBlockEntity(blockPos: BlockPos, blockState: BlockState)
|
|||||||
@Suppress("name_shadowing")
|
@Suppress("name_shadowing")
|
||||||
val matter = MatterManager.get(found.item) * 2
|
val matter = MatterManager.get(found.item) * 2
|
||||||
|
|
||||||
progressPerTick = (item.maxDamage / matter.complexity) / DIVISOR
|
progressPerTick = (item.maxDamage / matter.complexity) / MachinesConfig.MatterReconstructor.DIVISOR
|
||||||
matterPerTick = (matter.matter / matter.complexity) / DIVISOR
|
matterPerTick = (matter.matter / matter.complexity) / MachinesConfig.MatterReconstructor.DIVISOR
|
||||||
} else {
|
} else {
|
||||||
matterPerTick = Decimal.ZERO
|
matterPerTick = Decimal.ZERO
|
||||||
progressPerTick = 0.0
|
progressPerTick = 0.0
|
||||||
@ -224,7 +225,7 @@ class MatterReconstructorBlockEntity(blockPos: BlockPos, blockState: BlockState)
|
|||||||
|
|
||||||
val thisProgressPerTick = progressPerTick * (1.0 + upgrades.speedBonus)
|
val thisProgressPerTick = progressPerTick * (1.0 + upgrades.speedBonus)
|
||||||
val matterPerTick = matterPerTick * (1.0 + upgrades.speedBonus)
|
val matterPerTick = matterPerTick * (1.0 + upgrades.speedBonus)
|
||||||
val energyConsumption = ENERGY_CONSUMPTION * (1.0 + upgrades.speedBonus) * (upgrades.energyConsumed + Decimal.ONE)
|
val energyConsumption = MachinesConfig.MatterReconstructor.VALUES.powerConsumption * (1.0 + upgrades.speedBonus) * (upgrades.energyConsumed + Decimal.ONE)
|
||||||
|
|
||||||
if (!item.isEmpty && matterPerTick.isPositive && thisProgressPerTick > 0.0 && item.isRepairable && item.isDamaged) {
|
if (!item.isEmpty && matterPerTick.isPositive && thisProgressPerTick > 0.0 && item.isRepairable && item.isDamaged) {
|
||||||
var progressPerTick = (repairProgress + thisProgressPerTick).coerceAtMost(item.damageValue.toDouble()) - repairProgress
|
var progressPerTick = (repairProgress + thisProgressPerTick).coerceAtMost(item.damageValue.toDouble()) - repairProgress
|
||||||
@ -242,7 +243,7 @@ class MatterReconstructorBlockEntity(blockPos: BlockPos, blockState: BlockState)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (matter.storedMatter < matterPerTick) {
|
if (matter.storedMatter < matterPerTick) {
|
||||||
val toDrain = (matterPerTick * EXTRACT_TICKS
|
val toDrain = (matterPerTick * 200
|
||||||
.coerceAtMost(item.damageValue) - matter.storedMatter)
|
.coerceAtMost(item.damageValue) - matter.storedMatter)
|
||||||
.coerceAtLeast(Decimal.ZERO)
|
.coerceAtLeast(Decimal.ZERO)
|
||||||
.coerceAtMost(matter.missingMatter)
|
.coerceAtMost(matter.missingMatter)
|
||||||
@ -289,67 +290,4 @@ class MatterReconstructorBlockEntity(blockPos: BlockPos, blockState: BlockState)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
|
||||||
val CAPACITY get() = _CAPACITY.get()
|
|
||||||
val ENERGY_CONSUMPTION get() = _ENERGY_CONSUMPTION.get()
|
|
||||||
val DIVISOR: Double get() = _DIVISOR.get()
|
|
||||||
val EXTRACT_TICKS: Int get() = _EXTRACT_TICKS.get()
|
|
||||||
val FAILURE_CHANCE: Double get() = _FAILURE_CHANCE.get()
|
|
||||||
val ONLY_ANVIL: Boolean get() = _ONLY_ANVIL.get()
|
|
||||||
val ALLOW_TO_SKIP_ANVIL: Boolean get() = _ALLOW_TO_SKIP_ANVIL.get()
|
|
||||||
|
|
||||||
private var _CAPACITY: DecimalConfigValue by WriteOnce()
|
|
||||||
private var _ENERGY_CONSUMPTION: DecimalConfigValue by WriteOnce()
|
|
||||||
private var _DIVISOR: ConfigValue<Double> by WriteOnce()
|
|
||||||
private var _FAILURE_CHANCE: ConfigValue<Double> by WriteOnce()
|
|
||||||
private var _EXTRACT_TICKS: ConfigValue<Int> by WriteOnce()
|
|
||||||
private var _ONLY_ANVIL: ConfigValue<Boolean> by WriteOnce()
|
|
||||||
private var _ALLOW_TO_SKIP_ANVIL: ConfigValue<Boolean> by WriteOnce()
|
|
||||||
|
|
||||||
var ENERGY_VALUES: EnergyBalanceValues by WriteOnce()
|
|
||||||
private set
|
|
||||||
|
|
||||||
fun registerConfig(builder: ForgeConfigSpec.Builder) {
|
|
||||||
builder.push(MNames.MATTER_RECONSTRUCTOR)
|
|
||||||
|
|
||||||
ENERGY_VALUES = BlockEnergyStorageImpl.makeConfigEntry(builder, capacity = Decimal(400_000), throughput = Decimal(2_000))
|
|
||||||
|
|
||||||
_CAPACITY = builder.defineDecimal("matterCapacity", Decimal(800), Decimal.ONE_TENTH)
|
|
||||||
_ENERGY_CONSUMPTION = builder.defineDecimal("energyConsumption", Decimal(600), Decimal.ONE)
|
|
||||||
|
|
||||||
_ALLOW_TO_SKIP_ANVIL = builder
|
|
||||||
.comment("Allow to repair tools without having their anvil-repair items researched")
|
|
||||||
.comment("Ignored if onlyAnvil is true")
|
|
||||||
.define("allowToSkipAnvil", false)
|
|
||||||
|
|
||||||
_ONLY_ANVIL = builder
|
|
||||||
.comment("Force repairing only by matter value of anvil materials")
|
|
||||||
.comment("Doesn't make logical sense but might be good for balancing")
|
|
||||||
.define("onlyAnvil", false)
|
|
||||||
|
|
||||||
_EXTRACT_TICKS = builder
|
|
||||||
.comment("How much ticks of matter work will be attempted to be extracted from matter network")
|
|
||||||
.comment("on matter starvation")
|
|
||||||
.comment("---")
|
|
||||||
.comment("This is a performance tuning value, do not change it if you don't know what you are doing!")
|
|
||||||
.defineInRange("extractTicks", 200, 1, Int.MAX_VALUE)
|
|
||||||
|
|
||||||
_FAILURE_CHANCE = builder
|
|
||||||
.comment("Constant additional chance (over pattern research factor) that replication will fail at any given tick")
|
|
||||||
.comment("In event of failure repair tick is wasted, wasting resources")
|
|
||||||
.defineInRange("failureChance", 0.01, 0.0, 0.99)
|
|
||||||
|
|
||||||
_DIVISOR = builder
|
|
||||||
.comment("Magnitute of **slowdown** of repairer.")
|
|
||||||
.comment("If this value is 1, repairer will repair item from 0% to 100% in COMPLEXITY (of tool) ticks")
|
|
||||||
.comment("(or twice the complexity of anvil repair ingredients if tool itself has no matter value)")
|
|
||||||
.comment("---")
|
|
||||||
.comment("If value is smaller than 1, repairer will repair items faster")
|
|
||||||
.comment("If value is bigger than 1, repairer will repair items slower")
|
|
||||||
.defineInRange("divisor", 3.0, 0.1, Double.MAX_VALUE)
|
|
||||||
|
|
||||||
builder.pop()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,6 @@ object MachinesConfig : AbstractConfig("machines") {
|
|||||||
ChemicalGeneratorBlockEntity.registerConfig(builder)
|
ChemicalGeneratorBlockEntity.registerConfig(builder)
|
||||||
MatterBottlerBlockEntity.registerConfig(builder)
|
MatterBottlerBlockEntity.registerConfig(builder)
|
||||||
MatterReplicatorBlockEntity.registerConfig(builder)
|
MatterReplicatorBlockEntity.registerConfig(builder)
|
||||||
MatterReconstructorBlockEntity.registerConfig(builder)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val PLATE_PRESS = workerValues(
|
val PLATE_PRESS = workerValues(
|
||||||
@ -62,6 +61,45 @@ object MachinesConfig : AbstractConfig("machines") {
|
|||||||
MATTER_RECYCLER_CAPACITY = defineDecimal("MATTER_CAPACITY", Decimal(400), Decimal.ONE)
|
MATTER_RECYCLER_CAPACITY = defineDecimal("MATTER_CAPACITY", Decimal(400), Decimal.ONE)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val MATTER_RECONSTRUCTOR = workerValues(
|
||||||
|
MNames.MATTER_RECONSTRUCTOR,
|
||||||
|
energyStorage = Decimal(100_000),
|
||||||
|
energyThroughput = Decimal(1000),
|
||||||
|
powerConsumption = Decimal(400),
|
||||||
|
matterCapacity = Decimal(200),
|
||||||
|
workTimeMultiplier = null,
|
||||||
|
) {
|
||||||
|
MatterReconstructor
|
||||||
|
}
|
||||||
|
|
||||||
|
object MatterReconstructor {
|
||||||
|
val VALUES by ::MATTER_RECONSTRUCTOR
|
||||||
|
|
||||||
|
val ALLOW_TO_SKIP_ANVIL: Boolean by builder
|
||||||
|
.comment("Allow to repair tools without having their anvil-repair items researched")
|
||||||
|
.comment("Ignored if onlyAnvil is true")
|
||||||
|
.define("allowToSkipAnvil", false)
|
||||||
|
|
||||||
|
val ONLY_ANVIL: Boolean by builder
|
||||||
|
.comment("Force repairing only by matter value of anvil materials")
|
||||||
|
.comment("Doesn't make logical sense but might be good for balancing")
|
||||||
|
.define("onlyAnvil", false)
|
||||||
|
|
||||||
|
val FAILURE_CHANCE: Double by builder
|
||||||
|
.comment("Constant additional chance (over pattern research factor) that replication will fail at any given tick")
|
||||||
|
.comment("In event of failure repair tick is wasted, as well as resources")
|
||||||
|
.defineInRange("failureChance", 0.01, 0.0, 0.99)
|
||||||
|
|
||||||
|
val DIVISOR: Double by builder
|
||||||
|
.comment("Magnitute of **slowdown** of repairer.")
|
||||||
|
.comment("If this value is 1, repairer will repair item from 0% to 100% in COMPLEXITY (of tool) ticks")
|
||||||
|
.comment("(or twice the complexity of anvil repair ingredients if tool itself has no matter value)")
|
||||||
|
.comment("---")
|
||||||
|
.comment("If value is smaller than 1, repairer will repair items faster")
|
||||||
|
.comment("If value is bigger than 1, repairer will repair items slower")
|
||||||
|
.defineInRange("divisor", 3.0, 0.1, Double.MAX_VALUE)
|
||||||
|
}
|
||||||
|
|
||||||
val STORAGE_POWER_SUPPLIER = BlockEnergyStorageImpl.makeConfigEntry(builder, MNames.STORAGE_POWER_SUPPLIER, capacity = Decimal(100_000), throughput = Decimal(320))
|
val STORAGE_POWER_SUPPLIER = BlockEnergyStorageImpl.makeConfigEntry(builder, MNames.STORAGE_POWER_SUPPLIER, capacity = Decimal(100_000), throughput = Decimal(320))
|
||||||
val STORAGE_INTERFACES = BlockEnergyStorageImpl.makeConfigEntry(builder, "STORAGE_INTERFACES", capacity = Decimal(10_000))
|
val STORAGE_INTERFACES = BlockEnergyStorageImpl.makeConfigEntry(builder, "STORAGE_INTERFACES", capacity = Decimal(10_000))
|
||||||
val ITEM_MONITOR = BlockEnergyStorageImpl.makeConfigEntry(builder, MNames.ITEM_MONITOR)
|
val ITEM_MONITOR = BlockEnergyStorageImpl.makeConfigEntry(builder, MNames.ITEM_MONITOR)
|
||||||
|
Loading…
Reference in New Issue
Block a user