diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt index ae6da6449..fbfc1924a 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt @@ -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") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt index ba67e6fff..bc91aed29 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt @@ -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", "Энергоканал") diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt index 48ce40fbc..9a0452ec3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt @@ -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) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Upgrades.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Upgrades.kt index 0221e0f31..510a2850e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Upgrades.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Upgrades.kt @@ -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= 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) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/UpgradeContainer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/UpgradeContainer.kt index 521a25a0a..1a1be7d62 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/UpgradeContainer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/UpgradeContainer.kt @@ -21,22 +21,33 @@ open class UpgradeContainer(slotCount: Int, open val allowedUpgrades: Set 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 Decimal): () -> Decimal { + return { value.invoke() * (matterStorage + Decimal.ONE) + matterStorageFlat } + } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/SimpleUpgrade.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/SimpleUpgrade.kt index 66fdf57bd..ff1acb9e2 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/SimpleUpgrade.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/SimpleUpgrade.kt @@ -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 } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt index 4a5be5b0f..0fcb51a37 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt @@ -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, ) }