admiral_stats_parser 1.5.0 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
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