aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/moe/nea/firmament/features/texturepack/PetPredicate.kt
blob: 5e5d750c1884ae3de2e00006c0a799e608ae53f3 (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
65
66
package moe.nea.firmament.features.texturepack

import com.google.gson.JsonElement
import com.google.gson.JsonObject
import net.minecraft.item.ItemStack
import moe.nea.firmament.repo.ExpLadders
import moe.nea.firmament.util.petData

class PetPredicate(
    val petId: StringMatcher?,
    val tier: RarityMatcher?,
    val exp: NumberMatcher?,
    val candyUsed: NumberMatcher?,
    val level: NumberMatcher?,
) : FirmamentModelPredicate {

    override fun test(stack: ItemStack): Boolean {
        val petData = stack.petData ?: return false
        if (petId != null) {
            if (!petId.matches(petData.type)) return false
        }
        if (exp != null) {
            if (!exp.test(petData.exp)) return false
        }
        if (candyUsed != null) {
            if (!candyUsed.test(petData.candyUsed)) return false
        }
        if (tier != null) {
            if (!tier.match(petData.tier)) return false
        }
        val levelData by lazy(LazyThreadSafetyMode.NONE) {
            ExpLadders.getExpLadder(petData.type, petData.tier)
                .getPetLevel(petData.exp)
        }
        if (level != null) {
            if (!level.test(levelData.currentLevel)) return false
        }
        return true
    }

    object Parser : FirmamentModelPredicateParser {
        override fun parse(jsonElement: JsonElement): FirmamentModelPredicate? {
            if (jsonElement.isJsonPrimitive) {
                return PetPredicate(StringMatcher.Equals(jsonElement.asString, false), null, null, null, null)
            }
            if (jsonElement !is JsonObject) return null
            val idMatcher = jsonElement["id"]?.let(StringMatcher::parse)
            val expMatcher = jsonElement["exp"]?.let(NumberMatcher::parse)
            val levelMatcher = jsonElement["level"]?.let(NumberMatcher::parse)
            val candyMatcher = jsonElement["candyUsed"]?.let(NumberMatcher::parse)
            val tierMatcher = jsonElement["tier"]?.let(RarityMatcher::parse)
            return PetPredicate(
                idMatcher,
                tierMatcher,
                expMatcher,
                candyMatcher,
                levelMatcher,
            )
        }
    }

    override fun toString(): String {
        return super.toString()
    }
}