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 +4 -4
- data/.travis.yml +4 -1
- data/README.md +21 -18
- data/lib/admiral_stats_parser.rb +43 -16
- data/lib/admiral_stats_parser/model/area_capture_info.rb +17 -46
- data/lib/admiral_stats_parser/model/blueprint_list_info.rb +40 -0
- data/lib/admiral_stats_parser/model/character_list_info.rb +3 -0
- data/lib/admiral_stats_parser/model/equip_list_info.rb +8 -17
- data/lib/admiral_stats_parser/model/event_info.rb +10 -48
- data/lib/admiral_stats_parser/model/personal_basic_info.rb +2 -21
- data/lib/admiral_stats_parser/parser/area_capture_info_parser.rb +99 -30
- data/lib/admiral_stats_parser/parser/blueprint_list_info_parser.rb +88 -0
- data/lib/admiral_stats_parser/parser/character_list_info_parser.rb +24 -1
- data/lib/admiral_stats_parser/parser/event_info_parser.rb +48 -17
- data/lib/admiral_stats_parser/parser/personal_basic_info_parser.rb +19 -1
- data/lib/admiral_stats_parser/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: da1d3ff4a8d20f013e58c619f48d3f7953d407d1
|
|
4
|
+
data.tar.gz: 84a8217dc2bfc9519209eebd3d3e37c0278e5f95
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
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
|
-
[](https://gitter.im/muziyoshiz/admiral_stats?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
|
3
|
+
[](https://travis-ci.org/muziyoshiz/admiral_stats_parser) [](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
|
-
|
|
|
65
|
-
|
|
66
|
-
|
|
|
67
|
-
|
|
|
68
|
-
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
|
74
|
-
|
|
|
75
|
-
|
|
|
76
|
-
|
|
77
|
-
|
|
|
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
|
|
data/lib/admiral_stats_parser.rb
CHANGED
|
@@ -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
|
|
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..
|
|
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..
|
|
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..
|
|
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..
|
|
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..
|
|
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..
|
|
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..
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
98
|
-
return "#{@area_id}-#{@area_sub_id}" unless AREA_SUB_NAMES.include?(@area_id)
|
|
70
|
+
# 海域ゲージの現在値
|
|
71
|
+
attr_accessor :military_gauge_left
|
|
99
72
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
|
@@ -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
|
-
#
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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-
|
|
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.
|
|
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
|