Implement handling for itemaddskilltab and itemaddclassskills

Added special handling for skill tabs and class skills in rule evaluation.
This commit is contained in:
2025-11-10 22:55:16 +09:00
committed by guiyomu-dev
parent 0e460767ad
commit a5e3194e3c

View File

@@ -310,6 +310,16 @@ func (r Rule) Evaluate(it data.Item) (RuleResult, error) {
stage2 = strings.ToLower(strings.Split(r.RawLine, "#")[1])
}
// Special handling for skill tabs
if strings.Contains(stage2, "[itemaddskilltab]") {
stage2Props["itemaddskilltab"] = evaluateSkillTabSum(it)
}
// Special handling for class skills
if strings.Contains(stage2, "[itemaddclassskills]") {
stage2Props["itemaddclassskills"] = evaluateClassSkillsSum(it)
}
// Preprocess stage2 to see if certain stats are being compared to zero
zeroCheckStats := make(map[string]bool)
for _, statName := range r.requiredStats {
@@ -354,6 +364,10 @@ func (r Rule) Evaluate(it data.Item) (RuleResult, error) {
// Evaluate each required stat
for _, statName := range r.requiredStats {
// Skip stats we've already handled
if statName == "itemaddskilltab" || statName == "itemaddclassskills" {
continue
}
statData, found := statAliases[statName]
if !found {
return RuleResultNoMatch, fmt.Errorf("property %s is not valid or not supported", statName)
@@ -447,6 +461,31 @@ func getRequiredStatsForRule(line string) []string {
return statsList
}
func evaluateClassSkillsSum(it data.Item) int {
// Check all class skills stats (all have base ID 83 with different layers)
totalClassSkills := 0
for layer := 0; layer <= 6; layer++ {
if itemStat, found := it.FindStat(stat.ID(83), layer); found && itemStat.Value > 0 {
totalClassSkills += itemStat.Value
}
}
return totalClassSkills
}
func evaluateSkillTabSum(it data.Item) int {
// Check all skill tab stats (all have base ID 188 with different layers)
totalSkillTabs := 0
for layer := 0; layer <= 50; layer++ {
if itemStat, found := it.FindStat(stat.ID(188), layer); found && itemStat.Value > 0 {
totalSkillTabs += itemStat.Value
}
}
return totalSkillTabs
}
// MaxQuantity returns the maximum quantity of items that character can have, 0 means no limit
func (r Rule) MaxQuantity() int {
return r.maxQuantity