hlockey 5 → 7

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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/data/election.json +23 -0
  3. data/data/infinileague.json +189 -0
  4. data/data/information.json +6 -0
  5. data/data/league.json +2042 -0
  6. data/data/links.json +5 -0
  7. data/data/messages.json +46 -0
  8. data/data/previous_election_results.json +91 -0
  9. data/lib/hlockey/actions.rb +22 -0
  10. data/lib/hlockey/data.rb +6 -5
  11. data/lib/hlockey/game/fight.rb +100 -40
  12. data/lib/hlockey/game/weather/audacity.rb +1 -1
  13. data/lib/hlockey/game/weather/chicken.rb +3 -2
  14. data/lib/hlockey/game/weather/incline.rb +2 -1
  15. data/lib/hlockey/game/weather/stars.rb +1 -1
  16. data/lib/hlockey/game/weather/sunset.rb +2 -4
  17. data/lib/hlockey/game/weather/waves.rb +9 -5
  18. data/lib/hlockey/game/weather/weatherable.rb +9 -9
  19. data/lib/hlockey/game.rb +182 -116
  20. data/lib/hlockey/league.rb +90 -73
  21. data/lib/hlockey/message.rb +23 -153
  22. data/lib/hlockey/mod/fencebuilder.rb +15 -0
  23. data/lib/hlockey/mod/fencedestroyer.rb +16 -0
  24. data/lib/hlockey/mod/handholding.rb +57 -0
  25. data/lib/hlockey/mod/immaterial.rb +28 -0
  26. data/lib/hlockey/mod/locked.rb +28 -0
  27. data/lib/hlockey/mod/moddable.rb +70 -0
  28. data/lib/hlockey/mod/nonconfrontational.rb +17 -0
  29. data/lib/hlockey/mod/powernapper.rb +50 -0
  30. data/lib/hlockey/mod/punchy.rb +21 -0
  31. data/lib/hlockey/mod.rb +25 -0
  32. data/lib/hlockey/selfdescribable.rb +7 -0
  33. data/lib/hlockey/team/player.rb +40 -58
  34. data/lib/hlockey/team/stadium.rb +10 -7
  35. data/lib/hlockey/team.rb +56 -41
  36. data/lib/hlockey/utils.rb +36 -4
  37. data/lib/hlockey/version.rb +1 -1
  38. data/lib/hlockey.rb +15 -0
  39. metadata +30 -18
  40. data/data/election.yaml +0 -21
  41. data/data/external/names.txt +0 -19948
  42. data/data/information.yaml +0 -24
  43. data/data/league.yaml +0 -1694
  44. data/data/links.yaml +0 -3
  45. data/data/previous_election_results.yaml +0 -65
  46. data/lib/hlockey/game/actions.rb +0 -24
@@ -0,0 +1,70 @@
1
+ require("hlockey/message")
2
+ require("hlockey/selfdescribable")
3
+
4
+ module Hlockey
5
+ module Mod
6
+ ##
7
+ # Module with needed methods for mods, that every mod includes
8
+ # All methods starting with "on" represent player events
9
+ module Moddable
10
+ include(SelfDescribable)
11
+
12
+ attr_writer(:game)
13
+
14
+ DESCRIPTION = "A mod with no description.".freeze # Default description
15
+
16
+ # If the mod has no extra parameters, same as #to_s
17
+ # If it has extra parameters, returns an array with #to_s as the first element,
18
+ # and the other parameters as the rest of the elements.
19
+ # Mods that accept parameters should implement the array version themselves,
20
+ # as in the module here it is simply an alias.
21
+ alias to_data to_s
22
+
23
+ def initialize(player)
24
+ @player = player
25
+ @team = player.team
26
+ end
27
+
28
+ def on_swap(into_roster, pos, prev_pos) end
29
+
30
+ def on_action() end
31
+
32
+ # May return truthy value to signal that hitting player should not try to take puck
33
+ def on_got_hit(hitting_player) end
34
+
35
+ # May return a different player to join the fight instead of this one
36
+ def on_join_fight() end
37
+
38
+ private
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]
50
+ def fence_swap(into_roster, pos, prev_pos, type: :builder)
51
+ return unless into_roster
52
+
53
+ new_pos_hash = { ldef: :lwing, goalie: :center, rdef: :rwing }
54
+ new_pos_hash = new_pos_hash.invert unless type == :builder
55
+ new_pos = new_pos_hash[pos]
56
+ return if new_pos.nil?
57
+
58
+ swap_player = @team.roster[new_pos]
59
+ @team.roster[pos] = @team.shadows[prev_pos]
60
+ @team.shadows[prev_pos] = swap_player
61
+ @team.roster[new_pos] = @player
62
+
63
+ send_game_message(:mod_fence_event, type:, player: @player, swap_player:)
64
+ end
65
+
66
+ # @return [Utils::Rng, Random] the object to use for RNG
67
+ def prng = @game&.prng || Random.new
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,17 @@
1
+ require("hlockey/mod/moddable")
2
+
3
+ module Hlockey
4
+ module Mod
5
+ ##
6
+ # The first player in the shadows will join fights instead of this player,
7
+ # if they do not also have the mod.
8
+ class Nonconfrontational
9
+ include(Moddable)
10
+
11
+ DESCRIPTION = "This player tries to avoid fights.".freeze
12
+
13
+ def on_join_fight =
14
+ @team.shadows.select { |player| player.mods.none? { _1.is_a?(self.class) } }.first
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,50 @@
1
+ require("hlockey/mod/moddable")
2
+ require("hlockey/actions")
3
+
4
+ module Hlockey
5
+ module Mod
6
+ ##
7
+ # Player has James stats added to their own at random for 5 actions
8
+ # These 5 actions carry over between games
9
+ class Powernapper
10
+ include(Moddable)
11
+ include(Actions)
12
+
13
+ DESCRIPTION = "This player gets temporary stat boosts by powernapping.".freeze
14
+
15
+ def initialize(player)
16
+ super
17
+ @currently_boosted_for = -1
18
+ end
19
+
20
+ def on_action
21
+ if @currently_boosted_for.negative?
22
+ return unless random_event_occurs?(prng:)
23
+
24
+ change_stats
25
+ end
26
+ @currently_boosted_for += 1
27
+ return if @currently_boosted_for < 5
28
+
29
+ change_stats(reset: true)
30
+ @currently_boosted_for = -1
31
+ end
32
+
33
+ private
34
+
35
+ def change_stats(reset: false)
36
+ stat_change = { offense: 0.5, defense: 1.0 } # James stats (excluding 0 agility)
37
+ stat_change.transform_values!(&:-@) if reset
38
+
39
+ pre_tmp_change_stats = @game.pre_tmp_change_stats[@player]
40
+ stat_change.each do |stat, change|
41
+ @player.stats[stat] += change
42
+ pre_tmp_change_stats[stat] += change unless pre_tmp_change_stats.nil?
43
+ end
44
+
45
+ send_game_message(reset ? :mod_powernap_end : :mod_powernap_start,
46
+ player: @player)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,21 @@
1
+ require("hlockey/mod/moddable")
2
+
3
+ module Hlockey
4
+ module Mod
5
+ ##
6
+ # Player can get into a fight at any time
7
+ class Punchy
8
+ include(Moddable)
9
+ include(Actions)
10
+
11
+ DESCRIPTION = "This player may randomly start fights.".freeze
12
+
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
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,25 @@
1
+ require("hlockey/mod/fencebuilder")
2
+ require("hlockey/mod/fencedestroyer")
3
+ require("hlockey/mod/handholding")
4
+ require("hlockey/mod/immaterial")
5
+ require("hlockey/mod/locked")
6
+ require("hlockey/mod/powernapper")
7
+ require("hlockey/mod/punchy")
8
+ require("hlockey/mod/nonconfrontational")
9
+
10
+ module Hlockey
11
+ ##
12
+ # A mod changes how a Player interacts with/responds to events
13
+ module Mod
14
+ MODS = [
15
+ Fencebuilder,
16
+ Fencedestroyer,
17
+ Handholding,
18
+ Immaterial,
19
+ Locked,
20
+ Powernapper,
21
+ Punchy,
22
+ Nonconfrontational
23
+ ].freeze
24
+ end
25
+ end
@@ -0,0 +1,7 @@
1
+ module Hlockey
2
+ ##
3
+ # For things that name themselves by class name
4
+ module SelfDescribable
5
+ def to_s = self.class.to_s.split("::").last
6
+ end
7
+ end
@@ -1,3 +1,4 @@
1
+ require("hlockey/mod")
1
2
  require("hlockey/utils")
2
3
 
3
4
  module Hlockey
@@ -5,74 +6,55 @@ module Hlockey
5
6
  ##
6
7
  # A player on a team
7
8
  class Player
8
- attr_accessor(:team, :stats)
9
- attr_reader(:to_s)
9
+ attr_accessor(:team, :mods, :stats)
10
+ attr_reader(:name)
10
11
 
11
- @@cached_chain = nil # Must be class var to avoid getting dumped to YAML
12
+ alias to_s name
12
13
 
14
+ # @param name [String]
13
15
  # @param team [Team]
14
- # @param prng [#rand]
15
- def initialize(team, prng = Random)
16
- @to_s = make_name(prng)
16
+ # @param stats [Hash<:offense, :defense, :agility => Numeric>]
17
+ # @param mods [Array]
18
+ def initialize(name:, team:, stats:, mods: [])
19
+ @name = name
17
20
  @team = team
18
- # Generate stats
19
- @stats = {}
20
- %i[offense defense agility].each { |stat| @stats[stat] = prng.rand * 5 }
21
- end
22
-
23
- # @return [Hash<String => String>] #stats but better for displaying
24
- def stat_display
25
- Utils.hash_display_keys(
26
- @stats.transform_values { |stat| stat.round(2).to_s.ljust(4, "0") }
27
- )
21
+ @stats = stats
22
+ @mods = mods.map do |mod|
23
+ if mod.is_a?(Array)
24
+ Mod::MODS.find { _1.to_s == "Hlockey::Mod::#{mod.first}" }.new(self,
25
+ *mod[1..])
26
+ else
27
+ Mod::MODS.find { _1.to_s == "Hlockey::Mod::#{mod}" }.new(self)
28
+ end
29
+ end
28
30
  end
29
31
 
30
- private
31
-
32
- def make_name(prng)
33
- Array.new(2) do
34
- combination = "__"
35
- next_letter = ""
36
- result = ""
37
-
38
- 10.times do
39
- next_letters = name_chain[combination]
40
- break if next_letters.nil?
32
+ # @return [Hash]
33
+ def to_h(simple: false)
34
+ res = {
35
+ name: @name,
36
+ stats: @stats
37
+ }
38
+ res[:team] = @team.to_s unless simple
39
+ res[:mods] = @mods.map(&:to_data) unless simple && @mods.empty?
41
40
 
42
- cumulative_weights = []
43
- next_letters.each_value do |v|
44
- cumulative_weights << v + (cumulative_weights.last or 0)
45
- end
46
-
47
- next_letter = Utils.weighted_random(next_letters, prng)
48
- break if next_letter == "_"
49
-
50
- result += next_letter
51
- combination = combination[1] + next_letter
52
- end
53
-
54
- result
55
- end.join(" ")
41
+ res
56
42
  end
57
43
 
58
- def name_chain
59
- if @@cached_chain.nil?
60
- @@cached_chain = {}
61
- File.open(
62
- File.expand_path("../../data/external/names.txt", __dir__)
63
- ).each do |n|
64
- name = "__#{n.chomp}__"
65
- (name.length - 3).times do |i|
66
- combination = name[i, 2]
67
- next_letter = name[i + 2]
68
- @@cached_chain[combination] ||= {}
69
- @@cached_chain[combination][next_letter] ||= 0
70
- @@cached_chain[combination][next_letter] += 1
71
- end
72
- end
73
- end
44
+ # @return [Hash<String => String>] #stats but better for displaying
45
+ def stat_display =
46
+ Utils.hash_display_keys(
47
+ @stats.transform_values { _1.round(2).to_s.ljust(4, "0") }
48
+ )
74
49
 
75
- @@cached_chain
50
+ # Calls a method on every mod this player has
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
54
+ def mods_do(action, *args)
55
+ res = nil
56
+ @mods.each { res ||= _1.send(action, *args) }
57
+ res
76
58
  end
77
59
  end
78
60
  end
@@ -17,7 +17,8 @@ module Hlockey
17
17
  # @param nickname [String, nil]
18
18
  # @param description [String, nil]
19
19
  # @param team [Team, nil]
20
- def initialize(full_name, hlockey_type, nickname: nil, description: nil, team: nil)
20
+ def initialize(full_name:, hlockey_type:,
21
+ nickname: nil, description: nil, team: nil)
21
22
  @full_name = full_name
22
23
  @hlockey_type = hlockey_type
23
24
  @nickname = nickname
@@ -25,17 +26,19 @@ module Hlockey
25
26
  @team = team
26
27
  end
27
28
 
28
- # The Stadium as a Hash.
29
- # nil properties are removed, as well as #team
30
- # Intended to be used as an easy way to get all relevant stadium info at once.
31
29
  # @return [Hash]
32
- def to_h
33
- {
30
+ def to_h(simple: false)
31
+ res = {
34
32
  nickname: @nickname,
35
33
  full_name: @full_name,
36
34
  description: @description,
37
35
  hlockey_type: @hlockey_type
38
- }.compact
36
+ }
37
+ return res.compact if simple
38
+
39
+ res[:team] = @team.to_s
40
+
41
+ res
39
42
  end
40
43
 
41
44
  # The name (and nickname, if it exists) of the stadium
data/lib/hlockey/team.rb CHANGED
@@ -6,61 +6,77 @@ module Hlockey
6
6
  # A team in the league
7
7
  # Created by League when data is loaded
8
8
  class Team
9
- attr_accessor(:wins, :losses, :roster, :shadows, :status, :to_s)
10
- attr_reader(:emoji, :color, :motto, :stadium)
9
+ attr_accessor(:wins, :losses, :roster, :shadows, :status)
10
+ attr_reader(:name, :emoji, :color, :motto, :stadium, :evolutions)
11
11
 
12
- # random is only used if roster or shadows is nil
13
- def initialize(name, color, emoji,
14
- stadium: nil, roster: nil, shadows: nil, random: Random)
15
- @to_s = name
12
+ alias to_s name
13
+
14
+ # @param name [String]
15
+ # @param color [String]
16
+ # @param emoji [String]
17
+ # @param motto [String]
18
+ # @param stadium [Hash<:full_name, :hlockey_type, :nickname, :description => String>]
19
+ # @param roster [Hash<:lwing, :center, :rwing, :ldef, :goalie, :rdef => Hash>]
20
+ # @param shadows [Array<Hash>]
21
+ def initialize(name:, color:, emoji:, motto:, stadium:, roster:, shadows:,
22
+ evolutions: 0)
23
+ @name = name
16
24
  @color = color
17
25
  @emoji = emoji
26
+ @motto = motto
27
+ @evolutions = evolutions
18
28
 
19
- if stadium.nil?
20
- # default stadium
21
- @stadium = Stadium.new(
22
- "Hlockey General Stadium", "Ice",
23
- description: "A stadium for teams with no home stadium to use.",
24
- team: self
25
- )
26
- else
27
- @stadium = stadium.dup
28
- @stadium.team = self
29
+ @stadium = Stadium.new(team: self, **stadium)
30
+
31
+ @roster = roster.transform_values { Player.new(**_1, team: self) }
32
+ @shadows = shadows.map { Player.new(**_1, team: self) }
33
+
34
+ @status = :in_contention
35
+ @wins = @losses = 0
36
+ end
37
+
38
+ # @return [Hash]
39
+ def to_h(simple: false)
40
+ res = {
41
+ name: @name,
42
+ color: @color,
43
+ emoji: @emoji,
44
+ motto: @motto,
45
+ evolutions: @evolutions,
46
+ stadium: @stadium.to_h(simple:),
47
+ roster: @roster.transform_values { _1.to_h(simple:) },
48
+ shadows: @shadows.map { _1.to_h(simple:) }
49
+ }
50
+
51
+ res.delete(:evolutions) if simple && res[:evolutions].zero?
52
+
53
+ unless simple
54
+ res[:status] = @status
55
+ res[:wins] = @wins
56
+ res[:losses] = @losses
29
57
  end
30
58
 
31
- @roster = if roster.nil?
32
- # randomly generate roster
33
- %i[lwing center rwing ldef goalie rdef].each_with_object({}) do |pos, h|
34
- h[pos] = Player.new(self, random)
35
- end
36
- else
37
- roster
38
- end
39
- @shadows = shadows.nil? ? Array.new(3) { Player.new(self, random) } : shadows
40
-
41
- @wins = 0
42
- @losses = 0
59
+ res
43
60
  end
44
61
 
45
62
  # @return [String] wins/losses in string representation
46
- def w_l
47
- "#{@wins}-#{@losses}"
48
- end
63
+ def w_l = "#{@wins}-#{@losses}"
64
+
65
+ # @return [Boolean]
66
+ def positive_record? = @wins > @losses
67
+
68
+ # @return [Array<Player>]
69
+ def players = @roster.values + @shadows
49
70
 
50
71
  # @return [Symbol] the position of the worst player on the roster
51
- def worst_player_pos
52
- @roster.transform_values { |p| p.stats.values.reduce(:+) }
53
- .min_by { |_, v| v }
54
- .first
55
- end
72
+ def worst_player_pos =
73
+ @roster.transform_values { |v| v.stats.values.sum }.min_by { |_, v| v }.first
56
74
 
57
75
  # @return [Hash<String => Player>] #roster, but with keys better for displaying
58
- def roster_display
59
- @roster.transform_keys(&Hlockey::Team.method(:pos_name))
60
- end
76
+ def roster_display = @roster.transform_keys(&self.class.method(:pos_name))
61
77
 
62
78
  # Takes symbol from Team roster & converts it to full position name
63
- def self.pos_name(pos)
79
+ def self.pos_name(pos) =
64
80
  case pos
65
81
  when :lwing
66
82
  "Left wing"
@@ -73,6 +89,5 @@ module Hlockey
73
89
  else
74
90
  pos.capitalize.to_s
75
91
  end
76
- end
77
92
  end
78
93
  end
data/lib/hlockey/utils.rb CHANGED
@@ -1,13 +1,45 @@
1
1
  module Hlockey
2
2
  ##
3
- # Utility methods to help with various Hlockey related tasks
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
@@ -1,3 +1,3 @@
1
1
  module Hlockey
2
- VERSION = "5".freeze
2
+ VERSION = "7".freeze
3
3
  end
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,46 +1,47 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hlockey
3
3
  version: !ruby/object:Gem::Version
4
- version: '5'
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: 2023-08-27 00:00:00.000000000 Z
11
+ date: 2024-05-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: psych
14
+ name: json
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '5'
19
+ version: '2.6'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '5'
26
+ version: '2.6'
27
27
  description: Hlockey library.
28
- email: endie2@protonmail.com
28
+ email: lavender.perry@outlook.com
29
29
  executables: []
30
30
  extensions: []
31
31
  extra_rdoc_files: []
32
32
  files:
33
- - data/election.yaml
34
- - data/external/names.txt
35
- - data/information.yaml
36
- - data/league.yaml
37
- - data/links.yaml
38
- - data/previous_election_results.yaml
33
+ - data/election.json
34
+ - data/infinileague.json
35
+ - data/information.json
36
+ - data/league.json
37
+ - data/links.json
38
+ - data/messages.json
39
+ - data/previous_election_results.json
39
40
  - lib/hlockey.rb
41
+ - lib/hlockey/actions.rb
40
42
  - lib/hlockey/constants.rb
41
43
  - lib/hlockey/data.rb
42
44
  - lib/hlockey/game.rb
43
- - lib/hlockey/game/actions.rb
44
45
  - lib/hlockey/game/fight.rb
45
46
  - lib/hlockey/game/weather.rb
46
47
  - lib/hlockey/game/weather/audacity.rb
@@ -52,16 +53,27 @@ files:
52
53
  - lib/hlockey/game/weather/weatherable.rb
53
54
  - lib/hlockey/league.rb
54
55
  - lib/hlockey/message.rb
56
+ - lib/hlockey/mod.rb
57
+ - lib/hlockey/mod/fencebuilder.rb
58
+ - lib/hlockey/mod/fencedestroyer.rb
59
+ - lib/hlockey/mod/handholding.rb
60
+ - lib/hlockey/mod/immaterial.rb
61
+ - lib/hlockey/mod/locked.rb
62
+ - lib/hlockey/mod/moddable.rb
63
+ - lib/hlockey/mod/nonconfrontational.rb
64
+ - lib/hlockey/mod/powernapper.rb
65
+ - lib/hlockey/mod/punchy.rb
66
+ - lib/hlockey/selfdescribable.rb
55
67
  - lib/hlockey/team.rb
56
68
  - lib/hlockey/team/player.rb
57
69
  - lib/hlockey/team/stadium.rb
58
70
  - lib/hlockey/utils.rb
59
71
  - lib/hlockey/version.rb
60
- homepage: https://github.com/Hlockey/lib
72
+ homepage: https://hlockey.gay
61
73
  licenses:
62
74
  - LicenseRef-LICENSE.md
63
75
  metadata:
64
- source_code_uri: https://github.com/Hlockey/lib
76
+ source_code_uri: https://codeberg.org/LavenderPerry/hlockey
65
77
  post_install_message:
66
78
  rdoc_options: []
67
79
  require_paths:
@@ -70,15 +82,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
70
82
  requirements:
71
83
  - - ">="
72
84
  - !ruby/object:Gem::Version
73
- version: '0'
85
+ version: 3.1.0
74
86
  required_rubygems_version: !ruby/object:Gem::Requirement
75
87
  requirements:
76
88
  - - ">="
77
89
  - !ruby/object:Gem::Version
78
90
  version: '0'
79
91
  requirements: []
80
- rubygems_version: 3.4.10
92
+ rubygems_version: 3.5.9
81
93
  signing_key:
82
94
  specification_version: 4
83
- summary: Hlockey season 5.
95
+ summary: Hlockey season 7.
84
96
  test_files: []
data/data/election.yaml DELETED
@@ -1,21 +0,0 @@
1
- ---
2
- :Bribery:
3
- :Mods Help: Add player modifications.
4
- :Lootboxes: Allow gambling for votes.
5
- :We Do A Little Losing: Recognize the losingest teams with an Underbracket.
6
- :Treasure:
7
- :Dave: The worst stat on your team is set to 4.5.
8
- :Nice: Boost your worst player by 0.69 in every stat.
9
- :Vengabus: All your team's stats are boosted by your team's losses * 0.005.
10
- :Unvengabus: Your division's top team has all their stats reduced by their wins * 0.005.
11
- :Shared Training: All teams in your division get +0.3 in each stat on each player.
12
- :Theft: Your worst player steals 0.3 in every stat from the champion team's best player.
13
- :Coaching:
14
- :Please Block Shots: Move your team's best defensive player to goalie.
15
- :Please Win Faceoffs: Move your team's player best offensive player to center.
16
- :Draft: Add a new random player to your shadows.
17
- :Small Gamble: All your team's stats go up or down by 0.5 at random.
18
- :Big Gamble: All your team's stats go up or down by 1.0 at random.
19
- :Revolution: Your team's best player and worst player split their stats evenly.
20
- :Clock Wise: Rotate each player on the roster to the position clockwise of them.
21
- :Clock Unwise: Rotate each player on the roster to the position counterclockwise of them.