hensei-api/lib/granblue/transformers/summon_transformer.rb
Justin Edmund 7d164b540c
Adds documentation to some lib functions (#168)
* Add sigs and docs to transformers

* Add sigs and docs to downloaders

* Adds sigs and docs to importers
2025-01-18 03:09:29 -08:00

106 lines
4.2 KiB
Ruby

# frozen_string_literal: true
module Granblue
module Transformers
# Transforms raw game summon data into standardized format for database import.
# Handles summon stats, uncap levels, transcendence, and quick summon status.
#
# @example Transforming summon data
# data = {
# "master" => { "name" => "Bahamut", "id" => "2040003000" },
# "param" => { "evolution" => 5, "level" => 200 }
# }
# transformer = SummonTransformer.new(data, "2040003000")
# result = transformer.transform
# # => [{ name: "Bahamut", id: "2040003000", uncap: 5, transcend: 1, qs: true }]
#
# @note Expects data with "master" and "param" nested objects for each summon
# @note Handles quick summon status if ID matches provided quick_summon_id
#
# @see BaseTransformer For base transformation functionality
class SummonTransformer < BaseTransformer
# @return [Array<Integer>] Level thresholds for determining transcendence level
TRANSCENDENCE_LEVELS = [210, 220, 230, 240].freeze
# Creates a new summon transformer
# @param data [Object] Raw summon data to transform
# @param quick_summon_id [String, nil] ID of the current quick summon
# @param options [Hash] Additional transformation options
# @option options [String] :language ('en') Language for names
# @option options [Boolean] :debug (false) Enable debug logging
# @return [void]
def initialize(data, quick_summon_id = nil, options = {})
super(data, options)
@quick_summon_id = quick_summon_id
Rails.logger.info "[TRANSFORM] Initializing SummonTransformer with quick_summon_id: #{quick_summon_id}"
end
# Transform raw summon data into standardized format
# @return [Array<Hash>] Array of transformed summon data
def transform
Rails.logger.info "[TRANSFORM] Starting SummonTransformer#transform"
# Validate that input data is a Hash
unless data.is_a?(Hash)
Rails.logger.error "[TRANSFORM] Invalid summon data structure"
Rails.logger.error "[TRANSFORM] Data class: #{data.class}"
return []
end
summons = []
# Process each summon in the data
data.each_value do |summon_data|
Rails.logger.debug "[TRANSFORM] Processing summon: #{summon_data['master']['name'] if summon_data['master']}"
# Extract master and parameter data
master, param = get_master_param(summon_data)
unless master && param
Rails.logger.debug "[TRANSFORM] Skipping summon - missing master or param data"
next
end
# Build base summon hash with required attributes
summon = {
name: master['name'], # Summon's display name
id: master['id'], # Unique identifier
uncap: param['evolution'].to_i # Current uncap level
}
Rails.logger.debug "[TRANSFORM] Base summon data: #{summon}"
# Add transcendence level for highly uncapped summons
if summon[:uncap] > 5
level = param['level'].to_i
trans = calculate_transcendence_level(level)
summon[:transcend] = trans
Rails.logger.debug "[TRANSFORM] Added transcendence level: #{trans}"
end
# Mark quick summon status if this summon matches quick_summon_id
if @quick_summon_id && param['id'].to_s == @quick_summon_id.to_s
summon[:qs] = true
Rails.logger.debug "[TRANSFORM] Marked as quick summon"
end
summons << summon
Rails.logger.info "[TRANSFORM] Successfully processed summon #{summon[:name]}"
end
Rails.logger.info "[TRANSFORM] Completed processing #{summons.length} summons"
summons
end
private
# Calculates transcendence level based on summon level
# @param level [Integer, nil] Current summon level
# @return [Integer] Calculated transcendence level (1-5)
def calculate_transcendence_level(level)
return 1 unless level
level = 1 + TRANSCENDENCE_LEVELS.count { |cutoff| level > cutoff }
Rails.logger.debug "[TRANSFORM] Calculated transcendence level: #{level}"
level
end
end
end
end