Add matter capacity upgrade

This commit is contained in:
DBotThePony 2023-07-19 18:30:35 +07:00
parent 91d0f5a65b
commit 2095055e73
Signed by: DBot
GPG Key ID: DCC23B5715498507
7 changed files with 68 additions and 7 deletions

View File

@ -626,6 +626,9 @@ private fun items(provider: MatteryLanguageProvider) {
add(MItems.CreativeUpgrades.ENERGY_STORAGE, "Creative Energy Storage Upgrade")
add(MItems.CreativeUpgrades.ENERGY_STORAGE_FLAT, "Creative Energy Storage Upgrade (Flat)")
add(MItems.CreativeUpgrades.ENERGY_STORAGE_FLAT_SMALL, "Creative Energy Storage Upgrade (Flat Small)")
add(MItems.CreativeUpgrades.MATTER_STORAGE, "Creative Matter Storage Upgrade")
add(MItems.CreativeUpgrades.MATTER_STORAGE_FLAT, "Creative Matter Storage Upgrade (Flat)")
add(MItems.CreativeUpgrades.MATTER_STORAGE_FLAT_SMALL, "Creative Matter Storage Upgrade (Flat Small)")
add(MItems.CreativeUpgrades.ENERGY_THROUGHPUT, "Creative Energy Throughput Upgrade")
add(MItems.CreativeUpgrades.ENERGY_THROUGHPUT_FLAT, "Creative Energy Throughput Upgrade (Flat)")
add(MItems.CreativeUpgrades.ENERGY_THROUGHPUT_FLAT_SMALL, "Creative Energy Throughput Upgrade (Flat Small)")
@ -738,7 +741,9 @@ private fun gui(provider: MatteryLanguageProvider) {
gui("upgrade.speed", "Operation speed: %s%%")
gui("upgrade.processing_items", "Items processed per cycle: +%s")
gui("upgrade.energy_storage_flat", "Energy capacity: +%s")
gui("upgrade.matter_storage_flat", "Matter capacity: +%s")
gui("upgrade.energy_storage", "Energy capacity: +%s%%")
gui("upgrade.matter_storage", "Matter capacity: +%s%%")
gui("upgrade.energy_consumed", "Energy consumption: %s%%")
gui("upgrade.energy_throughput_flat", "Energy throughput: +%s")
gui("upgrade.energy_throughput", "Energy throughput: +%s%%")
@ -749,6 +754,7 @@ private fun gui(provider: MatteryLanguageProvider) {
gui("upgrade_type.allowed_none", "No possible upgrades at the moment.")
gui("upgrade_type.speed", "Speed")
gui("upgrade_type.processing", "Processing")
gui("upgrade_type.matter_storage", "Matter Storage")
gui("upgrade_type.energy_storage", "Energy Storage")
gui("upgrade_type.energy_consumption", "Energy Consumption")
gui("upgrade_type.energy_throughput", "Energy Throughput")

View File

@ -629,6 +629,9 @@ private fun items(provider: MatteryLanguageProvider) {
add(MItems.CreativeUpgrades.ENERGY_STORAGE, "Творческое улучшение энергохраналища")
add(MItems.CreativeUpgrades.ENERGY_STORAGE_FLAT, "Творческое улучшение энергохраналища (простое)")
add(MItems.CreativeUpgrades.ENERGY_STORAGE_FLAT_SMALL, "Творческое улучшение энергохраналища (малое простое)")
add(MItems.CreativeUpgrades.MATTER_STORAGE, "Творческое улучшение хранилища материи")
add(MItems.CreativeUpgrades.MATTER_STORAGE_FLAT, "Творческое улучшение хранилища материи (простое)")
add(MItems.CreativeUpgrades.MATTER_STORAGE_FLAT_SMALL, "Творческое улучшение хранилища материи (малое простое)")
add(MItems.CreativeUpgrades.ENERGY_THROUGHPUT, "Творческое улучшение энергоканала")
add(MItems.CreativeUpgrades.ENERGY_THROUGHPUT_FLAT, "Творческое улучшение энергоканала (простое)")
add(MItems.CreativeUpgrades.ENERGY_THROUGHPUT_FLAT_SMALL, "Творческое улучшение энергоканала (малое простое)")
@ -741,7 +744,9 @@ private fun gui(provider: MatteryLanguageProvider) {
gui("upgrade.speed", "Скорость работы: %s%%")
gui("upgrade.processing_items", "Работы за цикл: +%s")
gui("upgrade.energy_storage_flat", "Хранилище энергии: +%s")
gui("upgrade.matter_storage_flat", "Хранилище материи: +%s")
gui("upgrade.energy_storage", "Хранилище энергии: +%s%%")
gui("upgrade.matter_storage", "Хранилище материи: +%s%%")
gui("upgrade.energy_consumed", "Потребление энергии: %s%%")
gui("upgrade.energy_throughput_flat", "Пропускная способность энергии: +%s")
gui("upgrade.energy_throughput", "Пропускная способность энергии: +%s%%")
@ -752,6 +757,7 @@ private fun gui(provider: MatteryLanguageProvider) {
gui("upgrade_type.allowed_none", "На данный момент нет допустимых улучшений.")
gui("upgrade_type.speed", "Скорость")
gui("upgrade_type.processing", "Обработка")
gui("upgrade_type.matter_storage", "Хранилище материи")
gui("upgrade_type.energy_storage", "Энергохранилище")
gui("upgrade_type.energy_consumption", "Энергоэффективность")
gui("upgrade_type.energy_throughput", "Энергоканал")

View File

@ -102,9 +102,9 @@ class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) :
}
}
override val upgrades = UpgradeContainer(this::setChangedLight, 3, UpgradeType.BASIC)
override val upgrades = UpgradeContainer(this::setChangedLight, 3, UpgradeType.BASIC_MATTER)
val energy = ProfiledEnergyStorage(WorkerEnergyStorage(::powerLevelUpdated, upgrades.transform(ENERGY_VALUES)))
val matter = ProfiledMatterStorage(MatterStorageImpl(::matterLevelUpdated, FlowDirection.INPUT, ::MATTER_CAPACITY))
val matter = ProfiledMatterStorage(MatterStorageImpl(::matterLevelUpdated, FlowDirection.INPUT, upgrades.matterCapacity(::MATTER_CAPACITY)))
val container = MatteryContainer(::itemContainerUpdated, 5).also(::addDroppableContainer)
val energyConfig = ConfigurableEnergy(energy)

View File

@ -8,6 +8,7 @@ import ru.dbotthepony.mc.otm.core.TextComponent
import ru.dbotthepony.mc.otm.core.TranslatableComponent
import ru.dbotthepony.mc.otm.core.immutableSet
import ru.dbotthepony.mc.otm.core.math.Decimal
import ru.dbotthepony.mc.otm.core.util.formatMatter
import ru.dbotthepony.mc.otm.core.util.formatPower
/**
@ -46,6 +47,18 @@ interface IMatteryUpgrade {
*/
val energyStorage: Decimal get() = Decimal.ZERO
/**
* **CAM NOT be negative.**
*
* Added directly over regular matter storage capacity.
*/
val matterStorageFlat: Decimal get() = Decimal.ZERO
/**
* **CAM NOT be negative.**
*/
val matterStorage: Decimal get() = Decimal.ZERO
/**
* Value of `1` means power consumption is doubled, `2` is tripled, `-0.5` is halved.
*/
@ -107,6 +120,14 @@ fun IMatteryUpgrade.addUpgradeTooltipLines(tooltips: MutableCollection<Component
tooltips.add(TranslatableComponent("otm.gui.upgrade.energy_storage", TextComponent((energyStorage * 100).toString(0)).withStyle(ChatFormatting.DARK_GREEN)).withStyle(ChatFormatting.GRAY))
}
if (matterStorageFlat != Decimal.ZERO) {
tooltips.add(TranslatableComponent("otm.gui.upgrade.matter_storage_flat", matterStorageFlat.formatMatter(formatAsReadable = ShiftPressedCond).copy().withStyle(ChatFormatting.DARK_GREEN)).withStyle(ChatFormatting.GRAY))
}
if (matterStorage != Decimal.ZERO) {
tooltips.add(TranslatableComponent("otm.gui.upgrade.matter_storage", TextComponent((matterStorage * 100).toString(0)).withStyle(ChatFormatting.DARK_GREEN)).withStyle(ChatFormatting.GRAY))
}
if (energyConsumed >= positiveBound) {
tooltips.add(TranslatableComponent("otm.gui.upgrade.energy_consumed", TextComponent("+" + (energyConsumed.coerceIn(MachinesConfig.Upgrades.MIN_ENERGY, MachinesConfig.Upgrades.MAX_ENERGY) * 100).toString(0)).withStyle(ChatFormatting.DARK_RED)).withStyle(ChatFormatting.GRAY))
} else if (energyConsumed <= negativeBound) {
@ -138,6 +159,7 @@ enum class UpgradeType {
ENERGY_STORAGE,
ENERGY_CONSUMPTION,
ENERGY_THROUGHPUT,
MATTER_STORAGE,
FAILSAFE;
val localeId = "otm.gui.upgrade_type.${name.lowercase()}"
@ -161,6 +183,9 @@ enum class UpgradeType {
@JvmField
val BASIC = set(SPEED, ENERGY_STORAGE, ENERGY_CONSUMPTION, ENERGY_THROUGHPUT)
@JvmField
val BASIC_MATTER = set(SPEED, ENERGY_STORAGE, ENERGY_CONSUMPTION, ENERGY_THROUGHPUT, MATTER_STORAGE)
@JvmField
val BASIC_PROCESSING = set(SPEED, ENERGY_STORAGE, ENERGY_CONSUMPTION, ENERGY_THROUGHPUT, PROCESSING)

View File

@ -21,22 +21,33 @@ open class UpgradeContainer(slotCount: Int, open val allowedUpgrades: Set<Upgrad
final override val upgradeTypes: Set<UpgradeType>
get() = setOf()
protected fun decimals(fn: (IMatteryUpgrade) -> Decimal, reducer: (Decimal, Decimal) -> Decimal): Decimal {
return iterator()
.filter { it.isNotEmpty }
.map { it.getCapability(MatteryCapability.UPGRADE).map(fn).orElse(Decimal.ZERO).moreThanZero() * it.count }
.reduce(Decimal.ZERO, reducer)
}
override val speedBonus: Double
get() = iterator().filter { it.isNotEmpty }.mapToDouble { it.getCapability(MatteryCapability.UPGRADE).map { it.speedBonus }.orElse(0.0) * it.count }.sum()
override val processingItems: Int
get() = iterator().filter { it.isNotEmpty }.mapToInt { it.getCapability(MatteryCapability.UPGRADE).map { it.processingItems }.orElse(0).coerceAtLeast(0) * it.count }.reduce(0) { a, b -> a + b }
override val energyStorageFlat: Decimal
get() = iterator().filter { it.isNotEmpty }.map { it.getCapability(MatteryCapability.UPGRADE).map { it.energyStorageFlat }.orElse(Decimal.ZERO).moreThanZero() * it.count }.reduce(Decimal.ZERO, Decimal::plus)
get() = decimals(IMatteryUpgrade::energyStorageFlat, Decimal::plus)
override val energyStorage: Decimal
get() = iterator().filter { it.isNotEmpty }.map { it.getCapability(MatteryCapability.UPGRADE).map { it.energyStorage }.orElse(Decimal.ZERO).moreThanZero() * it.count }.reduce(Decimal.ZERO, Decimal::plus)
get() = decimals(IMatteryUpgrade::energyStorage, Decimal::plus)
override val matterStorageFlat: Decimal
get() = decimals(IMatteryUpgrade::matterStorageFlat, Decimal::plus)
override val matterStorage: Decimal
get() = decimals(IMatteryUpgrade::matterStorage, Decimal::plus)
override val energyConsumed: Decimal
get() = iterator().filter { it.isNotEmpty }.map { it.getCapability(MatteryCapability.UPGRADE).map { it.energyConsumed }.orElse(Decimal.ZERO) * it.count }.reduce(Decimal.ZERO, Decimal::plus)
get() = decimals(IMatteryUpgrade::energyConsumed, Decimal::plus)
override val failureMultiplier: Double
get() = iterator().filter { it.isNotEmpty }.mapToDouble { it.getCapability(MatteryCapability.UPGRADE).map { it.failureMultiplier }.orElse(1.0).coerceAtLeast(0.0).pow(it.count.toDouble()) }.reduce(1.0) { a, b -> a * b }
override val energyThroughputFlat: Decimal
get() = iterator().filter { it.isNotEmpty }.map { it.getCapability(MatteryCapability.UPGRADE).map { it.energyThroughputFlat }.orElse(Decimal.ZERO).moreThanZero() * it.count }.reduce(Decimal.ZERO, Decimal::plus)
get() = decimals(IMatteryUpgrade::energyThroughputFlat, Decimal::plus)
override val energyThroughput: Decimal
get() = iterator().filter { it.isNotEmpty }.map { it.getCapability(MatteryCapability.UPGRADE).map { it.energyThroughput }.orElse(Decimal.ZERO).moreThanZero() * it.count }.reduce(Decimal.ZERO, Decimal::plus)
get() = decimals(IMatteryUpgrade::energyThroughput, Decimal::plus)
fun transform(values: ConciseBalanceValues): ConciseBalanceValues {
return object : ConciseBalanceValues {
@ -57,4 +68,8 @@ open class UpgradeContainer(slotCount: Int, open val allowedUpgrades: Set<Upgrad
get() = values.extract * (energyThroughput + Decimal.ONE) + energyThroughputFlat
}
}
fun matterCapacity(value: () -> Decimal): () -> Decimal {
return { value.invoke() * (matterStorage + Decimal.ONE) + matterStorageFlat }
}
}

View File

@ -27,6 +27,8 @@ class SimpleUpgrade(
override val energyConsumed: Decimal = Decimal.ZERO,
override val energyThroughputFlat: Decimal = Decimal.ZERO,
override val energyThroughput: Decimal = Decimal.ZERO,
override val matterStorage: Decimal = Decimal.ZERO,
override val matterStorageFlat: Decimal = Decimal.ZERO,
override val failureMultiplier: Double = 1.0,
) : Item(properties), IMatteryUpgrade, ICapabilityProvider {
private val resolver = LazyOptional.of { this }

View File

@ -175,6 +175,10 @@ object MItems {
val FAILURE: SimpleUpgrade by registry.register("creative_failure_upgrade") { SimpleUpgrade(Item.Properties().rarity(Rarity.EPIC), UpgradeType.FAILSAFE.set(), failureMultiplier = 2.0) }
val PROCESSING_ITEMS: SimpleUpgrade by registry.register("creative_processing_upgrade") { SimpleUpgrade(Item.Properties().rarity(Rarity.EPIC), UpgradeType.PROCESSING.set(), processingItems = 1) }
val MATTER_STORAGE: SimpleUpgrade by registry.register("creative_matter_storage_upgrade") { SimpleUpgrade(Item.Properties().rarity(Rarity.EPIC), UpgradeType.MATTER_STORAGE.set(), matterStorage = Decimal.ONE) }
val MATTER_STORAGE_FLAT: SimpleUpgrade by registry.register("creative_matter_storage_flat_upgrade") { SimpleUpgrade(Item.Properties().rarity(Rarity.EPIC), UpgradeType.MATTER_STORAGE.set(), matterStorageFlat = Decimal.LONG_MAX_VALUE) }
val MATTER_STORAGE_FLAT_SMALL: SimpleUpgrade by registry.register("creative_matter_storage_flat2_upgrade") { SimpleUpgrade(Item.Properties().rarity(Rarity.EPIC), UpgradeType.MATTER_STORAGE.set(), matterStorageFlat = Decimal.INT_MAX_VALUE) }
val LIST = SupplierList(
::SPEED,
::ENERGY_CONSUMPTION,
@ -187,6 +191,9 @@ object MItems {
::FAILSAFE,
::FAILURE,
::PROCESSING_ITEMS,
::MATTER_STORAGE,
::MATTER_STORAGE_FLAT,
::MATTER_STORAGE_FLAT_SMALL,
)
}