hive-stalker 0.2.0 → 0.3.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
  SHA256:
3
- metadata.gz: cd25f6be41759e222436358de85faa3b201b186de9284bb6e192046b4b8697c1
4
- data.tar.gz: b3be85cec70b83f55de5c90acc218023c306bb9b5ca83e5fbfa8f64b86316cc6
3
+ metadata.gz: 680174946cee915b68f32d6e6963e7634eee6d4ff233ce168fea839c2ce42f38
4
+ data.tar.gz: 62211fd3df968d77089d0c9f5ab6d0c42fa32312679b980b3978139e9dd09db9
5
5
  SHA512:
6
- metadata.gz: 5e1d711c97febf884a1464f08ce88cb17ea4b5409cbb3a809e1511cdac5e897d366b8ba97ac573766efbd778e8e21b93ea73d95dff7de1e0fa8383d26ad7d9d8
7
- data.tar.gz: c467cbb107f064722af5d4e3b99df616962e3ae2c5e99deed655e0459a5d6ed462a2c75ebd022190787343112139941b0ebf07d7fc03bbb65860b6112dfad890
6
+ metadata.gz: a8c520b55a9ca8b062ef38d2cf4e11c078927573f40bc15bb7651da3be6f73d9372c56639f358238adba54580f43c4b46e845b1a8b2a4c27dc6402454d180f52
7
+ data.tar.gz: 96eb5d47d0be3c0a5f8ba8b3ba83ea54c18fcb9d76de1deda87233f7bf6a88344e49341fc35a700e56a486da2cac913fea50686f14e5fa91a793d2994a17e903
@@ -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
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "hive-stalker"
7
- spec.version = '0.2.0'
7
+ spec.version = '0.3.0'
8
8
  spec.authors = ["Michael Senn"]
9
9
  spec.email = ["michael@morrolan.ch"]
10
10
 
@@ -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
- adagrad_sum: raw_data.fetch('adagrad_sum'),
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
- # Skill / ELO
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 = kwargs[:player_id]
80
- @steam_id = kwargs[:steam_id]
81
- @alias = kwargs[:alias]
82
- @score = kwargs[:score]
83
- @level = kwargs[:level]
84
- @experience = kwargs[:experience]
85
- @badges = kwargs[:badges]
86
- @skill = kwargs[:skill]
87
- @time_total = kwargs[:time_total]
88
- @time_marine = kwargs[:time_marine]
89
- @time_alien = kwargs[:time_alien]
90
- @time_commander = kwargs[:time_commander]
91
- @reinforced_tier = kwargs[:reinforced_tier]
92
- @adagrad_sum = kwargs[:adagrad_sum]
93
- @latitude = kwargs[:latitude]
94
- @longitude = kwargs[:longitude]
95
- @continent = kwargs[:continent]
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.2.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: 2019-03-04 00:00:00.000000000 Z
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.0.1
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: []