add support for fixed values tier and merc tier in nip files

This commit is contained in:
adpist
2025-10-16 21:40:21 +02:00
parent b1273ff5d1
commit cfcc94c874

View File

@@ -23,6 +23,8 @@ var (
fixedPropsRegexp = regexp.MustCompile(`(\[(type|quality|class|name|flag|color|prefix|suffix)]\s*(<=|<|>|>=|!=|==)\s*([a-zA-Z0-9]+))`)
statsRegexp = regexp.MustCompile(`\[(.*?)]`)
maxQtyRegexp = regexp.MustCompile(`(\[maxquantity]\s*(<=|<|>|>=|!=|==)\s*([0-9]+))`)
tierRegexp = regexp.MustCompile(`(\[tier]\s*(<=|<|>|>=|!=|==)\s*([0-9]+))`)
mercTierRegexp = regexp.MustCompile(`(\[merctier]\s*(<=|<|>|>=|!=|==)\s*([0-9]+))`)
)
type Rule struct {
@@ -31,6 +33,8 @@ type Rule struct {
LineNumber int
Enabled bool
maxQuantity int
tier float64
mercTier float64
stage1 *vm.Program
stage2 *vm.Program
requiredStats []string
@@ -61,6 +65,32 @@ func (r Rules) EvaluateAll(it data.Item) (Rule, RuleResult) {
return bestMatchingRule, bestMatch
}
func (r Rules) EvaluateTiers(it data.Item, tierRulesIndexes []int) (Rule, Rule) {
highestTierRule := Rule{}
highestMercTierRule := Rule{}
for _, ruleIndex := range tierRulesIndexes {
if ruleIndex < len(r) {
rule := r[ruleIndex]
if rule.Enabled {
result, err := rule.Evaluate(it)
if err != nil {
continue
}
if result == RuleResultFullMatch || result == RuleResultPartial {
if rule.tier > highestTierRule.tier {
highestTierRule = rule
}
if rule.mercTier > highestMercTierRule.mercTier {
highestMercTierRule = rule
}
}
}
}
}
return highestTierRule, highestMercTierRule
}
var fixedPropsList = map[string]int{"type": 0, "quality": 0, "class": 0, "name": 0, "flag": 0, "color": 0, "prefix": 0, "suffix": 0}
func NewRule(rawRule string, filename string, lineNumber int) (Rule, error) {
@@ -77,6 +107,28 @@ func NewRule(rawRule string, filename string, lineNumber int) (Rule, error) {
rule = strings.ReplaceAll(rule, prop[0], "")
}
// Try to get the tier value and purge it from the rule, we can not evaluate it yet
tier := 0.0
for _, prop := range tierRegexp.FindAllStringSubmatch(rule, -1) {
parsedTier, err := strconv.Atoi(prop[3])
if err != nil {
return Rule{}, fmt.Errorf("error parsing tier value %s: %w", prop[3], err)
}
tier = float64(parsedTier)
rule = strings.ReplaceAll(rule, prop[0], "")
}
// Try to get the merctier value and purge it from the rule, we can not evaluate it yet
mercTier := 0.0
for _, prop := range mercTierRegexp.FindAllStringSubmatch(rule, -1) {
parsedMercTier, err := strconv.Atoi(prop[3])
if err != nil {
return Rule{}, fmt.Errorf("error parsing merctier value %s: %w", prop[3], err)
}
mercTier = float64(parsedMercTier)
rule = strings.ReplaceAll(rule, prop[0], "")
}
// Sanitize again, just in case we messed up the rule while parsing maxquantity
rule = sanitizeLine(rule)
if rule == "" {
@@ -89,6 +141,8 @@ func NewRule(rawRule string, filename string, lineNumber int) (Rule, error) {
LineNumber: lineNumber,
Enabled: true,
maxQuantity: maxQuantity,
tier: tier,
mercTier: mercTier,
}
parts := strings.Split(rule, "#")
@@ -372,3 +426,11 @@ func getRequiredStatsForRule(line string) []string {
func (r Rule) MaxQuantity() int {
return r.maxQuantity
}
func (r Rule) Tier() float64 {
return r.tier
}
func (r Rule) MercTier() float64 {
return r.mercTier
}