admiral_stats_parser 1.5.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2aa3984e3dd25fe1d74fc4512e9887e3ab75f9b9
4
- data.tar.gz: 9bd20abb4cbe4ff183f1237e19d025c3ed8d17a2
3
+ metadata.gz: da1d3ff4a8d20f013e58c619f48d3f7953d407d1
4
+ data.tar.gz: 84a8217dc2bfc9519209eebd3d3e37c0278e5f95
5
5
  SHA512:
6
- metadata.gz: 4679a34084c1755bd27852cc4d0dbb90599d72099a54f7ec1e0bf79f5e5abd8249648ad99b769d654a4f6ae16e61cfb2f94762d3983387c7d7a90b9d14f60bce
7
- data.tar.gz: ebf05a3b44df45a206436fd2393a1b61c114d8d3f78810ab7fa8f0ea668d29eb3e1fb94bdcc1485972d1c6dc58afb18abd0f33a82b9b9f5d21a3362591b27a4a
6
+ metadata.gz: 0a0e5cbddb030c82d41c7de3ed21eba8d6249baecb26bdf26fdfd756564b7069283feeaaa47e47656a8ed33ae767ca9bb03b8e124fd67e87b54b081bd4295b9e
7
+ data.tar.gz: 507d3df27ff2b4f30a8403a2890f9fc5fbcc1d9510351b3f925d9ea7fc1b221b9f969a5b30e572f192f7d1b21559bd9276ccc6a9f472e36ca4847e71cb402850
data/.travis.yml CHANGED
@@ -1,5 +1,8 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.0.0
4
+ - 2.3.1
5
5
  before_install: gem install bundler -v 1.12.5
6
+ notifications:
7
+ slack:
8
+ secure: VPzFgTybKgKLS3VLsVMJuNppYGao6F1ku7lb7XY/RXcVwKTcgQC32suO3dnoqbtUpijRwlLj0rtTD1gdJ4Dceq+g9OEj3bVr07ifDFkOSQfs0/ckh2bCBN8NWVJJzHSKJuzKz7KhGPYYNvdDV8DumqxotL6fPHojoK8lQjmv+qp0ySZnkDr7S0mhzTuRtqb0NQ/uGKnaLtCiS2EGECghNK1eijLuNVc+eJ1IhpalCYS5I0tOTVftj3/e7GbQW8p26XgtcgB9QMhXLJjRGHsLNkBFDrOmSnG0mzvIXFARbklfvd8ZmeuwcxN1hy9dfcLwlCkgII/6CMVd7O4g9tsrRB02WaGoLzbZfcjFJqD3kEhUza7AdNtBAtAv1OSqxc+KHEmWJqMQUd5crLwd4wHZZw82ouWd0HGlZw/Ueqyl1m0Xi7Otj9UeAxz6PQQQAn3Xuxt6mNQhFjKHHVZT63kosPKuzFjZ+f7y/37k8vxTadzf3Fjjcz1NmvG2tR02xs0vj+WskIYpOw9KELwlyiQAf71dSGBaNExGULKVusI0EIXvqTff46ZxoeFwR6gg3Jxh50mqjpux9Azc52pULzkExib0Cx/+O6vDBiPvVT4DKOCA87WmxN2ecXE3uasit5ZEZgGUsFjMmP8NbqIRp60jn8GCstR1f866YkWVPbvcIvs=
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # admiral_stats_parser
2
2
 
3
- [![Join the chat at https://gitter.im/muziyoshiz/admiral_stats](https://badges.gitter.im/muziyoshiz/admiral_stats.svg)](https://gitter.im/muziyoshiz/admiral_stats?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
3
+ [![Build Status](https://travis-ci.org/muziyoshiz/admiral_stats_parser.svg?branch=master)](https://travis-ci.org/muziyoshiz/admiral_stats_parser) [![Join the chat at https://gitter.im/muziyoshiz/admiral_stats](https://badges.gitter.im/muziyoshiz/admiral_stats.svg)](https://gitter.im/muziyoshiz/admiral_stats?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
4
4
 
5
5
  Parser for admiral stats JSON data exported from kancolle-arcade.net
6
6
 
@@ -43,6 +43,9 @@ AdmiralStatsParser.parse_equip_list_info(json, api_version)
43
43
 
44
44
  # イベント海域情報
45
45
  AdmiralStatsParser.parse_event_info(json, api_version)
46
+
47
+ # 改装設計図一覧
48
+ AdmiralStatsParser.parse_blueprint_list_info(json, api_version)
46
49
  ```
47
50
 
48
51
  ## Specification
@@ -57,26 +60,26 @@ AdmiralStatsParser は、以下の API version をサポートしています。
57
60
  | 2 | 2016-06-30(REVISION 2 のリリース日)〜 2016-09-14 |
58
61
  | 3 | 2016-09-15 〜 2016-10-26 |
59
62
  | 4 | 2016-10-27 〜 2016-12-20 |
60
- | 5 | 2016-12-21 〜 |
63
+ | 5 | 2016-12-21 〜 2017-02-13 |
64
+ | 6 | 2017-02-14 〜 2017-04-25 |
65
+ | 7 | 2017-04-26 〜 |
61
66
 
62
67
  各 API version でパースできる JSON の種類は以下の通りです。また、同じ情報でも、API version によって、含まれる情報量が異なる場合があります。その場合は Supported (1), Supported (2) のように記載して区別しています。
63
68
 
64
- | 提督情報での表示 | URL | API version 1 | API version 2〜5 |
65
- |:----------------|:----|:--------------|:--------------|
66
- | 基本情報 | Personal/basicInfo | Supported (1) | Supported (2) |
67
- | 海域情報 | Area/captureInfo | Supported (1) | Supported (2) |
68
- | 艦娘図鑑 | TcBook/info | Supported (1) | Supported (2) |
69
- | 装備図鑑 | EquipBook/info | Supported | Supported |
70
-
71
- | 提督情報での表示 | URL | API version 2 | API version 3〜4 | API version 5 |
72
- |:----------------|:----|:--------------|:-------------|:-------------|
73
- | 艦娘一覧 | CharacterList/info | Supported (1) | Supported (2) | Supported (3) |
74
- | 装備一覧 | EquipList/info | Supported | Supported | Supported |
75
- | 任務一覧 | Quest/info | Unsupported | Unsupported | Unsupported |
76
-
77
- | 提督情報での表示 | URL | API version 4〜5 |
78
- |:----------------|:----|:--------------|
79
- | イベント海域情報 | Event/info | Supported (1) |
69
+ | API version | 基本情報 | 海域情報 | 艦娘図鑑 | 装備図鑑 |
70
+ |------------:|:-----|:-----|:-----|:-----|
71
+ | 1 | Supported (1) | Supported (1) | Supported (1) | Supported |
72
+ | 2 〜 6 | Supported (2) | Supported (2) | Supported (2) | Supported |
73
+ | 7 | Supported (3) | Supported (3) | Supported (2) | Supported |
74
+
75
+ | API version | 艦娘一覧 | 装備一覧 | イベント海域情報 |
76
+ |------------:|:-----|:-----|:-----|
77
+ | 1 | Unsupported | Unsupported | Unsupported |
78
+ | 2 | Supported (1) | Supported | Unsupported |
79
+ | 3 | Supported (2) | Supported | Unsupported |
80
+ | 4 | Supported (2) | Supported | Supported (1) |
81
+ | 5 〜 6 | Supported (3) | Supported | Supported (1) |
82
+ | 7 | Supported (4) | Supported | Supported (2) |
80
83
 
81
84
  ## Development
82
85
 
@@ -7,11 +7,12 @@ require 'admiral_stats_parser/parser/equip_book_info_parser'
7
7
  require 'admiral_stats_parser/parser/character_list_info_parser'
8
8
  require 'admiral_stats_parser/parser/equip_list_info_parser'
9
9
  require 'admiral_stats_parser/parser/event_info_parser'
10
+ require 'admiral_stats_parser/parser/blueprint_list_info_parser'
10
11
 
11
12
  module AdmiralStatsParser
12
13
  # 最新の API バージョンを返します。
13
14
  def self.get_latest_api_version
14
- return 5
15
+ return 7
15
16
  end
16
17
 
17
18
  # エクスポート時刻を元に、API バージョンを推測して返します。
@@ -28,6 +29,12 @@ module AdmiralStatsParser
28
29
  # version 5 の開始日
29
30
  return 4 if exported_at < Time.parse('2016-12-21T07:00:00+0900')
30
31
 
32
+ # version 6 の開始日
33
+ return 5 if exported_at < Time.parse('2017-02-14T07:00:00+0900')
34
+
35
+ # version 7 の開始日
36
+ return 6 if exported_at < Time.parse('2017-04-26T07:00:00+0900')
37
+
31
38
  return self.get_latest_api_version
32
39
  end
33
40
 
@@ -36,8 +43,10 @@ module AdmiralStatsParser
36
43
  case api_version
37
44
  when 1
38
45
  PersonalBasicInfoParser.parse(json, 1)
39
- when 2..5
46
+ when 2..6
40
47
  PersonalBasicInfoParser.parse(json, 2)
48
+ when 7
49
+ PersonalBasicInfoParser.parse(json, 3)
41
50
  else
42
51
  raise 'unsupported API version'
43
52
  end
@@ -48,8 +57,10 @@ module AdmiralStatsParser
48
57
  case api_version
49
58
  when 1
50
59
  AreaCaptureInfoParser.parse(json, 1)
51
- when 2..5
60
+ when 2..6
52
61
  AreaCaptureInfoParser.parse(json, 2)
62
+ when 7
63
+ AreaCaptureInfoParser.parse(json, 3)
53
64
  else
54
65
  raise 'unsupported API version'
55
66
  end
@@ -60,7 +71,7 @@ module AdmiralStatsParser
60
71
  case api_version
61
72
  when 1
62
73
  TcBookInfoParser.parse(json, 1)
63
- when 2..5
74
+ when 2..7
64
75
  TcBookInfoParser.parse(json, 2)
65
76
  else
66
77
  raise 'unsupported API version'
@@ -70,7 +81,7 @@ module AdmiralStatsParser
70
81
  # 装備図鑑をパースします。
71
82
  def self.parse_equip_book_info(json, api_version)
72
83
  case api_version
73
- when 1..5
84
+ when 1..7
74
85
  EquipBookInfoParser.parse(json)
75
86
  else
76
87
  raise 'unsupported API version'
@@ -86,8 +97,10 @@ module AdmiralStatsParser
86
97
  CharacterListInfoParser.parse(json, 1)
87
98
  when 3..4
88
99
  CharacterListInfoParser.parse(json, 2)
89
- when 5
100
+ when 5..6
90
101
  CharacterListInfoParser.parse(json, 3)
102
+ when 7
103
+ CharacterListInfoParser.parse(json, 4)
91
104
  else
92
105
  raise 'unsupported API version'
93
106
  end
@@ -98,7 +111,7 @@ module AdmiralStatsParser
98
111
  case api_version
99
112
  when 1
100
113
  raise 'API version 1 does not support equip list info'
101
- when 2..5
114
+ when 2..7
102
115
  EquipListInfoParser.parse(json)
103
116
  else
104
117
  raise 'unsupported API version'
@@ -110,29 +123,43 @@ module AdmiralStatsParser
110
123
  case api_version
111
124
  when 1..3
112
125
  raise "API version #{api_version} does not support event info"
113
- when 4..5
126
+ when 4..6
114
127
  EventInfoParser.parse(json, 1)
128
+ when 7
129
+ EventInfoParser.parse(json, 2)
115
130
  else
116
131
  raise 'unsupported API version'
117
132
  end
118
133
  end
119
134
 
120
135
  # イベント海域情報のサマリを作成します。
121
- def self.summarize_event_info(event_info_list, level, api_version)
136
+ def self.summarize_event_info(event_info_list, level, period, api_version)
122
137
  case api_version
123
138
  when 1..3
124
139
  raise "API version #{api_version} does not support event info"
125
- when 4..5
140
+ when 4..7
126
141
  {
127
- opened: EventInfoParser.opened?(event_info_list, level),
128
- all_cleared: EventInfoParser.all_cleared?(event_info_list, level),
129
- current_loop_counts: EventInfoParser.current_loop_counts(event_info_list, level),
130
- cleared_loop_counts: EventInfoParser.cleared_loop_counts(event_info_list, level),
131
- cleared_stage_no: EventInfoParser.cleared_stage_no(event_info_list, level),
132
- current_military_gauge_left: EventInfoParser.current_military_gauge_left(event_info_list, level)
142
+ opened: EventInfoParser.opened?(event_info_list, level, period),
143
+ all_cleared: EventInfoParser.all_cleared?(event_info_list, level, period),
144
+ current_loop_counts: EventInfoParser.current_loop_counts(event_info_list, level, period),
145
+ cleared_loop_counts: EventInfoParser.cleared_loop_counts(event_info_list, level, period),
146
+ cleared_stage_no: EventInfoParser.cleared_stage_no(event_info_list, level, period),
147
+ current_military_gauge_left: EventInfoParser.current_military_gauge_left(event_info_list, level, period)
133
148
  }
134
149
  else
135
150
  raise 'unsupported API version'
136
151
  end
137
152
  end
153
+
154
+ # 改装設計図一覧をパースします。
155
+ def self.parse_blueprint_list_info(json, api_version)
156
+ case api_version
157
+ when 1..6
158
+ raise "API version #{api_version} does not support blueprint list info"
159
+ when 7
160
+ BlueprintListInfoParser.parse(json, 1)
161
+ else
162
+ raise 'unsupported API version'
163
+ end
164
+ end
138
165
  end
@@ -1,39 +1,5 @@
1
1
  # 海域情報
2
2
  class AreaCaptureInfo
3
- # 海域番号と海域名の対応関係
4
- AREA_NAMES = {
5
- 1 => '鎮守府海域',
6
- 2 => '南西諸島海域',
7
- 3 => '北方海域',
8
- 4 => '西方海域',
9
- }
10
-
11
- # サブ海域番号と海域名の対応関係
12
- AREA_SUB_NAMES = {
13
- 1 => {
14
- 1 => '鎮守府正面海域',
15
- 2 => '南西諸島沖',
16
- 3 => '製油所地帯沿岸',
17
- 4 => '南西諸島防衛戦',
18
- },
19
- 2 => {
20
- 1 => 'カムラン半島',
21
- 2 => 'バシー島沖',
22
- 3 => '東部オリョール海',
23
- 4 => '沖ノ島海域',
24
- },
25
- 3 => {
26
- 1 => 'モーレイ海哨戒',
27
- 2 => 'キス島撤退作戦',
28
- 3 => 'アルフォンシーノ方面進出',
29
- 4 => '北方海域艦隊決戦',
30
- },
31
- 4 => {
32
- 1 => 'ジャム島攻略作戦',
33
- 2 => 'カレー洋制圧戦',
34
- },
35
- }
36
-
37
3
  # 海域番号
38
4
  attr_accessor :area_id
39
5
 
@@ -88,19 +54,24 @@ class AreaCaptureInfo
88
54
  # NOOPEN: 出撃不可
89
55
  attr_accessor :area_clear_state
90
56
 
91
- # 海域を表す数値を、海域名に変換して返します。
92
- def area_id_to_s
93
- AREA_NAMES.include?(@area_id) ? AREA_NAMES[@area_id] : @area_id.to_s
94
- end
57
+ # 海域ボスの情報(ボスが存在する場合のみ) (From API version 7?)
58
+ attr_accessor :boss_info
59
+
60
+ # 海域ボスの情報
61
+ class BossInfo
62
+ # 海域ゲージの状態
63
+ # "NORMAL": 攻略中
64
+ # "BREAK": 攻略後
65
+ attr_accessor :military_gauge_status
66
+
67
+ # 海域ゲージの最大値
68
+ attr_accessor :ene_military_gauge_val
95
69
 
96
- # サブ海域を表す数値を、海域名に変換して返します。
97
- def area_sub_id_to_s
98
- return "#{@area_id}-#{@area_sub_id}" unless AREA_SUB_NAMES.include?(@area_id)
70
+ # 海域ゲージの現在値
71
+ attr_accessor :military_gauge_left
99
72
 
100
- if AREA_SUB_NAMES[@area_id].include?(@area_sub_id)
101
- AREA_SUB_NAMES[@area_id][@area_sub_id]
102
- else
103
- "#{@area_id}-#{@area_sub_id}"
104
- end
73
+ # ボスの状態を表す文字列
74
+ # FORM_1: 第1形態?
75
+ attr_accessor :boss_status
105
76
  end
106
77
  end
@@ -0,0 +1,40 @@
1
+ # 改装設計図一覧
2
+ class BlueprintListInfo
3
+ # 艦型を表す数値
4
+ # 艦娘図鑑では shipClass に文字列として入っているが、
5
+ # 改装設計図一覧では数値として格納されており、仕様が変わっている。
6
+ attr_accessor :ship_class_id
7
+
8
+ # 艦番号(1〜)
9
+ attr_accessor :ship_class_index
10
+
11
+ # 艦種順でソートする際に使うキー
12
+ attr_accessor :ship_sort_no
13
+
14
+ # 艦種
15
+ attr_accessor :ship_type
16
+
17
+ # 艦名
18
+ attr_accessor :ship_name
19
+
20
+ # 艦娘のステータス画像(横長の画像)のファイル名
21
+ attr_accessor :status_img
22
+
23
+ # 改装設計図の総数
24
+ attr_accessor :blueprint_total_num
25
+
26
+ # 有効期限の詳細
27
+ attr_accessor :expiration_date_list
28
+
29
+ class ExpirationDate
30
+ # 有効期限を表す UNIX タイムスタンプ(ミリ秒含む)
31
+ # 4月に入手した改装設計図の有効期限は 1505141999000 だった。
32
+ # これは 2017-09-11 23:59:59 を表すタイムスタンプである。
33
+ # しかし、SEGA 公式サイト上では「2017年9月末まで」と表示されていた。
34
+ # この値は、月の単位までしか使われていない?
35
+ attr_accessor :expiration_date
36
+
37
+ # 上記の有効期限を持つ改装設計図の枚数
38
+ attr_accessor :blueprint_num
39
+ end
40
+ end
@@ -70,6 +70,9 @@ class CharacterListInfo
70
70
  # 何も装備していない場合、および装備可能なスロットでない場合は、空文字列
71
71
  attr_accessor :slot_img
72
72
 
73
+ # 改装設計図の枚数 (From API version 7)
74
+ attr_accessor :blueprint_total_num
75
+
73
76
  # 累計経験値表
74
77
  EXP_TABLE = {
75
78
  92 => 584500,
@@ -1,20 +1,16 @@
1
1
  # 装備一覧
2
2
  class EquipListInfo
3
- # 種別の文字列表記
4
- TYPE_NAMES = {
5
- 1 => '主砲',
6
- 2 => '副砲・高角',
7
- 3 => '魚雷',
8
- 4 => '艦戦',
9
- 5 => '艦爆・艦攻',
10
- 6 => '偵察機',
11
- 7 => 'ソナー・爆雷',
12
- 8 => 'その他',
13
- }
14
-
15
3
  # 種別を表す数値
16
4
  # 装備図鑑の種別のほうが細かいので、こちらを使うメリットはほとんどない。
17
5
  # 強いて言えば、提督情報のページと同じ表現に揃えたい場合か。
6
+ # 1: 主砲
7
+ # 2: 副砲・高角
8
+ # 3: 魚雷
9
+ # 4: 艦戦
10
+ # 5: 艦爆・艦攻
11
+ # 6: 偵察機
12
+ # 7: ソナー・爆雷
13
+ # 8: その他
18
14
  attr_accessor :type
19
15
 
20
16
  # 図鑑No.
@@ -28,9 +24,4 @@ class EquipListInfo
28
24
 
29
25
  # アイコン画像のファイル名
30
26
  attr_accessor :img
31
-
32
- # 装備の種別を表す文字列を返します。
33
- def type_to_s
34
- TYPE_NAMES.include?(@type) ? TYPE_NAMES[@type] : @type.to_s
35
- end
36
27
  end
@@ -1,31 +1,5 @@
1
1
  # 限定海域情報
2
2
  class EventInfo
3
- # イベント回数
4
- EVENT_NUMBERS = {
5
- 1000 => 1,
6
- }
7
-
8
- # 海域番号と海域名の対応関係
9
- EVENT_AREA_NAMES = {
10
- 1000 => '敵艦隊前線泊地殴り込み',
11
- }
12
-
13
- # サブ海域番号と海域名の対応関係
14
- EVENT_AREA_SUB_NAMES = {
15
- 1000 => {
16
- 1 => '前哨戦',
17
- 2 => '警戒線突破',
18
- 3 => '湾内突入!',
19
- 4 => '敵泊地強襲!',
20
- 5 => '掃討戦',
21
- 6 => '前哨戦',
22
- 7 => '警戒線突破',
23
- 8 => '湾内突入!',
24
- 9 => '敵泊地強襲!',
25
- 10 => '掃討戦',
26
- },
27
- }
28
-
29
3
  # 海域番号
30
4
  # 期間限定海域「敵艦隊前線泊地殴り込み」では、共通して 1000
31
5
  attr_accessor :area_id
@@ -37,11 +11,13 @@ class EventInfo
37
11
  # 難易度
38
12
  # "HEI": 丙
39
13
  # "OTU": 乙
14
+ # "KOU": 甲
40
15
  attr_accessor :level
41
16
 
42
17
  # 海域の種類
43
18
  # ボス戦は "BOSS"
44
19
  # 掃討戦は "SWEEP"
20
+ # 前段作戦の最終海域は "PERIOD_LAST"
45
21
  # それ以外は "NORMAL"
46
22
  attr_accessor :area_kind
47
23
 
@@ -93,37 +69,23 @@ class EventInfo
93
69
  # E-1 攻略開始前は 1000、攻略後は 0
94
70
  attr_accessor :military_gauge_left
95
71
 
96
- # ボスのランク
72
+ # ボスのランク (API version 7 で廃止)
97
73
  # 泊地棲鬼は "ONI"
98
74
  # ゲージ半減して泊地棲姫になると "HIME"
99
75
  # それ以外は "NONE"
100
76
  attr_accessor :boss_status
101
77
 
78
+ # 海域ゲージに表示されるボスアイコンの種類? (From API version 7)
79
+ attr_accessor :ene_military_gauge2d
80
+
102
81
  # 周回数
103
82
  # E-1 攻略開始前は 1、攻略後も 1
104
83
  attr_accessor :loop_count
105
84
 
106
- # イベント回数を返します。
107
- # 第壱回期間限定海域「敵艦隊前線泊地殴り込み」は 1
108
- def event_no
109
- EVENT_NUMBERS[@area_id]
110
- end
111
-
112
- # 海域を表す数値を、海域名に変換して返します。
113
- def area_id_to_s
114
- EVENT_AREA_NAMES.include?(@area_id) ? EVENT_AREA_NAMES[@area_id] : @area_id.to_s
115
- end
116
-
117
- # サブ海域を表す数値を、海域名に変換して返します。
118
- def area_sub_id_to_s
119
- return "#{@area_id}-#{@area_sub_id}" unless EVENT_AREA_SUB_NAMES.include?(@area_id)
120
-
121
- if EVENT_AREA_SUB_NAMES[@area_id].include?(@area_sub_id)
122
- EVENT_AREA_SUB_NAMES[@area_id][@area_sub_id]
123
- else
124
- "#{@area_id}-#{@area_sub_id}"
125
- end
126
- end
85
+ # 前段作戦か後段作戦か (From API version 7)
86
+ # 0: 前段作戦
87
+ # 1: 後段作戦
88
+ attr_accessor :period
127
89
 
128
90
  # 海域撃破ボーナス
129
91
  class EventInfoReward
@@ -1,21 +1,5 @@
1
1
  # 基本情報
2
2
  class PersonalBasicInfo
3
- # 階級を表す数値と、階級名の対応関係
4
- # 新米少佐
5
- # 中堅少佐
6
- # 少佐
7
- # 新米中佐
8
- # 中佐
9
- # 大佐
10
- # 少将
11
- # 7: 中将
12
- # 大将
13
- # 元帥
14
- # 集計中
15
- TITLES = {
16
- 7 => '中将',
17
- }
18
-
19
3
  # 提督名
20
4
  attr_accessor :admiral_name
21
5
 
@@ -57,9 +41,6 @@ class PersonalBasicInfo
57
41
  # 戦略ポイント (From API version 2)
58
42
  attr_accessor :strategy_point
59
43
 
60
- # 階級を表す数値を、階級を表す文字列に変換して返します。
61
- # 数値と階級の対応関係を未調査のため、私が自分で確認できた範囲だけ、文字列にして返します。
62
- def title_id_to_s
63
- TITLES.include?(@title_id) ? TITLES[@title_id] : @title_id.to_s
64
- end
44
+ # 甲種勲章の数 (From API version 7)
45
+ attr_accessor :kou_medal
65
46
  end
@@ -3,36 +3,64 @@ require 'admiral_stats_parser/model/area_capture_info'
3
3
 
4
4
  class AreaCaptureInfoParser
5
5
  MANDATORY_KEYS = {
6
- 1 => {
7
- area_id: Integer,
8
- area_sub_id: Integer,
9
- limit_sec: Integer,
10
- # require_gp: Integer,
11
- pursuit_map: :boolean,
12
- pursuit_map_open: :boolean,
13
- # sortie_limit: :boolean,
14
- stage_image_name: String,
15
- stage_mission_name: String,
16
- stage_mission_info: String,
17
- stage_clear_item_info: String,
18
- stage_drop_item_info: Array,
19
- area_clear_state: String,
20
- },
21
- 2 => {
22
- area_id: Integer,
23
- area_sub_id: Integer,
24
- limit_sec: Integer,
25
- require_gp: Integer,
26
- pursuit_map: :boolean,
27
- pursuit_map_open: :boolean,
28
- sortie_limit: :boolean,
29
- stage_image_name: String,
30
- stage_mission_name: String,
31
- stage_mission_info: String,
32
- stage_clear_item_info: String,
33
- stage_drop_item_info: Array,
34
- area_clear_state: String,
35
- }
6
+ 1 => {
7
+ area_id: Integer,
8
+ area_sub_id: Integer,
9
+ limit_sec: Integer,
10
+ pursuit_map: :boolean,
11
+ pursuit_map_open: :boolean,
12
+ stage_image_name: String,
13
+ stage_mission_name: String,
14
+ stage_mission_info: String,
15
+ stage_clear_item_info: String,
16
+ stage_drop_item_info: Array,
17
+ area_clear_state: String,
18
+ },
19
+ 2 => {
20
+ area_id: Integer,
21
+ area_sub_id: Integer,
22
+ limit_sec: Integer,
23
+ require_gp: Integer,
24
+ pursuit_map: :boolean,
25
+ pursuit_map_open: :boolean,
26
+ sortie_limit: :boolean,
27
+ stage_image_name: String,
28
+ stage_mission_name: String,
29
+ stage_mission_info: String,
30
+ stage_clear_item_info: String,
31
+ stage_drop_item_info: Array,
32
+ area_clear_state: String,
33
+ },
34
+ 3 => {
35
+ area_id: Integer,
36
+ area_sub_id: Integer,
37
+ limit_sec: Integer,
38
+ require_gp: Integer,
39
+ pursuit_map: :boolean,
40
+ pursuit_map_open: :boolean,
41
+ sortie_limit: :boolean,
42
+ stage_image_name: String,
43
+ stage_mission_name: String,
44
+ stage_mission_info: String,
45
+ stage_clear_item_info: String,
46
+ stage_drop_item_info: Array,
47
+ area_clear_state: String,
48
+ },
49
+ }
50
+
51
+ OPTIONAL_KEYS = {
52
+ 1 => {},
53
+ 2 => {},
54
+ 3 => {
55
+ boss_info: :boss_info,
56
+ },
57
+ }
58
+
59
+ BOSS_INFO_MANDATORY_KEYS = {
60
+ military_gauge_status: String,
61
+ ene_military_gauge_val: Integer,
62
+ military_gauge_left: Integer,
63
+ boss_status: String,
36
64
  }
37
65
 
38
66
  def self.parse(json, api_version)
@@ -68,9 +96,50 @@ class AreaCaptureInfoParser
68
96
  result.instance_variable_set("@#{key.to_s}", items[camel_case_key])
69
97
  end
70
98
 
99
+ OPTIONAL_KEYS[api_version].each do |key, key_class|
100
+ # キーが含まれなければ、処理をスキップ
101
+ camel_case_key = key.to_s.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
102
+ next unless items.include?(camel_case_key)
103
+
104
+ # 結果のクラスが合わなければエラー
105
+ # 海域ボスの情報を格納するために、特別な処理を追加
106
+ if key_class == :boss_info
107
+ result.instance_variable_set(
108
+ "@#{key.to_s}", AreaCaptureInfoParser.parse_boss_info(items[camel_case_key]))
109
+ next
110
+ end
111
+
112
+ unless items[camel_case_key].is_a?(key_class)
113
+ raise "Optional key #{key} is not class #{key_class}"
114
+ end
115
+
116
+ result.instance_variable_set("@#{key.to_s}", items[camel_case_key])
117
+ end
118
+
71
119
  results << result
72
120
  end
73
121
 
74
122
  results
75
123
  end
124
+
125
+ def self.parse_boss_info(boss_info)
126
+ result = AreaCaptureInfo::BossInfo.new
127
+
128
+ BOSS_INFO_MANDATORY_KEYS.each do |key, key_class|
129
+ # 必須のキーが含まれなければエラー
130
+ camel_case_key = key.to_s.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
131
+ unless boss_info.include?(camel_case_key)
132
+ raise "Mandatory key #{key} does not exist"
133
+ end
134
+
135
+ # 結果のクラスが合わなければエラー
136
+ unless boss_info[camel_case_key].is_a?(key_class)
137
+ raise "Mandatory key #{key} is not class #{key_class}"
138
+ end
139
+
140
+ result.instance_variable_set("@#{key.to_s}", boss_info[camel_case_key])
141
+ end
142
+
143
+ result
144
+ end
76
145
  end
@@ -0,0 +1,88 @@
1
+ require 'json'
2
+ require 'admiral_stats_parser/model/blueprint_list_info'
3
+
4
+ class BlueprintListInfoParser
5
+ MANDATORY_KEYS = {
6
+ 1 => {
7
+ ship_class_id: Integer,
8
+ ship_class_index: Integer,
9
+ ship_sort_no: Integer,
10
+ ship_type: String,
11
+ ship_name: String,
12
+ status_img: String,
13
+ blueprint_total_num: Integer,
14
+ expiration_date_list: :expiration_date_list,
15
+ },
16
+ }
17
+
18
+ EXPIRATION_DATE_MANDATORY_KEYS = {
19
+ expiration_date: Integer,
20
+ blueprint_num: Integer,
21
+ }
22
+
23
+ def self.parse(json, api_version)
24
+ items_array = JSON.parse(json)
25
+
26
+ unless items_array.is_a?(Array)
27
+ raise 'json is not an Array'
28
+ end
29
+
30
+ results = []
31
+ items_array.each do |items|
32
+ result = BlueprintListInfo.new
33
+
34
+ MANDATORY_KEYS[api_version].each do |key, key_class|
35
+ # 必須のキーが含まれなければエラー
36
+ camel_case_key = key.to_s.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
37
+ unless items.include?(camel_case_key)
38
+ raise "Mandatory key #{key} does not exist"
39
+ end
40
+
41
+ # 有効期限の情報を格納するために、特別な処理を追加
42
+ if key_class == :expiration_date_list
43
+ result.instance_variable_set(
44
+ "@#{key.to_s}", BlueprintListInfoParser.parse_expiration_date_list(items[camel_case_key]))
45
+ next
46
+ end
47
+
48
+ # 結果のクラスが合わなければエラー
49
+ unless items[camel_case_key].is_a?(key_class)
50
+ raise "Mandatory key #{key} is not class #{key_class}"
51
+ end
52
+
53
+ result.instance_variable_set("@#{key.to_s}", items[camel_case_key])
54
+ end
55
+
56
+ results << result
57
+ end
58
+
59
+ results
60
+ end
61
+
62
+ def self.parse_expiration_date_list(expiration_date_list)
63
+ results = []
64
+
65
+ expiration_date_list.each do |ed|
66
+ result = BlueprintListInfo::ExpirationDate.new
67
+
68
+ EXPIRATION_DATE_MANDATORY_KEYS.each do |key, key_class|
69
+ # 必須のキーが含まれなければエラー
70
+ camel_case_key = key.to_s.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
71
+ unless ed.include?(camel_case_key)
72
+ raise "Mandatory key #{key} does not exist"
73
+ end
74
+
75
+ # 結果のクラスが合わなければエラー
76
+ unless ed[camel_case_key].is_a?(key_class)
77
+ raise "Mandatory key #{key} is not class #{key_class}"
78
+ end
79
+
80
+ result.instance_variable_set("@#{key.to_s}", ed[camel_case_key])
81
+ end
82
+
83
+ results << result
84
+ end
85
+
86
+ results
87
+ end
88
+ end
@@ -43,7 +43,30 @@ class CharacterListInfoParser
43
43
  slot_amount: Array,
44
44
  slot_disp: Array,
45
45
  slot_img: Array,
46
- }
46
+ },
47
+ 4 => {
48
+ book_no: Integer,
49
+ lv: Integer,
50
+ ship_type: String,
51
+ ship_sort_no: Integer,
52
+ remodel_lv: Integer,
53
+ ship_name: String,
54
+ status_img: String,
55
+ star_num: Integer,
56
+ ship_class: String,
57
+ ship_class_index: Integer,
58
+ tc_img: String,
59
+ exp_percent: Integer,
60
+ max_hp: Integer,
61
+ real_hp: Integer,
62
+ damage_status: String,
63
+ slot_num: Integer,
64
+ slot_equip_name: Array,
65
+ slot_amount: Array,
66
+ slot_disp: Array,
67
+ slot_img: Array,
68
+ blueprint_total_num: Integer,
69
+ },
47
70
  }
48
71
 
49
72
  def self.parse(json, api_version)
@@ -22,7 +22,28 @@ class EventInfoParser
22
22
  military_gauge_left: Integer,
23
23
  boss_status: String,
24
24
  loop_count: Integer,
25
- }
25
+ },
26
+ 2 => {
27
+ area_id: Integer,
28
+ area_sub_id: Integer,
29
+ level: String,
30
+ area_kind: String,
31
+ limit_sec: Integer,
32
+ require_gp: Integer,
33
+ sortie_limit: :boolean,
34
+ stage_image_name: String,
35
+ stage_mission_name: String,
36
+ stage_mission_info: String,
37
+ reward_list: :reward_list,
38
+ stage_drop_item_info: Array,
39
+ area_clear_state: String,
40
+ military_gauge_status: String,
41
+ ene_military_gauge_val: Integer,
42
+ military_gauge_left: Integer,
43
+ ene_military_gauge2d: String,
44
+ loop_count: Integer,
45
+ period: Integer,
46
+ },
26
47
  }
27
48
 
28
49
  REWARD_LIST_MANDATORY_KEYS = {
@@ -122,21 +143,29 @@ class EventInfoParser
122
143
  end
123
144
 
124
145
  # 与えられたリストから、現在の周回数を返します。
125
- def self.current_loop_counts(event_info_list, level)
146
+ # その作戦が未開放の場合は nil を返します。
147
+ def self.current_loop_counts(event_info_list, level, period = nil)
126
148
  # 指定されたレベルの情報のみ取り出し
127
- list = event_info_list.select{|info| info.level == level }
149
+ list = event_info_list.select{|info| info.level == level and info.period == period }
150
+
151
+ # その難易度および作戦のデータがない場合は nil
152
+ return nil if list.empty?
128
153
 
129
154
  # 現在の周回数
130
155
  list.map{|i| i.loop_count }.max
131
156
  end
132
157
 
133
158
  # 与えられたリストから、クリア済みの周回数を返します。
134
- def self.cleared_loop_counts(event_info_list, level)
159
+ # その作戦が未開放の場合は nil を返します。
160
+ def self.cleared_loop_counts(event_info_list, level, period = nil)
135
161
  # 指定されたレベルの情報のみ取り出し
136
- list = event_info_list.select{|info| info.level == level }
162
+ list = event_info_list.select{|info| info.level == level and info.period == period }
163
+
164
+ # その難易度および作戦のデータがない場合は nil
165
+ return nil if list.empty?
137
166
 
138
167
  # その周回をクリア済みかどうか
139
- cleared = EventInfoParser.all_cleared?(event_info_list, level)
168
+ cleared = EventInfoParser.all_cleared?(event_info_list, level, period)
140
169
 
141
170
  # 現在の周回数
142
171
  loop_count = list.map{|i| i.loop_count }.max
@@ -147,12 +176,13 @@ class EventInfoParser
147
176
  # 与えられたリストから、現在の周回でクリア済みのステージ No. を返します。
148
177
  # 丙 E-1 クリア済みの場合も、乙 E-1 クリア済みの場合も 1 を返します。
149
178
  # E-1 未クリアの場合は 0 を返します。
150
- def self.cleared_stage_no(event_info_list, level)
179
+ # その難易度または作戦が未開放の場合は 0 を返します。
180
+ def self.cleared_stage_no(event_info_list, level, period = nil)
151
181
  # その難易度が未開放の場合は、0 を返す
152
- return 0 unless EventInfoParser.opened?(event_info_list, level)
182
+ return 0 unless EventInfoParser.opened?(event_info_list, level, period)
153
183
 
154
184
  # 指定されたレベルの情報を、サブ海域番号の小さい順に取り出し
155
- list = event_info_list.select{|info| info.level == level}.sort_by {|info| info.area_sub_id }
185
+ list = event_info_list.select{|info| info.level == level and info.period == period }.sort_by {|info| info.area_sub_id }
156
186
 
157
187
  list.each_with_index do |info, prev_stage_no|
158
188
  return prev_stage_no if info.area_clear_state == 'NOTCLEAR'
@@ -164,12 +194,13 @@ class EventInfoParser
164
194
 
165
195
  # 与えられたリストから、攻略中のステージの海域ゲージの現在値を返します。
166
196
  # 全ステージクリア後、および掃討戦の場合は 0 を返します。
167
- def self.current_military_gauge_left(event_info_list, level)
197
+ # その難易度または作戦が未開放の場合は 0 を返します。
198
+ def self.current_military_gauge_left(event_info_list, level, period = nil)
168
199
  # 全ステージクリア後は 0 を返す
169
- return 0 if EventInfoParser.all_cleared?(event_info_list, level)
200
+ return 0 if EventInfoParser.all_cleared?(event_info_list, level, period)
170
201
 
171
202
  # 指定されたレベルの情報を、サブ海域番号の小さい順に取り出し
172
- list = event_info_list.select{|info| info.level == level}.sort_by {|info| info.area_sub_id }
203
+ list = event_info_list.select{|info| info.level == level and info.period == period }.sort_by {|info| info.area_sub_id }
173
204
 
174
205
  list.each do |info|
175
206
  if info.area_clear_state == 'NOTCLEAR' or info.area_clear_state == 'NOOPEN'
@@ -182,9 +213,9 @@ class EventInfoParser
182
213
  end
183
214
 
184
215
  # 与えられた難易度が解放済みの場合に true を返します。
185
- def self.opened?(event_info_list, level)
216
+ def self.opened?(event_info_list, level, period = nil)
186
217
  # 指定されたレベルの情報を、サブ海域番号の小さい順に取り出し
187
- list = event_info_list.select{|info| info.level == level}.sort_by {|info| info.area_sub_id }
218
+ list = event_info_list.select{|info| info.level == level and info.period == period }.sort_by {|info| info.area_sub_id }
188
219
 
189
220
  # その難易度のデータがなければ、未開放と見なす(通常は発生しない)
190
221
  return false if list.size == 0
@@ -197,11 +228,11 @@ class EventInfoParser
197
228
 
198
229
  # 与えられた難易度の全海域をクリア済みの場合に true を返します。
199
230
  # その難易度が解放済みで、かつ 'NOTCLEAR' の海域が存在しない場合はクリア済みとみなします。
200
- def self.all_cleared?(event_info_list, level)
201
- return false unless EventInfoParser.opened?(event_info_list, level)
231
+ def self.all_cleared?(event_info_list, level, period = nil)
232
+ return false unless EventInfoParser.opened?(event_info_list, level, period)
202
233
 
203
234
  # 指定されたレベルの情報を、サブ海域番号の小さい順に取り出し
204
- list = event_info_list.select{|info| info.level == level}.sort_by {|info| info.area_sub_id }
235
+ list = event_info_list.select{|info| info.level == level and info.period == period }.sort_by {|info| info.area_sub_id }
205
236
  list.select{|i| i.area_clear_state == 'NOTCLEAR' }.size == 0
206
237
  end
207
238
  end
@@ -25,7 +25,22 @@ class PersonalBasicInfoParser
25
25
  title_id: Integer,
26
26
  material_max: Integer,
27
27
  strategy_point: Integer,
28
- }
28
+ },
29
+ 3 => {
30
+ fuel: Integer,
31
+ ammo: Integer,
32
+ steel: Integer,
33
+ bauxite: Integer,
34
+ bucket: Integer,
35
+ level: Integer,
36
+ room_item_coin: Integer,
37
+ result_point: String,
38
+ rank: String,
39
+ title_id: Integer,
40
+ material_max: Integer,
41
+ strategy_point: Integer,
42
+ kou_medal: Integer,
43
+ },
29
44
  }
30
45
 
31
46
  OPTIONAL_KEYS = {
@@ -35,6 +50,9 @@ class PersonalBasicInfoParser
35
50
  },
36
51
  2 => {
37
52
  admiral_name: String,
53
+ },
54
+ 3 => {
55
+ admiral_name: String,
38
56
  }
39
57
  }
40
58
 
@@ -1,3 +1,3 @@
1
1
  module AdmiralStatsParser
2
- VERSION = "1.5.0"
2
+ VERSION = "1.7.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: admiral_stats_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masahiro Yoshizawa
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-01-14 00:00:00.000000000 Z
11
+ date: 2017-04-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -72,6 +72,7 @@ files:
72
72
  - bin/setup
73
73
  - lib/admiral_stats_parser.rb
74
74
  - lib/admiral_stats_parser/model/area_capture_info.rb
75
+ - lib/admiral_stats_parser/model/blueprint_list_info.rb
75
76
  - lib/admiral_stats_parser/model/character_list_info.rb
76
77
  - lib/admiral_stats_parser/model/equip_book_info.rb
77
78
  - lib/admiral_stats_parser/model/equip_list_info.rb
@@ -79,6 +80,7 @@ files:
79
80
  - lib/admiral_stats_parser/model/personal_basic_info.rb
80
81
  - lib/admiral_stats_parser/model/tc_book_info.rb
81
82
  - lib/admiral_stats_parser/parser/area_capture_info_parser.rb
83
+ - lib/admiral_stats_parser/parser/blueprint_list_info_parser.rb
82
84
  - lib/admiral_stats_parser/parser/character_list_info_parser.rb
83
85
  - lib/admiral_stats_parser/parser/equip_book_info_parser.rb
84
86
  - lib/admiral_stats_parser/parser/equip_list_info_parser.rb
@@ -106,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
108
  version: '0'
107
109
  requirements: []
108
110
  rubyforge_project:
109
- rubygems_version: 2.5.1
111
+ rubygems_version: 2.6.11
110
112
  signing_key:
111
113
  specification_version: 4
112
114
  summary: JSON data parser for kancolle-arcade.net