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 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: []