blueprint looks up skill and calculates strength validation checks quality range instead of strength value
108 lines
3 KiB
Ruby
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
|