hive-stalker 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/hive-stalker.gemspec +1 -1
- data/lib/hive_stalker/client.rb +7 -1
- data/lib/hive_stalker/player_data.rb +133 -19
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 680174946cee915b68f32d6e6963e7634eee6d4ff233ce168fea839c2ce42f38
|
4
|
+
data.tar.gz: 62211fd3df968d77089d0c9f5ab6d0c42fa32312679b980b3978139e9dd09db9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8c520b55a9ca8b062ef38d2cf4e11c078927573f40bc15bb7651da3be6f73d9372c56639f358238adba54580f43c4b46e845b1a8b2a4c27dc6402454d180f52
|
7
|
+
data.tar.gz: 96eb5d47d0be3c0a5f8ba8b3ba83ea54c18fcb9d76de1deda87233f7bf6a88344e49341fc35a700e56a486da2cac913fea50686f14e5fa91a793d2994a17e903
|
data/CHANGELOG.md
CHANGED
@@ -19,6 +19,16 @@ glance - what to expact from upgrading to a new version.
|
|
19
19
|
### Removed
|
20
20
|
|
21
21
|
|
22
|
+
## [0.3.0] - 2020-11-01
|
23
|
+
|
24
|
+
### Added
|
25
|
+
|
26
|
+
- Support for per-team and per-position (field & commander) skill values
|
27
|
+
- Support for skill tiers
|
28
|
+
- `PlayerData#specific_skills` which returns a struct with such-computed values
|
29
|
+
- `PlayerData#specific_skill_tiers` which returns a struct with such-computed skill tiers
|
30
|
+
|
31
|
+
|
22
32
|
## [0.2.0] - 2019-03-04
|
23
33
|
|
24
34
|
### Added
|
data/hive-stalker.gemspec
CHANGED
data/lib/hive_stalker/client.rb
CHANGED
@@ -62,12 +62,18 @@ module HiveStalker
|
|
62
62
|
# normalization of skills, which happened shortly after Hive2 went
|
63
63
|
# live.
|
64
64
|
skill: raw_data.fetch('skill').to_i,
|
65
|
+
skill_offset: raw_data.fetch('skill_offset').to_i,
|
66
|
+
comm_skill: raw_data.fetch('comm_skill').to_i,
|
67
|
+
comm_skill_offset: raw_data.fetch('comm_skill_offset').to_i,
|
65
68
|
time_total: raw_data.fetch('time_played'),
|
66
69
|
time_marine: raw_data.fetch('marine_playtime'),
|
67
70
|
time_alien: raw_data.fetch('alien_playtime'),
|
68
71
|
time_commander: raw_data.fetch('commander_time'),
|
69
72
|
reinforced_tier: raw_data.fetch('reinforced_tier'),
|
70
|
-
|
73
|
+
# For accounts with no Hive2 rounds on record, the adagrad sum will be null.
|
74
|
+
adagrad_sum: raw_data.fetch('adagrad_sum') || 0,
|
75
|
+
# For people without a single comm round on record since Hive3, the comm adagrad sum might be null.
|
76
|
+
comm_adagrad_sum: raw_data.fetch('comm_adagrad_sum') || 0,
|
71
77
|
latitude: raw_data.fetch('lat', 0).to_f,
|
72
78
|
longitude: raw_data.fetch('long', 0).to_f,
|
73
79
|
continent: raw_data.fetch('cont', ''),
|
@@ -1,4 +1,11 @@
|
|
1
1
|
module HiveStalker
|
2
|
+
SpecificSkill = Struct.new(:alien, :marine)
|
3
|
+
TeamSkill = Struct.new(:field, :field_estimate, :commander, :commander_estimate)
|
4
|
+
|
5
|
+
SkillTier = Struct.new(:name, :rank)
|
6
|
+
SpecificSkillTier = Struct.new(:alien, :marine)
|
7
|
+
TeamSkillTier = Struct.new(:field, :commander)
|
8
|
+
|
2
9
|
# Container for various player statistics. Essentially a glorified struct.
|
3
10
|
class PlayerData
|
4
11
|
# Player ID, probably NS2/Hive2-internal.
|
@@ -29,10 +36,22 @@ module HiveStalker
|
|
29
36
|
# @return [Array]
|
30
37
|
attr_reader :badges
|
31
38
|
|
32
|
-
#
|
39
|
+
# Field skill / ELO base value
|
33
40
|
# @return [Fixnum]
|
34
41
|
attr_reader :skill
|
35
42
|
|
43
|
+
# Field skill / ELO offset
|
44
|
+
# @return [Fixnum]
|
45
|
+
attr_reader :skill_offset
|
46
|
+
|
47
|
+
# Comm skill / ELO base value
|
48
|
+
# @return [Fixnum]
|
49
|
+
attr_reader :commander_skill
|
50
|
+
|
51
|
+
# Comm skill / ELO offset
|
52
|
+
# @return [Fixnum]
|
53
|
+
attr_reader :commander_skill_offset
|
54
|
+
|
36
55
|
# Total time played in seconds.
|
37
56
|
#
|
38
57
|
# This equals {#time_marine} + {#time_alien}
|
@@ -55,10 +74,14 @@ module HiveStalker
|
|
55
74
|
# @return [NilClass]
|
56
75
|
attr_reader :reinforced_tier
|
57
76
|
|
58
|
-
# AdaGrad sum (https://en.wikipedia.org/wiki/Stochastic_gradient_descent#AdaGrad).
|
77
|
+
# Field AdaGrad sum (https://en.wikipedia.org/wiki/Stochastic_gradient_descent#AdaGrad).
|
59
78
|
# @return [Float]
|
60
79
|
attr_reader :adagrad_sum
|
61
80
|
|
81
|
+
# Comm AdaGrad sum (https://en.wikipedia.org/wiki/Stochastic_gradient_descent#AdaGrad).
|
82
|
+
# @return [Float]
|
83
|
+
attr_reader :commander_adagrad_sum
|
84
|
+
|
62
85
|
# Geographical latitude
|
63
86
|
# @return [Float]
|
64
87
|
attr_reader :latitude
|
@@ -76,23 +99,114 @@ module HiveStalker
|
|
76
99
|
# @param kwargs [Hash<Symbol, Object>] data with which to initialize the
|
77
100
|
# instance's attributes.
|
78
101
|
def initialize(**kwargs)
|
79
|
-
@player_id
|
80
|
-
@steam_id
|
81
|
-
@alias
|
82
|
-
@score
|
83
|
-
@level
|
84
|
-
@experience
|
85
|
-
@badges
|
86
|
-
@skill
|
87
|
-
@
|
88
|
-
@
|
89
|
-
@
|
90
|
-
@
|
91
|
-
@
|
92
|
-
@
|
93
|
-
@
|
94
|
-
@
|
95
|
-
@
|
102
|
+
@player_id = kwargs[:player_id]
|
103
|
+
@steam_id = kwargs[:steam_id]
|
104
|
+
@alias = kwargs[:alias]
|
105
|
+
@score = kwargs[:score]
|
106
|
+
@level = kwargs[:level]
|
107
|
+
@experience = kwargs[:experience]
|
108
|
+
@badges = kwargs[:badges]
|
109
|
+
@skill = kwargs[:skill]
|
110
|
+
@skill_offset = kwargs[:skill_offset]
|
111
|
+
@commander_skill = kwargs[:comm_skill]
|
112
|
+
@commander_skill_offset = kwargs[:comm_skill_offset]
|
113
|
+
@time_total = kwargs[:time_total]
|
114
|
+
@time_marine = kwargs[:time_marine]
|
115
|
+
@time_alien = kwargs[:time_alien]
|
116
|
+
@time_commander = kwargs[:time_commander]
|
117
|
+
@reinforced_tier = kwargs[:reinforced_tier]
|
118
|
+
@adagrad_sum = kwargs[:adagrad_sum]
|
119
|
+
@commander_adagrad_sum = kwargs[:comm_adagrad_sum]
|
120
|
+
@latitude = kwargs[:latitude]
|
121
|
+
@longitude = kwargs[:longitude]
|
122
|
+
@continent = kwargs[:continent]
|
123
|
+
end
|
124
|
+
|
125
|
+
# Returns per-team and per-position (field / commander) skills, including
|
126
|
+
# lower bounds for each.
|
127
|
+
def specific_skills
|
128
|
+
return SpecificSkill.new(
|
129
|
+
# Alien
|
130
|
+
TeamSkill.new(
|
131
|
+
# Field
|
132
|
+
[skill - skill_offset, 0].max,
|
133
|
+
skill_estimate(skill - skill_offset, adagrad_sum),
|
134
|
+
|
135
|
+
# Commander
|
136
|
+
[commander_skill - commander_skill_offset, 0].max,
|
137
|
+
skill_estimate(commander_skill - commander_skill_offset, commander_adagrad_sum),
|
138
|
+
),
|
139
|
+
|
140
|
+
# Marine
|
141
|
+
TeamSkill.new(
|
142
|
+
# Field
|
143
|
+
skill + skill_offset,
|
144
|
+
skill_estimate(skill + skill_offset, adagrad_sum),
|
145
|
+
|
146
|
+
# Commander
|
147
|
+
commander_skill + commander_skill_offset,
|
148
|
+
skill_estimate(commander_skill + commander_skill_offset, commander_adagrad_sum),
|
149
|
+
),
|
150
|
+
)
|
151
|
+
end
|
152
|
+
|
153
|
+
def specific_skill_tiers
|
154
|
+
skills = specific_skills
|
155
|
+
|
156
|
+
return SpecificSkillTier.new(
|
157
|
+
# Alien
|
158
|
+
TeamSkillTier.new(
|
159
|
+
# Field
|
160
|
+
skill_tier(skills.alien.field_estimate, level),
|
161
|
+
# Commander
|
162
|
+
skill_tier(skills.alien.commander_estimate, level),
|
163
|
+
),
|
164
|
+
|
165
|
+
# Marine
|
166
|
+
TeamSkillTier.new(
|
167
|
+
# Field
|
168
|
+
skill_tier(skills.marine.field_estimate, level),
|
169
|
+
# Commander
|
170
|
+
skill_tier(skills.marine.commander_estimate, level),
|
171
|
+
),
|
172
|
+
)
|
173
|
+
end
|
174
|
+
|
175
|
+
private
|
176
|
+
# Conservative estimate of a player's skill, using the sum of adagrad
|
177
|
+
# gradients. Works somewhat like a lower one-sided bound with indeterminate
|
178
|
+
# confidence.
|
179
|
+
def skill_estimate(skill_value, adagrad_sum_value)
|
180
|
+
# Use adagrad sum to get a lower bound for a player's skill.
|
181
|
+
[0, skill_value - 25 / Math.sqrt(adagrad_sum_value)].max
|
182
|
+
end
|
183
|
+
|
184
|
+
# Skill tier assignment based on skill estimate and level.
|
185
|
+
def skill_tier(skill_estimate, level)
|
186
|
+
if level < 20
|
187
|
+
SkillTier.new('Rookie', 0)
|
188
|
+
|
189
|
+
elsif skill_estimate < 301
|
190
|
+
SkillTier.new('Recruit', 1)
|
191
|
+
|
192
|
+
elsif skill_estimate < 751
|
193
|
+
SkillTier.new('Frontiersman', 2)
|
194
|
+
|
195
|
+
elsif skill_estimate < 1401
|
196
|
+
SkillTier.new('Squad Leader', 3)
|
197
|
+
|
198
|
+
elsif skill_estimate < 2101
|
199
|
+
SkillTier.new('Veteran', 4)
|
200
|
+
|
201
|
+
elsif skill_estimate < 2901
|
202
|
+
SkillTier.new('Commandant', 5)
|
203
|
+
|
204
|
+
elsif skill_estimate < 4101
|
205
|
+
SkillTier.new('Special Ops', 6)
|
206
|
+
|
207
|
+
else
|
208
|
+
SkillTier.new('Sanji Survivor', 7)
|
209
|
+
end
|
96
210
|
end
|
97
211
|
end
|
98
212
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hive-stalker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Senn
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-11-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: typhoeus
|
@@ -94,7 +94,7 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0.9'
|
97
|
-
description:
|
97
|
+
description:
|
98
98
|
email:
|
99
99
|
- michael@morrolan.ch
|
100
100
|
executables: []
|
@@ -124,7 +124,7 @@ homepage: https://bitbucket.org/Lavode/hivestalker
|
|
124
124
|
licenses:
|
125
125
|
- Apache-2.0
|
126
126
|
metadata: {}
|
127
|
-
post_install_message:
|
127
|
+
post_install_message:
|
128
128
|
rdoc_options: []
|
129
129
|
require_paths:
|
130
130
|
- lib
|
@@ -139,8 +139,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
139
|
- !ruby/object:Gem::Version
|
140
140
|
version: '0'
|
141
141
|
requirements: []
|
142
|
-
rubygems_version: 3.
|
143
|
-
signing_key:
|
142
|
+
rubygems_version: 3.1.4
|
143
|
+
signing_key:
|
144
144
|
specification_version: 4
|
145
145
|
summary: Binding to Natural Selection 2's Hive2 ELO system
|
146
146
|
test_files: []
|