hensei-api/app/models/concerns/artifact_skill_validations.rb
Justin Edmund 86e5b9fffb compute strength from quality at display time
blueprint looks up skill and calculates strength
validation checks quality range instead of strength value
2025-12-18 22:30:44 -08:00

108 lines
3 KiB
Ruby

# frozen_string_literal: true
module ArtifactSkillValidations
extend ActiveSupport::Concern
included do
validate :validate_skill1_group_i
validate :validate_skill2_group_i
validate :validate_skill3_group_ii
validate :validate_skill4_group_iii
validate :validate_duplicate_skills
validate :validate_skill_levels_sum, unless: :quirk_artifact?
validate :validate_quirk_artifact_constraints, if: :quirk_artifact?
end
private
def quirk_artifact?
artifact&.quirk?
end
def validate_skill_in_group(skill_data, group_number, slot_name)
return if skill_data.blank? || skill_data == {}
return if quirk_artifact?
modifier = skill_data['modifier']
quality = skill_data['quality']
skill_level = skill_data['level']
unless modifier && quality && skill_level
errors.add(slot_name, 'must have modifier, quality, and level')
return
end
skill_def = ArtifactSkill.find_skill(group_number, modifier)
unless skill_def
errors.add(slot_name, "has invalid modifier #{modifier}")
return
end
unless (1..5).cover?(skill_level)
errors.add(slot_name, 'level must be between 1 and 5')
return
end
# Validate quality is in valid range (1-5)
unless (1..5).cover?(quality)
errors.add(slot_name, "has invalid quality #{quality}")
end
end
def validate_skill1_group_i
validate_skill_in_group(skill1, 1, :skill1)
end
def validate_skill2_group_i
validate_skill_in_group(skill2, 1, :skill2)
end
def validate_skill3_group_ii
validate_skill_in_group(skill3, 2, :skill3)
end
def validate_skill4_group_iii
validate_skill_in_group(skill4, 3, :skill4)
end
def validate_duplicate_skills
return if quirk_artifact?
# Skills 1 and 2 are both from Group I and cannot have the same modifier
return if skill1.blank? || skill1 == {} || skill2.blank? || skill2 == {}
if skill1['modifier'] == skill2['modifier']
errors.add(:base, 'Skill 1 and Skill 2 cannot have the same modifier')
end
end
def validate_skill_levels_sum
# For standard artifacts, skill levels must sum to (artifact_level + 3)
# At level 1: all skills level 1, sum = 4
# At level 5: skills sum = 8 (distributed among 4 skills)
return if level.nil?
skills = [skill1, skill2, skill3, skill4]
# Skip validation if any skill is empty (incomplete artifact)
return if skills.any? { |s| s.blank? || s == {} }
total = skills.sum { |s| s['level'].to_i }
expected = level + 3
return if total == expected
errors.add(:base, "Skill levels must sum to #{expected} for artifact level #{level}, got #{total}")
end
def validate_quirk_artifact_constraints
errors.add(:level, 'must be 1 for quirk artifacts') unless level == 1
# Quirk artifacts don't store skills
[skill1, skill2, skill3, skill4].each_with_index do |skill, idx|
next if skill.blank? || skill == {}
errors.add(:"skill#{idx + 1}", 'must be empty for quirk artifacts')
end
end
end