add support for fixed values tier and merc tier in nip files
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user