hlockey 6 → 7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/data/election.json +6 -3
- data/data/infinileague.json +189 -0
- data/data/information.json +2 -1
- data/data/league.json +789 -731
- data/data/messages.json +46 -0
- data/data/previous_election_results.json +32 -39
- data/lib/hlockey/game/fight.rb +78 -29
- data/lib/hlockey/game/weather/chicken.rb +2 -1
- data/lib/hlockey/game/weather/incline.rb +2 -1
- data/lib/hlockey/game/weather/stars.rb +1 -1
- data/lib/hlockey/game/weather/sunset.rb +1 -3
- data/lib/hlockey/game/weather/waves.rb +7 -9
- data/lib/hlockey/game/weather/weatherable.rb +4 -4
- data/lib/hlockey/game.rb +156 -115
- data/lib/hlockey/league.rb +47 -27
- data/lib/hlockey/message.rb +23 -151
- data/lib/hlockey/mod/fencebuilder.rb +1 -2
- data/lib/hlockey/mod/fencedestroyer.rb +1 -1
- data/lib/hlockey/mod/handholding.rb +18 -16
- data/lib/hlockey/mod/immaterial.rb +7 -5
- data/lib/hlockey/mod/locked.rb +9 -3
- data/lib/hlockey/mod/moddable.rb +25 -4
- data/lib/hlockey/mod/powernapper.rb +11 -7
- data/lib/hlockey/mod/punchy.rb +6 -2
- data/lib/hlockey/selfdescribable.rb +1 -3
- data/lib/hlockey/team/player.rb +3 -0
- data/lib/hlockey/team.rb +3 -3
- data/lib/hlockey/utils.rb +36 -4
- data/lib/hlockey/version.rb +1 -1
- data/lib/hlockey.rb +15 -0
- metadata +6 -4
data/lib/hlockey/message.rb
CHANGED
@@ -1,24 +1,28 @@
|
|
1
|
-
require("hlockey/
|
1
|
+
require("hlockey/data")
|
2
|
+
require("hlockey/team")
|
2
3
|
|
3
4
|
module Hlockey
|
4
5
|
##
|
5
6
|
# Can be sent by a Game (in Game#stream) or a commonly used text
|
6
7
|
class Message
|
7
|
-
private_class_method(:new)
|
8
|
-
|
9
8
|
@colorize = ->(_color, string) { string }
|
10
9
|
|
11
10
|
# @return [Symbol] an action or event the message represents
|
12
11
|
attr_reader(:event)
|
13
12
|
|
14
13
|
# @param event [Symbol]
|
15
|
-
# @param
|
16
|
-
|
17
|
-
def initialize(event, fields, data)
|
18
|
-
self.class.attr_reader(*fields)
|
19
|
-
|
14
|
+
# @param data [Hash<Symbol => Object>] data for the message
|
15
|
+
def initialize(event, **data)
|
20
16
|
@event = event
|
21
|
-
|
17
|
+
@data = data
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_s(do_color: true)
|
21
|
+
return format(Data.messages[@event], **@data) unless do_color
|
22
|
+
|
23
|
+
colorized_data = @data.transform_values { self.class.color(_1, do_color:) }
|
24
|
+
|
25
|
+
format(Data.messages[@event], **colorized_data)
|
22
26
|
end
|
23
27
|
|
24
28
|
class << self
|
@@ -33,150 +37,18 @@ module Hlockey
|
|
33
37
|
# To control how this colors things, see #colorize=
|
34
38
|
# @param obj [Team, Team::Player, Team::Stadium]
|
35
39
|
# @return String
|
36
|
-
def color(obj)
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
%i[FaceOff winning_player new_puck_team],
|
47
|
-
%i[Hit puck_holder defender puck_taken new_puck_team shooting_chance],
|
48
|
-
%i[Pass sender receiver shooting_chance interceptor new_puck_team],
|
49
|
-
%i[ShootScore shooter home away home_score away_score audacity],
|
50
|
-
%i[ShootBlock shooter blocker puck_taken new_puck_team shooting_chance audacity],
|
51
|
-
%i[Partying player],
|
52
|
-
%i[FightStarted home_player away_player],
|
53
|
-
%i[FightAttack attacking_player defending_player blocked],
|
54
|
-
%i[PlayerJoinedFight player],
|
55
|
-
%i[FightEnded],
|
56
|
-
%i[MoraleChange team amount],
|
57
|
-
%i[ChickenedOut prev_player next_player],
|
58
|
-
%i[InclineFavors team],
|
59
|
-
%i[StarsAlign team],
|
60
|
-
%i[WavesWashedAway prev_player next_player],
|
61
|
-
%i[ImmaterialDodge player hitting_player],
|
62
|
-
# League alert messages
|
63
|
-
%i[SeasonChampion team]
|
64
|
-
].each do |event, *fields|
|
65
|
-
define_method(event) { |*data| new(event, fields, data) }
|
66
|
-
end
|
67
|
-
|
68
|
-
# These are messages used elsewhere
|
69
|
-
|
70
|
-
def SeasonDay(day) = "Season #{VERSION} day #{day}"
|
71
|
-
|
72
|
-
def SeasonStarts(time) =
|
73
|
-
time.strftime("Season #{VERSION} starts at %H:%M, %A, %B %d (%Z).")
|
74
|
-
|
75
|
-
def NoGames =
|
76
|
-
"no games right now. it is the offseason. join the Hlockey Discord for updates"
|
77
|
-
end
|
78
|
-
|
79
|
-
def to_s(do_color: true)
|
80
|
-
c = -> { color(_1, do_color:) }
|
81
|
-
|
82
|
-
case @event
|
83
|
-
when :StartOfGame
|
84
|
-
"Hocky!"
|
85
|
-
when :EndOfGame
|
86
|
-
"Game over.\n#{c.call(@winning_team)} win!"
|
87
|
-
when :StartOfPeriod
|
88
|
-
"Start#{of_period}"
|
89
|
-
when :EndOfPeriod
|
90
|
-
"End#{of_period}#{score(do_color:)}"
|
91
|
-
when :FaceOff
|
92
|
-
"#{c.call(@winning_player)} wins the faceoff!#{possession_change(do_color:)}"
|
93
|
-
when :Hit
|
94
|
-
str = "#{c.call(@defender)} hits #{c.call(@puck_holder)}"
|
95
|
-
str += takes(do_color:) + score_chance if @puck_taken
|
96
|
-
str
|
97
|
-
when :Pass
|
98
|
-
str = "#{c.call(@sender)} passes to #{c.call(@receiver)}."
|
99
|
-
unless @interceptor.nil?
|
100
|
-
str += "..\nIntercepted by #{c.call(@interceptor)}!" +
|
101
|
-
possession_change(do_color:)
|
40
|
+
def color(obj, do_color: true)
|
41
|
+
return obj.to_s unless do_color
|
42
|
+
|
43
|
+
case obj
|
44
|
+
when Team
|
45
|
+
@colorize.call(obj.color, obj.to_s)
|
46
|
+
when Team::Player, Team::Stadium
|
47
|
+
@colorize.call(obj.team.color, obj.to_s)
|
48
|
+
else
|
49
|
+
obj.to_s
|
102
50
|
end
|
103
|
-
str += score_chance
|
104
|
-
str
|
105
|
-
when :ShootScore
|
106
|
-
"#{shot(do_color:)} and scores!#{score(do_color:)}"
|
107
|
-
when :ShootBlock
|
108
|
-
"#{shot(do_color:)}...\n#{c.call(@blocker)} blocks the shot" +
|
109
|
-
takes(do_color:) + score_chance
|
110
|
-
when :Partying
|
111
|
-
"#{c.call(@player)} is partying!"
|
112
|
-
when :FightStarted
|
113
|
-
"#{c.call(@home_player)} and #{c.call(@away_player)} " \
|
114
|
-
"start fighting!"
|
115
|
-
when :FightAttack
|
116
|
-
def_player = c.call(@defending_player)
|
117
|
-
str = "#{c.call(@attacking_player)} punches #{def_player}!"
|
118
|
-
str += "\n#{def_player} blocks the punch!" if @blocked
|
119
|
-
str
|
120
|
-
when :PlayerJoinedFight
|
121
|
-
"#{c.call(@player)} from #{c.call(@player.team)} joins the fight!"
|
122
|
-
when :FightEnded
|
123
|
-
"The fight has ended."
|
124
|
-
when :MoraleChange
|
125
|
-
"#{c.call(@team)} #{@amount.negative? ? "loses" : "gains"} #{@amount.abs} morale."
|
126
|
-
when :ChickenedOut
|
127
|
-
"#{c.call(@prev_player)} chickened out!#{replaces("game", do_color:)}"
|
128
|
-
when :InclineFavors
|
129
|
-
"The incline favors #{c.call(@team)}."
|
130
|
-
when :StarsAlign
|
131
|
-
"The stars align for #{c.call(@team)}. They get half a goal."
|
132
|
-
when :WavesWashedAway
|
133
|
-
"#{c.call(@prev_player)} is washed away by the waves...#{replaces(do_color:)}"
|
134
|
-
when :ImmaterialDodge
|
135
|
-
"#{c.call(@hitting_player)} goes right through #{c.call(@player)}!"
|
136
|
-
when :SeasonChampion
|
137
|
-
"Your season #{VERSION} champions are the #{c.call(@team)}!"
|
138
51
|
end
|
139
52
|
end
|
140
|
-
|
141
|
-
private
|
142
|
-
|
143
|
-
def color(obj, do_color: true) = do_color ? self.class.color(obj) : obj.to_s
|
144
|
-
|
145
|
-
def score_chance
|
146
|
-
return "" if @shooting_chance.nil?
|
147
|
-
|
148
|
-
chance_str = case @shooting_chance
|
149
|
-
when 0..2
|
150
|
-
"none"
|
151
|
-
when 3, 4
|
152
|
-
"low"
|
153
|
-
when 5, 6
|
154
|
-
"medium"
|
155
|
-
else
|
156
|
-
"high"
|
157
|
-
end
|
158
|
-
"\nChance of scoring: #{chance_str} (#{@shooting_chance})"
|
159
|
-
end
|
160
|
-
|
161
|
-
def of_period = " of period #{@period}."
|
162
|
-
|
163
|
-
def score(do_color: true) =
|
164
|
-
"\n#{color(@home, do_color:)} #{@home_score.round(2)}, " \
|
165
|
-
"#{color(@away, do_color:)} #{@away_score.round(2)}"
|
166
|
-
|
167
|
-
def shot(do_color: true) =
|
168
|
-
"#{color(@shooter, do_color:)} takes a#{"n audacious" if @audacity} shot"
|
169
|
-
|
170
|
-
def takes(do_color: true) =
|
171
|
-
@puck_taken ? " and takes the puck!#{possession_change(do_color:)}" : "!"
|
172
|
-
|
173
|
-
def possession_change(do_color: true) =
|
174
|
-
"\n#{color(@new_puck_team, do_color:)} have possession."
|
175
|
-
|
176
|
-
def replaces(period = nil, do_color: true)
|
177
|
-
str = "\n#{color(@next_player, do_color:)} replaces them"
|
178
|
-
str += " for the rest of the #{period}." unless period.nil?
|
179
|
-
str
|
180
|
-
end
|
181
53
|
end
|
182
54
|
end
|
@@ -18,38 +18,40 @@ module Hlockey
|
|
18
18
|
|
19
19
|
def to_data = [to_s, @other_player.to_s]
|
20
20
|
|
21
|
-
def on_swap(into_roster, pos, _prev_pos
|
21
|
+
def on_swap(into_roster, pos, _prev_pos)
|
22
22
|
unless @other_player.is_a?(Team::Player)
|
23
23
|
@other_player = @team.players.find { _1.name == @other_player }
|
24
24
|
end
|
25
25
|
|
26
|
+
swap_player = nil
|
26
27
|
if into_roster
|
27
28
|
prev_pos = @team.shadows.index(@other_player)
|
28
29
|
return if prev_pos.nil?
|
29
30
|
|
30
|
-
|
31
|
+
swap_pos = sample_with_deleted(@team.roster.keys, pos)
|
32
|
+
swap_player = @team.roster[swap_pos]
|
31
33
|
|
32
|
-
@team.shadows[prev_pos] =
|
33
|
-
@team.roster[
|
34
|
-
|
35
|
-
|
34
|
+
@team.shadows[prev_pos] = swap_player
|
35
|
+
@team.roster[swap_pos] = @other_player
|
36
|
+
else
|
37
|
+
prev_pos = @team.roster.key(@other_player)
|
38
|
+
return if prev_pos.nil?
|
36
39
|
|
37
|
-
|
38
|
-
|
40
|
+
swap_pos = sample_with_deleted(@team.shadows.each_index.to_a, pos)
|
41
|
+
swap_player = @team.shadows[swap_pos]
|
39
42
|
|
40
|
-
|
43
|
+
@team.roster[prev_pos] = swap_player
|
44
|
+
@team.shadows[swap_pos] = @other_player
|
45
|
+
end
|
41
46
|
|
42
|
-
|
43
|
-
|
47
|
+
send_game_message(:mod_handholding_event,
|
48
|
+
player: @player, other_player: @other_player, swap_player:)
|
44
49
|
end
|
45
50
|
|
46
51
|
private
|
47
52
|
|
48
|
-
|
49
|
-
|
50
|
-
array.delete(object)
|
51
|
-
array
|
52
|
-
end
|
53
|
+
def sample_with_deleted(array, object) =
|
54
|
+
array.tap { _1.delete(object) }.sample(random: prng)
|
53
55
|
end
|
54
56
|
end
|
55
57
|
end
|
@@ -11,15 +11,17 @@ module Hlockey
|
|
11
11
|
|
12
12
|
DESCRIPTION = "This player may be a hallucination.".freeze
|
13
13
|
|
14
|
-
def on_got_hit(
|
15
|
-
return if
|
14
|
+
def on_got_hit(hitting_player)
|
15
|
+
return false if prng.rand(3).zero?
|
16
16
|
|
17
|
-
if game.pre_tmp_change_stats[@player].nil?
|
18
|
-
game.pre_tmp_change_stats[@player] = @player.stats.clone
|
17
|
+
if @game.pre_tmp_change_stats[@player].nil?
|
18
|
+
@game.pre_tmp_change_stats[@player] = @player.stats.clone
|
19
19
|
end
|
20
20
|
@player.stats[:defense] += 0.5
|
21
21
|
|
22
|
-
|
22
|
+
send_game_message(:mod_immaterial_event, hitting_player:, player: @player)
|
23
|
+
|
24
|
+
true # Other player shouldn't take puck
|
23
25
|
end
|
24
26
|
end
|
25
27
|
end
|
data/lib/hlockey/mod/locked.rb
CHANGED
@@ -9,14 +9,20 @@ module Hlockey
|
|
9
9
|
|
10
10
|
DESCRIPTION = "This player can not swap positions.".freeze
|
11
11
|
|
12
|
-
def on_swap(into_roster, pos, prev_pos
|
12
|
+
def on_swap(into_roster, pos, prev_pos)
|
13
|
+
swap_player = nil
|
13
14
|
if into_roster
|
14
|
-
|
15
|
+
swap_player = @team.shadows[prev_pos]
|
16
|
+
@team.roster[pos] = swap_player
|
15
17
|
@team.shadows[prev_pos] = @player
|
16
18
|
else
|
17
|
-
|
19
|
+
swap_player = @team.roster[prev_pos]
|
20
|
+
@team.shadows[pos] = swap_player
|
18
21
|
@team.roster[prev_pos] = @player
|
19
22
|
end
|
23
|
+
|
24
|
+
send_game_message(:mod_locked_event, player: @player, swap_player:)
|
25
|
+
end
|
20
26
|
end
|
21
27
|
end
|
22
28
|
end
|
data/lib/hlockey/mod/moddable.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require("hlockey/message")
|
1
2
|
require("hlockey/selfdescribable")
|
2
3
|
|
3
4
|
module Hlockey
|
@@ -8,6 +9,8 @@ module Hlockey
|
|
8
9
|
module Moddable
|
9
10
|
include(SelfDescribable)
|
10
11
|
|
12
|
+
attr_writer(:game)
|
13
|
+
|
11
14
|
DESCRIPTION = "A mod with no description.".freeze # Default description
|
12
15
|
|
13
16
|
# If the mod has no extra parameters, same as #to_s
|
@@ -22,16 +25,28 @@ module Hlockey
|
|
22
25
|
@team = player.team
|
23
26
|
end
|
24
27
|
|
25
|
-
def on_swap(into_roster, pos, prev_pos
|
28
|
+
def on_swap(into_roster, pos, prev_pos) end
|
26
29
|
|
27
|
-
def on_action(
|
30
|
+
def on_action() end
|
28
31
|
|
29
|
-
|
32
|
+
# May return truthy value to signal that hitting player should not try to take puck
|
33
|
+
def on_got_hit(hitting_player) end
|
30
34
|
|
35
|
+
# May return a different player to join the fight instead of this one
|
31
36
|
def on_join_fight() end
|
32
37
|
|
33
38
|
private
|
34
39
|
|
40
|
+
# Makes a new message from params, adds it to the game stream if there is a game
|
41
|
+
def send_game_message(...)
|
42
|
+
@game.stream << Message.new(...) unless @game.nil?
|
43
|
+
end
|
44
|
+
|
45
|
+
# Handles the on_swap event for Fencebuilder, Fencedestroyer mods
|
46
|
+
# @param into_roster [Boolean]
|
47
|
+
# @param pos [Symbol]
|
48
|
+
# @param prev_pos [Symbol]
|
49
|
+
# @param type [:builder | :destroyer]
|
35
50
|
def fence_swap(into_roster, pos, prev_pos, type: :builder)
|
36
51
|
return unless into_roster
|
37
52
|
|
@@ -40,10 +55,16 @@ module Hlockey
|
|
40
55
|
new_pos = new_pos_hash[pos]
|
41
56
|
return if new_pos.nil?
|
42
57
|
|
58
|
+
swap_player = @team.roster[new_pos]
|
43
59
|
@team.roster[pos] = @team.shadows[prev_pos]
|
44
|
-
@team.shadows[prev_pos] =
|
60
|
+
@team.shadows[prev_pos] = swap_player
|
45
61
|
@team.roster[new_pos] = @player
|
62
|
+
|
63
|
+
send_game_message(:mod_fence_event, type:, player: @player, swap_player:)
|
46
64
|
end
|
65
|
+
|
66
|
+
# @return [Utils::Rng, Random] the object to use for RNG
|
67
|
+
def prng = @game&.prng || Random.new
|
47
68
|
end
|
48
69
|
end
|
49
70
|
end
|
@@ -4,7 +4,8 @@ require("hlockey/actions")
|
|
4
4
|
module Hlockey
|
5
5
|
module Mod
|
6
6
|
##
|
7
|
-
# Player has James stats added to their own at random
|
7
|
+
# Player has James stats added to their own at random for 5 actions
|
8
|
+
# These 5 actions carry over between games
|
8
9
|
class Powernapper
|
9
10
|
include(Moddable)
|
10
11
|
include(Actions)
|
@@ -16,30 +17,33 @@ module Hlockey
|
|
16
17
|
@currently_boosted_for = -1
|
17
18
|
end
|
18
19
|
|
19
|
-
def on_action
|
20
|
+
def on_action
|
20
21
|
if @currently_boosted_for.negative?
|
21
|
-
return unless random_event_occurs?(prng:
|
22
|
+
return unless random_event_occurs?(prng:)
|
22
23
|
|
23
|
-
change_stats
|
24
|
+
change_stats
|
24
25
|
end
|
25
26
|
@currently_boosted_for += 1
|
26
27
|
return if @currently_boosted_for < 5
|
27
28
|
|
28
|
-
change_stats(
|
29
|
+
change_stats(reset: true)
|
29
30
|
@currently_boosted_for = -1
|
30
31
|
end
|
31
32
|
|
32
33
|
private
|
33
34
|
|
34
|
-
def change_stats(
|
35
|
+
def change_stats(reset: false)
|
35
36
|
stat_change = { offense: 0.5, defense: 1.0 } # James stats (excluding 0 agility)
|
36
37
|
stat_change.transform_values!(&:-@) if reset
|
37
38
|
|
38
|
-
pre_tmp_change_stats = game.pre_tmp_change_stats[@player]
|
39
|
+
pre_tmp_change_stats = @game.pre_tmp_change_stats[@player]
|
39
40
|
stat_change.each do |stat, change|
|
40
41
|
@player.stats[stat] += change
|
41
42
|
pre_tmp_change_stats[stat] += change unless pre_tmp_change_stats.nil?
|
42
43
|
end
|
44
|
+
|
45
|
+
send_game_message(reset ? :mod_powernap_end : :mod_powernap_start,
|
46
|
+
player: @player)
|
43
47
|
end
|
44
48
|
end
|
45
49
|
end
|
data/lib/hlockey/mod/punchy.rb
CHANGED
@@ -10,8 +10,12 @@ module Hlockey
|
|
10
10
|
|
11
11
|
DESCRIPTION = "This player may randomly start fights.".freeze
|
12
12
|
|
13
|
-
def on_action
|
14
|
-
random_event_occurs?(prng:
|
13
|
+
def on_action
|
14
|
+
return unless random_event_occurs?(prng:)
|
15
|
+
|
16
|
+
send_game_message(:mod_punchy_event, player: @player)
|
17
|
+
@game.start_fight(@player)
|
18
|
+
end
|
15
19
|
end
|
16
20
|
end
|
17
21
|
end
|
data/lib/hlockey/team/player.rb
CHANGED
@@ -47,7 +47,10 @@ module Hlockey
|
|
47
47
|
@stats.transform_values { _1.round(2).to_s.ljust(4, "0") }
|
48
48
|
)
|
49
49
|
|
50
|
+
# Calls a method on every mod this player has
|
50
51
|
# @param action [Symbol] method to call on each mod
|
52
|
+
# @param *args [Object] any arguments to pass to the mods
|
53
|
+
# @return [Object] the first non-nil return value given from a mod, if any
|
51
54
|
def mods_do(action, *args)
|
52
55
|
res = nil
|
53
56
|
@mods.each { res ||= _1.send(action, *args) }
|
data/lib/hlockey/team.rb
CHANGED
@@ -28,8 +28,8 @@ module Hlockey
|
|
28
28
|
|
29
29
|
@stadium = Stadium.new(team: self, **stadium)
|
30
30
|
|
31
|
-
@roster = roster.transform_values { Player.new(team: self
|
32
|
-
@shadows = shadows.map { Player.new(team: self
|
31
|
+
@roster = roster.transform_values { Player.new(**_1, team: self) }
|
32
|
+
@shadows = shadows.map { Player.new(**_1, team: self) }
|
33
33
|
|
34
34
|
@status = :in_contention
|
35
35
|
@wins = @losses = 0
|
@@ -70,7 +70,7 @@ module Hlockey
|
|
70
70
|
|
71
71
|
# @return [Symbol] the position of the worst player on the roster
|
72
72
|
def worst_player_pos =
|
73
|
-
@roster.transform_values {
|
73
|
+
@roster.transform_values { |v| v.stats.values.sum }.min_by { |_, v| v }.first
|
74
74
|
|
75
75
|
# @return [Hash<String => Player>] #roster, but with keys better for displaying
|
76
76
|
def roster_display = @roster.transform_keys(&self.class.method(:pos_name))
|
data/lib/hlockey/utils.rb
CHANGED
@@ -1,13 +1,45 @@
|
|
1
1
|
module Hlockey
|
2
2
|
##
|
3
|
-
#
|
3
|
+
# Utilities to help with various Hlockey related tasks
|
4
4
|
module Utils
|
5
|
+
##
|
6
|
+
# Lehmer random number generator,
|
7
|
+
# to avoid incompatabilities in RNG between Ruby implementations.
|
8
|
+
# From https://en.wikipedia.org/wiki/Lehmer_random_number_generator#Sample_C99_code.
|
9
|
+
class Rng
|
10
|
+
MOD_VAL = 0x7fffffff
|
11
|
+
|
12
|
+
# @return [Integer]
|
13
|
+
attr_reader(:state)
|
14
|
+
|
15
|
+
# @param seed [Integer]
|
16
|
+
def initialize(seed)
|
17
|
+
seed = seed.zero? ? 1 : seed.abs
|
18
|
+
seed %= MOD_VAL if seed >= MOD_VAL
|
19
|
+
|
20
|
+
@state = seed
|
21
|
+
end
|
22
|
+
|
23
|
+
# @param upper_bound [Numeric, Range, nil] max value from RNG
|
24
|
+
# @return [Numeric]
|
25
|
+
def rand(bound = nil)
|
26
|
+
if bound.is_a?(Range)
|
27
|
+
start = bound.begin || 0
|
28
|
+
return rand(bound.end.nil? ? nil : bound.end - start) + start
|
29
|
+
end
|
30
|
+
|
31
|
+
@state = @state * 48_271 % MOD_VAL
|
32
|
+
return @state if bound.nil? || bound.zero?
|
33
|
+
|
34
|
+
@state % bound
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
5
38
|
# Transforms hash keys to be better for displaying the information in the hash
|
6
39
|
# @param hash [Hash<#to_s => Object>]
|
7
40
|
# @return [Hash<String => Object>] the new hash
|
8
|
-
def self.hash_display_keys(hash)
|
9
|
-
hash.transform_keys { |key| key.to_s.capitalize.gsub("_", " ") }
|
10
|
-
end
|
41
|
+
def self.hash_display_keys(hash) =
|
42
|
+
hash.transform_keys { |key| key.to_s.capitalize.gsub("_", " ") }.compact
|
11
43
|
|
12
44
|
# Does a weighted random with a hash,
|
13
45
|
# where the keys are elements being randomly selected and the values are the weights
|
data/lib/hlockey/version.rb
CHANGED
data/lib/hlockey.rb
CHANGED
@@ -1 +1,16 @@
|
|
1
1
|
require("hlockey/league")
|
2
|
+
|
3
|
+
##
|
4
|
+
# All Hlockey library code lives here.
|
5
|
+
module Hlockey
|
6
|
+
# @return [League]
|
7
|
+
def self.new_current_league
|
8
|
+
league_hash = Data.league
|
9
|
+
league_start_time = Time.utc(*league_hash[:start_time])
|
10
|
+
one_week = 604_800 # In seconds, to add/subtract with Time objects
|
11
|
+
|
12
|
+
return League.new(**Data.infinileague) if Time.now < league_start_time - one_week
|
13
|
+
|
14
|
+
League.new(**league_hash)
|
15
|
+
end
|
16
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hlockey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '
|
4
|
+
version: '7'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lavender Perry
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-05-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -31,9 +31,11 @@ extensions: []
|
|
31
31
|
extra_rdoc_files: []
|
32
32
|
files:
|
33
33
|
- data/election.json
|
34
|
+
- data/infinileague.json
|
34
35
|
- data/information.json
|
35
36
|
- data/league.json
|
36
37
|
- data/links.json
|
38
|
+
- data/messages.json
|
37
39
|
- data/previous_election_results.json
|
38
40
|
- lib/hlockey.rb
|
39
41
|
- lib/hlockey/actions.rb
|
@@ -87,8 +89,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
89
|
- !ruby/object:Gem::Version
|
88
90
|
version: '0'
|
89
91
|
requirements: []
|
90
|
-
rubygems_version: 3.
|
92
|
+
rubygems_version: 3.5.9
|
91
93
|
signing_key:
|
92
94
|
specification_version: 4
|
93
|
-
summary: Hlockey season
|
95
|
+
summary: Hlockey season 7.
|
94
96
|
test_files: []
|