class EventInfoParser
Constants
- MANDATORY_KEYS
- OPTIONAL_KEYS
- REWARD_LIST_MANDATORY_KEYS
- REWARD_LIST_OPTIONAL_KEYS
Public Class Methods
all_cleared?(event_info_list, level, period = nil)
click to toggle source
与えられた難易度の全海域をクリア済みの場合に true を返します。 その難易度が解放済みで、かつ 'NOTCLEAR' の海域が存在しない場合はクリア済みとみなします。
# File lib/admiral_stats_parser/parser/event_info_parser.rb, line 275 def self.all_cleared?(event_info_list, level, period = nil) return false unless EventInfoParser.opened?(event_info_list, level, period) # 指定されたレベルの情報を、サブ海域番号の小さい順に取り出し list = event_info_list.select{|info| info.level == level and info.period == period }.sort_by {|info| info.area_sub_id } list.select{|i| i.area_clear_state == 'NOTCLEAR' }.size == 0 end
cleared_loop_counts(event_info_list, level, period = nil)
click to toggle source
与えられたリストから、クリア済みの周回数を返します。 その作戦が未開放の場合は nil を返します。
# File lib/admiral_stats_parser/parser/event_info_parser.rb, line 204 def self.cleared_loop_counts(event_info_list, level, period = nil) # 指定されたレベルの情報のみ取り出し list = event_info_list.select{|info| info.level == level and info.period == period } # その難易度および作戦のデータがない場合は nil return nil if list.empty? # その周回をクリア済みかどうか cleared = EventInfoParser.all_cleared?(event_info_list, level, period) # 現在の周回数 loop_count = list.map{|i| i.loop_count }.max cleared ? loop_count : loop_count - 1 end
cleared_stage_no(event_info_list, level, period = nil)
click to toggle source
与えられたリストから、現在の周回でクリア済みのステージ No. を返します。 丙 E-1 クリア済みの場合も、乙 E-1 クリア済みの場合も 1 を返します。 E-1 未クリアの場合は 0 を返します。 その難易度または作戦が未開放の場合は 0 を返します。
# File lib/admiral_stats_parser/parser/event_info_parser.rb, line 224 def self.cleared_stage_no(event_info_list, level, period = nil) # その難易度が未開放の場合は、0 を返す return 0 unless EventInfoParser.opened?(event_info_list, level, period) # 指定されたレベルの情報を、サブ海域番号の小さい順に取り出し list = event_info_list.select{|info| info.level == level and info.period == period }.sort_by {|info| info.area_sub_id } list.each_with_index do |info, prev_stage_no| return prev_stage_no if info.area_clear_state == 'NOTCLEAR' end # NOTCLEAR のエリアがなければ、最終海域の番号を返す list.size end
current_loop_counts(event_info_list, level, period = nil)
click to toggle source
与えられたリストから、現在の周回数を返します。 その作戦が未開放の場合は nil を返します。
# File lib/admiral_stats_parser/parser/event_info_parser.rb, line 191 def self.current_loop_counts(event_info_list, level, period = nil) # 指定されたレベルの情報のみ取り出し list = event_info_list.select{|info| info.level == level and info.period == period } # その難易度および作戦のデータがない場合は nil return nil if list.empty? # 現在の周回数 list.map{|i| i.loop_count }.max end
current_military_gauge_left(event_info_list, level, period = nil)
click to toggle source
与えられたリストから、攻略中のステージの海域ゲージの現在値を返します。 全ステージクリア後、および掃討戦の場合は 0 を返します。 その難易度または作戦が未開放の場合は 0 を返します。
# File lib/admiral_stats_parser/parser/event_info_parser.rb, line 242 def self.current_military_gauge_left(event_info_list, level, period = nil) # 全ステージクリア後は 0 を返す return 0 if EventInfoParser.all_cleared?(event_info_list, level, period) # 指定されたレベルの情報を、サブ海域番号の小さい順に取り出し list = event_info_list.select{|info| info.level == level and info.period == period }.sort_by {|info| info.area_sub_id } list.each do |info| if info.area_clear_state == 'NOTCLEAR' or info.area_clear_state == 'NOOPEN' return info.military_gauge_left end end # NOTCLEAR のエリアがなければ 0 を返す 0 end
opened?(event_info_list, level, period = nil)
click to toggle source
与えられた難易度が解放済みの場合に true を返します。
# File lib/admiral_stats_parser/parser/event_info_parser.rb, line 260 def self.opened?(event_info_list, level, period = nil) # 指定されたレベルの情報を、サブ海域番号の小さい順に取り出し list = event_info_list.select{|info| info.level == level and info.period == period }.sort_by {|info| info.area_sub_id } # その難易度のデータがなければ、未開放と見なす(通常は発生しない) return false if list.size == 0 # 最初の海域の状態が NOOPEN の場合は未開放 return false if list.first.area_clear_state == 'NOOPEN' true end
parse(json, api_version)
click to toggle source
# File lib/admiral_stats_parser/parser/event_info_parser.rb, line 90 def self.parse(json, api_version) items_array = JSON.parse(json) unless items_array.is_a?(Array) raise 'json is not an Array' end results = [] items_array.each do |items| result = EventInfo.new MANDATORY_KEYS[api_version].each do |key, key_class| # 必須のキーが含まれなければエラー camel_case_key = key.to_s.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join unless items.include?(camel_case_key) raise "Mandatory key #{key} does not exist" end # 結果のクラスが合わなければエラー # 海域撃破ボーナスを格納するために、特別な処理を追加 if key_class == :reward_list result.instance_variable_set( "@#{key.to_s}", EventInfoParser.parse_reward_list(items[camel_case_key])) next end # ruby には Boolean クラスがないので、そこだけ特別な処理を用意する if key_class == :boolean unless [true, false].include?(items[camel_case_key]) raise "Mandatory key #{key} is not boolean" end else unless items[camel_case_key].is_a?(key_class) raise "Mandatory key #{key} is not class #{key_class}" end end result.instance_variable_set("@#{key.to_s}", items[camel_case_key]) end OPTIONAL_KEYS[api_version].each do |key, key_class| # キーが含まれなければ、処理をスキップ camel_case_key = key.to_s.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join next unless items.include?(camel_case_key) # 結果のクラスが合わなければエラー unless items[camel_case_key].is_a?(key_class) raise "Optional key #{key} is not class #{key_class}" end result.instance_variable_set("@#{key.to_s}", items[camel_case_key]) end results << result end results end
parse_reward_list(rewards)
click to toggle source
# File lib/admiral_stats_parser/parser/event_info_parser.rb, line 149 def self.parse_reward_list(rewards) results = [] rewards.each do |reward| result = EventInfo::EventInfoReward.new REWARD_LIST_MANDATORY_KEYS.each do |key, key_class| # 必須のキーが含まれなければエラー camel_case_key = key.to_s.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join unless reward.include?(camel_case_key) raise "Mandatory key #{key} does not exist" end # 結果のクラスが合わなければエラー unless reward[camel_case_key].is_a?(key_class) raise "Mandatory key #{key} is not class #{key_class}" end result.instance_variable_set("@#{key.to_s}", reward[camel_case_key]) end REWARD_LIST_OPTIONAL_KEYS.each do |key, key_class| # キーが含まれなければ、処理をスキップ camel_case_key = key.to_s.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join next unless reward.include?(camel_case_key) # 結果のクラスが合わなければエラー unless reward[camel_case_key].is_a?(key_class) raise "Optional key #{key} is not class #{key_class}" end result.instance_variable_set("@#{key.to_s}", reward[camel_case_key]) end results << result end results end