From 2a3a4c07f5db951169adfc5626e8cf28c0812cf6 Mon Sep 17 00:00:00 2001
From: Linnea Gräf <nea@nea.moe>
Date: Tue, 21 Jan 2025 02:09:11 +0100
Subject: feat: Add npc shop recipes

---
 src/main/kotlin/repo/BetterRepoRecipeCache.kt |  5 +++++
 src/main/kotlin/util/FirmFormatters.kt        | 28 +++++++++++++++++++++++++++
 src/main/kotlin/util/textutil.kt              |  1 +
 3 files changed, 34 insertions(+)

(limited to 'src/main/kotlin')

diff --git a/src/main/kotlin/repo/BetterRepoRecipeCache.kt b/src/main/kotlin/repo/BetterRepoRecipeCache.kt
index 4b32e57..6d18223 100644
--- a/src/main/kotlin/repo/BetterRepoRecipeCache.kt
+++ b/src/main/kotlin/repo/BetterRepoRecipeCache.kt
@@ -2,8 +2,10 @@ package moe.nea.firmament.repo
 
 import io.github.moulberry.repo.IReloadable
 import io.github.moulberry.repo.NEURepository
+import io.github.moulberry.repo.data.NEUNpcShopRecipe
 import io.github.moulberry.repo.data.NEURecipe
 import moe.nea.firmament.util.SkyblockId
+import moe.nea.firmament.util.skyblockId
 
 class BetterRepoRecipeCache(vararg val extraProviders: ExtraRecipeProvider) : IReloadable {
 	var usages: Map<SkyblockId, Set<NEURecipe>> = mapOf()
@@ -17,6 +19,9 @@ class BetterRepoRecipeCache(vararg val extraProviders: ExtraRecipeProvider) : IR
 			.flatMap { it.recipes }
 		(baseRecipes + extraProviders.flatMap { it.provideExtraRecipes() })
 			.forEach { recipe ->
+				if (recipe is NEUNpcShopRecipe) {
+					usages.getOrPut(recipe.isSoldBy.skyblockId, ::mutableSetOf).add(recipe)
+				}
 				recipe.allInputs.forEach { usages.getOrPut(SkyblockId(it.itemId), ::mutableSetOf).add(recipe) }
 				recipe.allOutputs.forEach { recipes.getOrPut(SkyblockId(it.itemId), ::mutableSetOf).add(recipe) }
 			}
diff --git a/src/main/kotlin/util/FirmFormatters.kt b/src/main/kotlin/util/FirmFormatters.kt
index 4b32c2a..acb7102 100644
--- a/src/main/kotlin/util/FirmFormatters.kt
+++ b/src/main/kotlin/util/FirmFormatters.kt
@@ -9,11 +9,39 @@ import kotlin.io.path.isReadable
 import kotlin.io.path.isRegularFile
 import kotlin.io.path.listDirectoryEntries
 import kotlin.math.absoluteValue
+import kotlin.math.roundToInt
 import kotlin.time.Duration
 import kotlin.time.Duration.Companion.seconds
 import net.minecraft.text.Text
 
 object FirmFormatters {
+
+	private inline fun shortIf(
+		value: Double, breakpoint: Double, char: String,
+		return_: (String) -> Nothing
+	) {
+		if (value >= breakpoint) {
+			val broken = (value / breakpoint * 10).roundToInt()
+			if (broken > 99)
+				return_((broken / 10).toString() + char)
+			val decimals = broken.toString()
+			decimals.singleOrNull()?.let {
+				return_("0.$it$char")
+			}
+			return_("${decimals[0]}.${decimals[1]}$char")
+		}
+	}
+
+	fun shortFormat(double: Double): String {
+		if (double < 0) return "-" + shortFormat(-double)
+		shortIf(double, 1_000_000_000_000.0, "t") { return it }
+		shortIf(double, 1_000_000_000.0, "b") { return it }
+		shortIf(double, 1_000_000.0, "m") { return it }
+		shortIf(double, 1_000.0, "k") { return it }
+		shortIf(double, 1.0, "") { return it }
+		return double.toString()
+	}
+
 	fun formatCommas(int: Int, segments: Int = 3): String = formatCommas(int.toLong(), segments)
 	fun formatCommas(long: Long, segments: Int = 3, includeSign: Boolean = false): String {
 		if (long < 0 && long != Long.MIN_VALUE) {
diff --git a/src/main/kotlin/util/textutil.kt b/src/main/kotlin/util/textutil.kt
index 33cdd2a..c295ae0 100644
--- a/src/main/kotlin/util/textutil.kt
+++ b/src/main/kotlin/util/textutil.kt
@@ -122,6 +122,7 @@ fun MutableText.pink() = withColor(Formatting.LIGHT_PURPLE)
 fun MutableText.yellow() = withColor(Formatting.YELLOW)
 fun MutableText.gold() = withColor(Formatting.GOLD)
 fun MutableText.grey() = withColor(Formatting.GRAY)
+fun MutableText.darkGrey() = withColor(Formatting.DARK_GRAY)
 fun MutableText.red() = withColor(Formatting.RED)
 fun MutableText.white() = withColor(Formatting.WHITE)
 fun MutableText.bold(): MutableText = styled { it.withBold(true) }
-- 
cgit