hensei-api/lib/granblue/transformers/weapon_transformer.rb
Justin Edmund 0d5d4d5f59
Jedmund/import (#167)
* 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
2025-01-17 12:02:12 -08:00

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