* Move app/helpers/granblue_wiki to lib/parsers/wiki This clears up the namespace beginning with "Granblue" * Removed some top-level Granblue libs DataImporter and DownloadManager exist inside of the PostDeployment namespace now so these files are redundant * Fix Downloaders namespace Our namespace was singular Downloader, now it is plural Downloaders to match the folder name * Fix import paths * DownloadManager was moved to downloaders/ * import_data task now uses the PostDeployment version of DataImporter * Update application.rb Eager-Load/Autoload the lib/ folder * Update cors.rb Add Granblue website and Extension ID to CORS * Add transformers Transformers take raw data from Granblue Fantasy and transforms them into hensei-compatible JSON. Transformers heavily borrow from vazkii/hensei-transfer. * Add ImportController and route This adds the controller that handles creating a full party from transformed Granblue Fantasy data
136 lines
4.3 KiB
Ruby
136 lines
4.3 KiB
Ruby
module Granblue
|
|
module Transformers
|
|
class WeaponTransformer < BaseTransformer
|
|
UNCAP_LEVELS = [40, 60, 80, 100, 150, 200].freeze
|
|
TRANSCENDENCE_LEVELS = [210, 220, 230, 240].freeze
|
|
MULTIELEMENT_SERIES = [13, 17, 19].freeze
|
|
|
|
def transform
|
|
Rails.logger.info "[TRANSFORM] Starting WeaponTransformer#transform"
|
|
|
|
unless data.is_a?(Hash)
|
|
Rails.logger.error "[TRANSFORM] Invalid weapon data structure"
|
|
return []
|
|
end
|
|
|
|
weapons = []
|
|
data.each_value do |weapon_data|
|
|
next unless weapon_data['master'] && weapon_data['param']
|
|
|
|
master = weapon_data['master']
|
|
param = weapon_data['param']
|
|
|
|
Rails.logger.debug "[TRANSFORM] Processing weapon: #{master['name']}"
|
|
|
|
weapon = transform_base_attributes(master, param)
|
|
Rails.logger.debug "[TRANSFORM] Base weapon attributes: #{weapon}"
|
|
|
|
weapon.merge!(transform_awakening(param))
|
|
Rails.logger.debug "[TRANSFORM] After awakening: #{weapon[:awakening] if weapon[:awakening]}"
|
|
|
|
weapon.merge!(transform_ax_skills(param))
|
|
Rails.logger.debug "[TRANSFORM] After AX skills: #{weapon[:ax] if weapon[:ax]}"
|
|
|
|
weapon.merge!(transform_weapon_keys(weapon_data))
|
|
Rails.logger.debug "[TRANSFORM] After weapon keys: #{weapon[:keys] if weapon[:keys]}"
|
|
|
|
weapons << weapon unless master['id'].nil?
|
|
Rails.logger.info "[TRANSFORM] Successfully processed weapon #{weapon[:name]}"
|
|
end
|
|
|
|
Rails.logger.info "[TRANSFORM] Completed processing #{weapons.length} weapons"
|
|
weapons
|
|
end
|
|
|
|
private
|
|
|
|
def transform_base_attributes(master, param)
|
|
Rails.logger.debug "[TRANSFORM] Processing base attributes for weapon"
|
|
|
|
series = master['series_id'].to_i
|
|
weapon = {
|
|
name: master['name'],
|
|
id: master['id']
|
|
}
|
|
|
|
# Handle multi-element weapons
|
|
if MULTIELEMENT_SERIES.include?(series)
|
|
element = master['attribute'].to_i - 1
|
|
weapon[:attr] = element
|
|
weapon[:id] = (master['id'].to_i - (element * 100)).to_s
|
|
Rails.logger.debug "[TRANSFORM] Multi-element weapon adjustments made"
|
|
end
|
|
|
|
# Calculate uncap level
|
|
level = param['level'].to_i
|
|
uncap = calculate_uncap_level(level)
|
|
weapon[:uncap] = uncap
|
|
Rails.logger.debug "[TRANSFORM] Calculated uncap level: #{uncap}"
|
|
|
|
# Add transcendence if applicable
|
|
if uncap > 5
|
|
trans = calculate_transcendence_level(level)
|
|
weapon[:transcend] = trans
|
|
Rails.logger.debug "[TRANSFORM] Added transcendence level: #{trans}"
|
|
end
|
|
|
|
weapon
|
|
end
|
|
|
|
def transform_awakening(param)
|
|
return {} unless param['arousal']&.[]('is_arousal_weapon')
|
|
|
|
Rails.logger.debug "[TRANSFORM] Processing weapon awakening"
|
|
{
|
|
awakening: {
|
|
type: param['arousal']['form_name'],
|
|
lvl: param['arousal']['level']
|
|
}
|
|
}
|
|
end
|
|
|
|
def transform_ax_skills(param)
|
|
augments = param['augment_skill_info']
|
|
return {} unless augments&.first&.any?
|
|
|
|
Rails.logger.debug "[TRANSFORM] Processing AX skills"
|
|
ax = []
|
|
augments.first.each_value do |augment|
|
|
ax_skill = {
|
|
id: augment['skill_id'].to_s,
|
|
val: augment['show_value']
|
|
}
|
|
ax << ax_skill
|
|
Rails.logger.debug "[TRANSFORM] Added AX skill: #{ax_skill}"
|
|
end
|
|
|
|
{ ax: ax }
|
|
end
|
|
|
|
def transform_weapon_keys(weapon_data)
|
|
Rails.logger.debug "[TRANSFORM] Processing weapon keys"
|
|
keys = []
|
|
|
|
# Add weapon keys if they exist
|
|
['skill1', 'skill2', 'skill3'].each do |skill_key|
|
|
if weapon_data[skill_key]&.[]('id')
|
|
keys << weapon_data[skill_key]['id']
|
|
Rails.logger.debug "[TRANSFORM] Added weapon key: #{weapon_data[skill_key]['id']}"
|
|
end
|
|
end
|
|
|
|
keys.any? ? { keys: keys } : {}
|
|
end
|
|
|
|
def calculate_uncap_level(level)
|
|
return 0 unless level
|
|
UNCAP_LEVELS.count { |cutoff| level.to_i > cutoff }
|
|
end
|
|
|
|
def calculate_transcendence_level(level)
|
|
return 1 unless level
|
|
1 + TRANSCENDENCE_LEVELS.count { |cutoff| level.to_i > cutoff }
|
|
end
|
|
end
|
|
end
|
|
end
|