class D1lcs::Element

Constants

CHARA_SHEET_URL

オンラインキャラクターシートのJSON出力用URL

Attributes

error[R]

エラーが発生した時

Public Class Methods

new(request) click to toggle source

JSON でデータを取り込む @return [String] 完成した1行キャラシ ToDo: エラー処理を書く

# File lib/d1lcs/element.rb, line 21
def initialize(request)
  @logger = Logger.new(STDERR)
  @logger.progname = 'Detatoko1LineCharaSheet'

  unless(@request = check_id(request))
    @error = "キャラクターシートID '#{request}' は無効です"
    return
  end
  if(@chara_sheet = json_parse) == nil
    @error = "キャラクターシートID '#{request}' を読み込めませんでした"
    return
  end
  unless(chara_exist)
    @error = "キャラクターシートID '#{request}' は存在しません"
    return
  end

  @formatted = [pcname,
                level,
                hpmp,
                classes,
                position_skill,
                skills,
                timing_janre,
                charaID,
                plname
  ].flatten
end

Public Instance Methods

chara_sheet_line() click to toggle source

1行キャラクターシートを出力する @return [String]

# File lib/d1lcs/element.rb, line 52
def chara_sheet_line
  @formatted.clone.fill(nil, 6..6).compact.join('|')
end
Also aliased as: print, to_s
print()
Alias for: chara_sheet_line
to_s()
Alias for: chara_sheet_line

Private Instance Methods

charaID() click to toggle source

キャラクターID @return [String]

# File lib/d1lcs/element.rb, line 126
def charaID
  "#{'% 4d' % @chara_sheet['id']}"
end
chara_exist() click to toggle source

キャラクターが存在するか調べる @return [Boolean]

# File lib/d1lcs/element.rb, line 167
def chara_exist
  @chara_sheet['id'] != 0
end
check_id(request) click to toggle source

リクエストされたキャラクターIDが正しいか確認する @param [String] request @return [Integer/false]

# File lib/d1lcs/element.rb, line 139
def check_id(request)
  id = request.to_i
  case id
  when 0
    false
  else
    id
  end
end
classID_short(class_id) click to toggle source

クラスIDから全角2文字の短縮形に変換する @param [Integer] class_id JSONから読み込むことを考慮し文字列型 @return [String]

# File lib/d1lcs/element.rb, line 186
def classID_short(class_id)
  class_ids = ['勇者', '魔王', '姫様', 'ドラ', '戦士', '魔使',
               '神聖', '暗黒', 'マス', 'モン', '謎 ', 'ザコ',
               'メカ', '商人', '占師',              # フロンティア
               '忍者', '貴族', '死霊', '異形',      # ダークネス
               '探偵', '侍 ', '祈祷', '偶像'       # ワールドツアー
  ]
  class_ids[class_id.to_i - 1]
end
classes() click to toggle source

クラス @return [String]

# File lib/d1lcs/element.rb, line 84
def classes
  @chara_sheet['class'].map { |array| classID_short(array['id']) }.join
end
hpmp() click to toggle source

体力・気力・フラグ @return [String]

# File lib/d1lcs/element.rb, line 74
def hpmp
  hpmp = ''
  %w(h m).each { |type|
    hpmp << (@chara_sheet["#{type}p"]['total'].to_s * 2).insert(2, '/')
  }
  hpmp.insert(-6, ' ') << ' 0'
end
json_parse() click to toggle source

公式キャラシから JSON をダウンロードし、Hash に変換する @return [Hash]

# File lib/d1lcs/element.rb, line 151
def json_parse
  begin
    open(
      URI.parse(CHARA_SHEET_URL % @request),
      'User-Agent' => D1lcs::USER_AGENT
    ) { |f|
      JSON.parse(f.read)
    }
  rescue => e
    @logger.error { ["requestID:#{@request}", e.class, e].join(' : ') }
    nil
  end
end
level() click to toggle source

PC のレベル @return [String]

# File lib/d1lcs/element.rb, line 68
def level
  unify_dispsize2(@chara_sheet['level'].to_s)
end
pcname() click to toggle source

PC の名前 @return [String]

# File lib/d1lcs/element.rb, line 62
def pcname
  @chara_sheet['name'].dispformat(NAME_WIDTH)
end
plname() click to toggle source

プレイヤー名 @return [String]

# File lib/d1lcs/element.rb, line 132
def plname
  @chara_sheet['player_name']
end
positionID_short(position_id) click to toggle source

ポジションIDから全角2文字の短縮形に変換する @param [Integer] position_id JSONから読み込むことを考慮し文字列型 @return [String]

# File lib/d1lcs/element.rb, line 199
def positionID_short(position_id)
  position_ids = ['冒険', '凡人', '夢追', '神話', '負犬', '守護',
                  '悪党', 'カリ', '修羅', '遊人', '従者', '不明',
                  '迷子', '伝説', '罪人', '傷追', '型破', '裏住',
                  '悪華', '堕落', '幹部', 'トリ', '無能', '支配',
                  '狂才', '要悪', '外道', '野獣', '死使', '破滅'
  ]
  position_ids[position_id - 1]
end
position_skill() click to toggle source

ポジションスキル @return [String]/

# File lib/d1lcs/element.rb, line 96
def position_skill
  if(@chara_sheet['position'])
    positionID_short(@chara_sheet['position']['id'])
  else
    '  '
  end
end
skills() click to toggle source

スキル @return [String]

# File lib/d1lcs/element.rb, line 90
def skills
  @chara_sheet['skill'].map { |array| array['name'].chars.first }.join
end
timing_janre() click to toggle source

スキルタイミング・ジャンル @return [Array<String>] [timing, string] の順番

# File lib/d1lcs/element.rb, line 106
def timing_janre
  timing = [0, 1, 2, 0]   # 常時, 対応, 行動, 誘発
  janre = Array.new(6, 0) # 意志, 感覚, 交渉, 肉体, 技術, 知識
  @chara_sheet['skill'].each { |skill|
    timing[skill['timing'].to_i] += 1
    janre[skill['janre'].to_i - 1] += 1
  }
  if(@chara_sheet['position'])
    timing[@chara_sheet['position_skill']['timing'].to_i] += 1
    janre[@chara_sheet['position_skill']['janre'].to_i - 1] += 1
  end
  [timing, janre].map { |array|
    array.map { |value|
      unify_dispsize2(value.to_s).tr('0', ' ')
    }.join
  }
end
unify_dispsize2(num) click to toggle source

半角2文字幅で表示をそろえるため数字の全角・半角を調整する @param [String] num 整数(1桁もしくは2桁) @result [String] 1桁なら全角に、2桁なら半角の整数

# File lib/d1lcs/element.rb, line 174
def unify_dispsize2(num)
  case num.size
  when 1
    num.half_to_full
  when 2
    num.full_to_half
  end
end