summaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/features/event/hoppity/HoppityCollectionData.kt
blob: cc904a081679b7d37f55c944515abc0e62563e36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package at.hannibal2.skyhanni.features.event.hoppity

import at.hannibal2.skyhanni.data.jsonobjects.repo.neu.NeuHoppityJson
import at.hannibal2.skyhanni.events.NeuRepositoryReloadEvent
import at.hannibal2.skyhanni.features.event.hoppity.HoppityCollectionStats.RabbitCollectionRarity
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent

@SkyHanniModule
object HoppityCollectionData {
    private val rabbitRarities = mutableMapOf<String, RabbitCollectionRarity>()
    private val rarityBonuses = mutableMapOf<RabbitCollectionRarity, ChocolateBonuses>()
    private val specialBonuses = mutableMapOf<String, ChocolateBonuses>()

    val knownRabbitCount
        get() = rabbitRarities.size

    fun getRarity(rabbit: String): RabbitCollectionRarity? {
        val apiName = rabbit.toApiName()
        return rabbitRarities[apiName]
    }

    fun knownRabbitsOfRarity(rarity: RabbitCollectionRarity): Int =
        rabbitRarities.filterValues { it == rarity }.count()

    fun isKnownRabbit(rabbit: String) = rabbitRarities.contains(rabbit.toApiName())

    fun getChocolateBonuses(rabbit: String): ChocolateBonuses {
        val apiName = rabbit.toApiName()
        val rarity = rabbitRarities[apiName]
        return specialBonuses[apiName]
            ?: rarityBonuses[rarity]
            ?: ChocolateBonuses(0, 0.0)
    }

    private fun String.toApiName(): String = when (this) {
        "Fish the Rabbit" -> "fish"
        else -> lowercase().replace("[- ]".toRegex(), "_")
    }

    @SubscribeEvent
    fun onNeuRepoReload(event: NeuRepositoryReloadEvent) {
        rabbitRarities.clear()
        rarityBonuses.clear()
        specialBonuses.clear()

        val data = event.readConstant<NeuHoppityJson>("hoppity").hoppity
        for ((rarityString, rarityData) in data.rarities.entries) {
            val rarity = RabbitCollectionRarity.valueOf(rarityString.uppercase())

            for (rabbit in rarityData.rabbits) {
                rabbitRarities[rabbit] = rarity
            }

            rarityBonuses[rarity] = ChocolateBonuses(rarityData.chocolate, rarityData.multiplier)
        }

        data.special.forEach { (rabbit, data) ->
            specialBonuses[rabbit] = ChocolateBonuses(data.chocolate, data.multiplier)
        }
    }

    data class ChocolateBonuses(val chocolate: Int, val multiplier: Double)
}