Files
YAEP/domain/src/commonMain/kotlin/ch/dissem/yaep/domain/items.kt
Christian Basler 08b5ec6312
Some checks failed
SonarQube Scan / SonarQube Trigger (push) Failing after 6m42s
Remove alcoholic beverages
2025-11-02 21:02:39 +01:00

196 lines
4.9 KiB
Kotlin

package ch.dissem.yaep.domain
enum class Animal(symbol: String) : ItemClass<Animal> {
ANT("🐜"),
DOG("🐕"),
GOAT("🐐"),
OCTOPUS("🐙"),
SLOTH("🦥"),
SNAIL("🐌"),
ZEBRA("🦓");
override val symbols: Array<String> = arrayOf(symbol)
override val companion: Animal.Companion
get() = Animal
companion object : ItemClassCompanion<Animal> {
override val items: List<Animal> = entries
}
}
enum class Nationality(symbol: String) : ItemClass<Nationality> {
CANADA("🇨🇦"),
JAPAN("🇯🇵"),
NORWAY("🇳🇴"),
SPAIN("🇪🇸"),
SWEDEN("🇸🇪"),
SWITZERLAND("🇨🇭"),
UNITED_KINGDOM("🇬🇧"),
UKRAINE("🇺🇦");
override val symbols: Array<String> = arrayOf(symbol)
override val companion: Nationality.Companion
get() = Nationality
companion object : ItemClassCompanion<Nationality> {
override val items: List<Nationality> = entries
}
}
enum class Drink(symbol: String) : ItemClass<Drink> {
BEVERAGE("🧃"),
BUBBLE_TEA("🧋"),
COFFEE(""),
MATE("🧉"),
MILK("🥛"),
TEA("🍵"),
WATER("🥤");
override val symbols: Array<String> = arrayOf(symbol)
override val companion: Drink.Companion
get() = Drink
companion object : ItemClassCompanion<Drink> {
override val items: List<Drink> = entries
}
}
enum class Profession(symbol: String) : ItemClass<Profession> {
ASTRONAUT("\u200D\uD83D\uDE80"),
FARMER("\u200D\uD83C\uDF3E"),
FIREFIGHTER("\u200D\uD83D\uDE92"),
HEALTH_WORKER("\u200D\uFE0F"),
ROCK_STAR("\u200D\uD83C\uDFA4"),
SCIENTIST("\u200D\uD83D\uDD2C"),
SOFTWARE_DEV("\u200D\uD83D\uDCBB"),
TEACHER("\u200D\uD83C\uDFEB");
override val symbols: Array<String> = idic(symbol)
override val companion: Profession.Companion
get() = Profession
companion object : ItemClassCompanion<Profession> {
override val items: List<Profession> = entries
}
}
enum class Fruit(symbol: String) : ItemClass<Fruit> {
BANANA("🍌"),
CHERRIES("🍒"),
GRAPES("🍇"),
KIWI("🥝"),
LEMON("🍋"),
MANGO("🥭"),
PEAR("🍐"),
PINEAPPLE("🍍"),
STRAWBERRY("🍓"),
WATERMELON("🍉");
override val symbols: Array<String> = arrayOf(symbol)
override val companion: Fruit.Companion
get() = Fruit
companion object : ItemClassCompanion<Fruit> {
override val items: List<Fruit> = entries
}
}
enum class Dessert(symbol: String) : ItemClass<Dessert> {
CAKE("🍰"),
CHOCOLATE("🍫"),
COOKIE("🍪"),
CUPCAKE("🧁"),
CUSTARD("🍮"),
DOUGHNUT("🍩"),
ICE_CREAM("🍨"),
LOLLIPOP("🍭"),
PIE("🥧");
override val symbols: Array<String> = arrayOf(symbol)
override val companion: Dessert.Companion
get() = Dessert
companion object : ItemClassCompanion<Dessert> {
override val items: List<Dessert> = entries
}
}
enum class Transportation(symbol: String) : ItemClass<Transportation> {
BICYCLE("🚲"),
BUS("🚌"),
LOCOMOTIVE("🚂"),
MOTOR_SCOOTER("🛵"),
SKATEBOARD("🛹"),
TAXI("🚕"),
TRAM_CAR("🚋");
override val symbols: Array<String> = arrayOf(symbol)
override val companion: Transportation.Companion
get() = Transportation
companion object : ItemClassCompanion<Transportation> {
override val items: List<Transportation> = entries
}
}
private val GENDERS = arrayOf("\uD83E\uDDD1", "\uD83D\uDC68", "\uD83D\uDC69")
private val SKIN_TONES =
arrayOf("\uD83C\uDFFB", "\uD83C\uDFFC", "\uD83C\uDFFD", "\uD83C\uDFFE", "\uD83C\uDFFF")
private fun idic(symbol: String): Array<String> = Array(GENDERS.size * SKIN_TONES.size) { i ->
val g = GENDERS[i % GENDERS.size]
val t = SKIN_TONES[i / GENDERS.size]
g + t + symbol
}
sealed interface ItemClass<out SELF : ItemClass<SELF>> : Comparable<ItemClass<*>> {
val symbols: Array<String>
val name: String
val companion: ItemClassCompanion<SELF>
val ordinal: Int
override fun compareTo(other: ItemClass<*>): Int = ordinal.compareTo(other.ordinal)
companion object {
val classes: List<ItemClassCompanion<*>> = listOf(
Nationality,
Profession,
Drink,
Dessert,
Fruit,
Transportation,
Animal
)
fun randomClasses(n: Int): List<ItemClassCompanion<*>> {
return classes.shuffled().take(n).sortedBy { classes.indexOf(it) }
}
fun parse(name: String): ItemClass<*> {
return classes.mapNotNull { it.parse(name) }.single()
}
}
}
sealed interface ItemClassCompanion<out C : ItemClass<C>> {
val items: List<C>
fun randomItems(n: Int): List<C> {
return items.shuffled().take(n)
}
fun parse(name: String): C? {
return items.firstOrNull { it.name == name }
}
}