hlockey 4 → 5

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.
@@ -1,59 +1,65 @@
1
1
  ---
2
- :vote_amt: 182
2
+ :vote_amt: 239
3
3
  :categories:
4
- :Bribery (77 votes):
4
+ :Bribery (73 votes):
5
5
  :Winning bribe:
6
- :winner: Flavor Text (39 votes)
7
- :Treasure (65 votes):
8
- :Vengabus:
9
- :winner: Pompei Eruptions (1 vote / 16 total)
10
- :most_votes: Stony Brook Reapers (4 votes)
6
+ :winner: Stadiums (42 votes)
7
+ :Treasure (124 votes):
11
8
  :Dave:
12
- :winner: Orcadas Base Fog (1 vote / 29 total)
13
- :most_votes: Pompei Eruptions (9 votes)
9
+ :winner: Dawson City Impostors (16 votes / 38 total)
14
10
  :Nice:
15
- :winner: Kópavogur Seals (1 vote / 15 total)
16
- :most_votes: Pica Acid (3 votes)
17
- :Convenient Math Error:
18
- :winner: Jakarta Architects (1 vote / 5 total)
19
- :Coaching (40 votes):
11
+ :winner: Nice Backflippers (7 votes / 15 total)
12
+ :Vengabus:
13
+ :winner: Kyoto Payphones (1 vote / 46 total)
14
+ :most_votes: Sydney Thinkers (31 votes)
15
+ :Unvengabus:
16
+ :winner: Antalya Pirates (Wet Warm) (0 votes / 0 total)
17
+ :Shared Training:
18
+ :winner: Antalya Pirates (Wet Warm) (2 votes / 20 total)
19
+ :most_votes: Orcadas Base Fog (5 votes)
20
+ :Theft:
21
+ :winner: Manbij Fish (1 vote / 5 total)
22
+ :most_votes: Pica Acid (2 votes)
23
+ :Hidden Treasure - Evolve:
24
+ :winner: Sleepersz (0 votes / 0 total)
25
+ :Coaching (42 votes):
20
26
  :Antalya Pirates:
21
- :winner: Please Win Faceoffs (1 vote / 1 total)
27
+ :winner: Please Block Shots (3 votes / 3 total)
22
28
  :Baden Hallucinations:
23
- :winner: Small Gamble (1 vote / 2 total)
29
+ :winner: Clock Unwise (1 vote / 1 total)
24
30
  :Kópavogur Seals:
25
- :winner: Please Block Shots (1 vote / 4 total)
31
+ :winner: Big Gamble (0 votes / 0 total)
26
32
  :Lagos Soup:
27
- :winner: Big Gamble (4 votes / 8 total)
33
+ :winner: Please Win Faceoffs (1 vote / 1 total)
28
34
  :Pica Acid:
29
- :winner: Please Block Shots (1 vote / 2 total)
35
+ :winner: Big Gamble (0 votes / 0 total)
30
36
  :Dawson City Impostors:
31
- :winner: Please Win Faceoffs (3 votes / 5 total)
37
+ :winner: Draft (2 votes / 3 total)
32
38
  :Erlangen Ohms:
33
- :winner: Draft (1 vote / 1 total)
39
+ :winner: Please Win Faceoffs (2 votes / 2 total)
34
40
  :Pompei Eruptions:
35
- :winner: Please Block Shots (1 vote / 1 total)
41
+ :winner: Please Win Faceoffs (2 votes / 2 total)
36
42
  :Rio de Janeiro Directors:
37
- :winner: Please Block Shots (1 vote / 1 total)
43
+ :winner: Clock Wise (1 vote / 1 total)
38
44
  :Wyrzysk Rockets:
39
- :winner: Please Win Faceoffs (1 vote / 1 total)
45
+ :winner: Please Win Faceoffs (0 votes / 0 total)
40
46
  :Cape Town Transplants:
41
- :winner: Small Gamble (1 vote / 1 total)
47
+ :winner: Please Block Shots (1 vote / 2 total)
42
48
  :Manbij Fish:
43
- :winner: Big Gamble (0 votes / 0 total)
49
+ :winner: Please Block Shots (1 vote / 2 total)
44
50
  :Nagqu Paint:
45
- :winner: Pleaase Win Faceoffs (1 vote / 1 total)
51
+ :winner: Revolution (1 vote / 1 total)
46
52
  :Nice Backflippers:
47
- :winner: Draft (1 vote / 1 total)
53
+ :winner: Please Block Shots (7 votes / 7 total)
48
54
  :Orcadas Base Fog:
49
- :winner: Big Gamble (1 vote / 1 total)
55
+ :winner: Please Win Faceoffs (2 votes / 2 total)
50
56
  :Baghdad Abacuses:
51
- :winner: Small Gamble (0 votes / 0 total)
57
+ :winner: Please Win Faceoffs (0 votes / 0 total)
52
58
  :Jakarta Architects:
53
- :winner: Big Gamble (1 vote / 1 total)
59
+ :winner: Big Gamble (0 votes / 0 total)
54
60
  :Kyoto Payphones:
55
- :winner: Please Win Faceoffs (1 vote / 2 total)
61
+ :winner: Clock Unwise (3 votes / 5 total)
56
62
  :Stony Brook Reapers:
57
- :winner: Draft (5 votes / 7 total)
63
+ :winner: Please Block Shots (1 vote / 2 total)
58
64
  :Sydney Thinkers:
59
- :winner: Please Block Shots (1 vote / 1 total)
65
+ :winner: Draft (6 votes / 7 total)
@@ -1,4 +1,10 @@
1
1
  module Hlockey
2
2
  UPDATE_FREQUENCY_SECONDS = 5
3
3
  UPDATES_PER_HOUR = 3600 / UPDATE_FREQUENCY_SECONDS
4
+
5
+ ACTIONS_PER_PERIOD = 60
6
+ NON_OT_PERIODS = 3
7
+ NON_OT_ACTIONS = ACTIONS_PER_PERIOD * NON_OT_PERIODS
8
+ TOTAL_ACTIONS = UPDATES_PER_HOUR - ACTIONS_PER_PERIOD
9
+ TOTAL_PERIODS = TOTAL_ACTIONS / ACTIONS_PER_PERIOD
4
10
  end
data/lib/hlockey/data.rb CHANGED
@@ -1,4 +1,4 @@
1
- require("hlockey/team") # Class stored in league data
1
+ require("hlockey/team") # Classes stored in league data
2
2
  require("yaml")
3
3
 
4
4
  module Hlockey
@@ -2,19 +2,16 @@ module Hlockey
2
2
  class Game
3
3
  ##
4
4
  # For classes that deal with actions within a Hlockey game.
5
- # Any class including this must have instance variables indicated by the readers
6
5
  module Actions
7
- # @return [Team] the teams in the game
8
- attr_reader(:home, :away)
6
+ private
9
7
 
10
- # @return [Random] should be the same as the league's
11
- attr_reader(:prng)
12
-
13
- # @return [Hash<Symbol => Integer>] the score of each team
14
- attr_reader(:score)
15
-
16
- # @return [Boolean] if the sequence of actions is still in progress
17
- attr_reader(:in_progress)
8
+ # For an event that should happen randomly about a certain amount of times per game,
9
+ # returns if the event should happen or not. Should be called once per action.
10
+ # @param times [Integer] the approximate amount of times the event should occur
11
+ # @return [Boolean] if the event should occur
12
+ def random_event_occurs?(times = 1)
13
+ @prng.rand(NON_OT_ACTIONS / times).zero?
14
+ end
18
15
 
19
16
  # @param succeed_boost [Numeric] increases chance of action succeeding
20
17
  # @param fail_boost [Numeric] decreases chance of action succeeding
@@ -11,6 +11,9 @@ module Hlockey
11
11
  # @return [Hash<Symbol => Array<Player>>] the players in the fight
12
12
  attr_reader(:players)
13
13
 
14
+ # @return [Hash<Symbol => Integer>] the amount of successful punches for each team
15
+ attr_reader(:score)
16
+
14
17
  # @param game [Game] the game the fight is a part of
15
18
  def initialize(game)
16
19
  @home = game.home
@@ -22,7 +25,6 @@ module Hlockey
22
25
  away: [@away.roster.values.sample(random: @prng)]
23
26
  }
24
27
  @score = { home: 0, away: 0 }
25
- @in_progress = true
26
28
  end
27
29
 
28
30
  # @return [Message] the message to add to the game stream
@@ -46,14 +48,16 @@ module Hlockey
46
48
 
47
49
  Message.PlayerJoinedFight(send(team_joining), player_joining)
48
50
  else # fight ends
49
- @in_progress = false
50
-
51
51
  Message.FightEnded
52
52
  end
53
53
  end
54
54
 
55
55
  private
56
56
 
57
+ # private readers so #send works
58
+ # @return [Team] a team in the fight
59
+ attr_reader(:home, :away)
60
+
57
61
  # @return [Message] returned by #next_action for same purpose
58
62
  def attack
59
63
  attacking_team = rand_team
@@ -0,0 +1,20 @@
1
+ require("hlockey/game/weather/weatherable")
2
+ require("hlockey/game/actions")
3
+
4
+ module Hlockey
5
+ class Game
6
+ module Weather
7
+ ##
8
+ # Audacity weather
9
+ # Causes players to take shots regardless of the state of the game
10
+ class Audacity
11
+ include(Weatherable)
12
+ include(Actions)
13
+
14
+ def on_action
15
+ @game.send(:shoot, audacity: true) if random_event_occurs?(10)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,57 @@
1
+ require("hlockey/game/weather/weatherable")
2
+ require("hlockey/game/actions")
3
+ require("hlockey/message")
4
+
5
+ module Hlockey
6
+ class Game
7
+ module Weather
8
+ ##
9
+ # Chicken weather
10
+ # Swaps a random roster player with a random shadow player for the rest of the game
11
+ class Chicken
12
+ include(Weatherable)
13
+ include(Actions)
14
+
15
+ def on_game_start
16
+ @chickened_out = { home: {}, away: {} }
17
+ end
18
+
19
+ def on_action
20
+ return unless random_event_occurs?(5)
21
+
22
+ team = rand_team
23
+ pos, shadows_idx = get_swap(team)
24
+ if pos.nil? || shadows_idx.nil?
25
+ team = team == :home ? :away : :home
26
+ pos, shadows_idx = get_swap(team)
27
+ return if pos.nil? || shadows_idx.nil?
28
+ end
29
+
30
+ @chickened_out[team][pos] = shadows_idx
31
+
32
+ @game.stream << Message.ChickenedOut(*swap(team, pos, shadows_idx))
33
+ end
34
+
35
+ def on_game_end
36
+ @chickened_out.each do |team, swaps|
37
+ swaps.each { |pos, shadows_idx| swap(team, pos, shadows_idx) }
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ # @param team_sym [:home, :away]
44
+ # @return [Array<Symbol, Integer>]
45
+ def get_swap(team_sym)
46
+ team = @game.send(team_sym)
47
+
48
+ [
49
+ (team.roster.keys - @chickened_out[team_sym].keys).sample(random: @prng),
50
+ (team.shadows.each_index.to_a - @chickened_out[team_sym].values)
51
+ .sample(random: @prng)
52
+ ]
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,43 @@
1
+ require("hlockey/game/weather/weatherable")
2
+ require("hlockey/message")
3
+
4
+ module Hlockey
5
+ class Game
6
+ module Weather
7
+ ##
8
+ # Incline weather
9
+ # Adds a random amount of score to a favored team's goals
10
+ class Incline
11
+ include(Weatherable)
12
+
13
+ def on_game_start
14
+ make_incline
15
+ end
16
+
17
+ def on_goal(scoring_team)
18
+ return unless scoring_team == @favored_team
19
+
20
+ @game.score[scoring_team] += @prng.rand(0.1..0.5)
21
+ make_incline
22
+ end
23
+
24
+ def on_action
25
+ return unless @incline_changed
26
+
27
+ @game.stream << Message.InclineFavors(@game.send(@favored_team))
28
+ @incline_changed = false
29
+ end
30
+
31
+ private
32
+
33
+ def make_incline
34
+ new_favored_team = rand_team
35
+ return if new_favored_team == @favored_team
36
+
37
+ @favored_team = new_favored_team
38
+ @incline_changed = true
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,23 @@
1
+ require("hlockey/game/weather/weatherable")
2
+ require("hlockey/message")
3
+
4
+ module Hlockey
5
+ class Game
6
+ module Weather
7
+ ##
8
+ # Stars weather
9
+ # Gives the losing team +0.5 score at the end of each period
10
+ class Stars
11
+ include(Weatherable)
12
+
13
+ def on_period_end
14
+ return if @game.score[:home] == @game.score[:away]
15
+
16
+ team = @game.score.min_by { |_, v| v }.first
17
+ @game.score[team] += 0.5
18
+ @game.stream << Message.StarsAlign(@game.send(team))
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ require("hlockey/game/weather/weatherable")
2
+
3
+ module Hlockey
4
+ class Game
5
+ module Weather
6
+ ##
7
+ # Sunset weather
8
+ # Makes each team's goals worth less the more the team scores
9
+ class Sunset
10
+ include(Weatherable)
11
+
12
+ def on_game_start
13
+ @score_amt = { home: 0, away: 0 }
14
+ end
15
+
16
+ def on_goal(scoring_team)
17
+ @score_amt[scoring_team] += 1
18
+ @game.score[scoring_team] -= @score_amt[scoring_team] * 0.2
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,27 @@
1
+ require("hlockey/game/weather/weatherable")
2
+ require("hlockey/game/actions")
3
+ require("hlockey/message")
4
+
5
+ module Hlockey
6
+ class Game
7
+ module Weather
8
+ ##
9
+ # Waves weather
10
+ # Swaps the worst roster player with a random shadow player permanently
11
+ class Waves
12
+ include(Weatherable)
13
+ include(Actions)
14
+
15
+ def on_action
16
+ return unless random_event_occurs?
17
+
18
+ team_sym = rand_team
19
+ team = @game.send(team_sym)
20
+ @game.stream << Message.WavesWashedAway(*swap(team_sym,
21
+ team.worst_player_pos,
22
+ @prng.rand(team.shadows.length)))
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,63 @@
1
+ require("hlockey/constants")
2
+
3
+ module Hlockey
4
+ class Game
5
+ module Weather
6
+ ##
7
+ # Module with needed methods for weathers, that every weather includes
8
+ # All methods starting with "on" represent game events weathers may respond to
9
+ module Weatherable
10
+ def initialize(game)
11
+ @game = game
12
+ @home = @game.home
13
+ @away = @game.away
14
+ @prng = @game.prng
15
+ end
16
+
17
+ def to_s
18
+ self.class.to_s.split("::").last
19
+ end
20
+
21
+ def on_game_start() end
22
+
23
+ def on_game_end() end
24
+
25
+ def on_period_end() end
26
+
27
+ def on_action() end
28
+
29
+ def on_goal(scoring_team) end
30
+
31
+ private
32
+
33
+ # Swaps a roster player with a shadows player
34
+ # @param team_sym [:home, :away]
35
+ # @param pos [Symbol] position of roster player swapped out
36
+ # @param shadows_idx [Integer] index of shadows player swapped in
37
+ # @return [Array<Player>] the players that were swapped
38
+ def swap(team_sym, pos, shadows_idx)
39
+ team = @game.send(team_sym)
40
+
41
+ prev_player = team.roster[pos]
42
+ next_player = team.shadows[shadows_idx]
43
+ team.roster[pos] = next_player
44
+ team.shadows[shadows_idx] = prev_player
45
+
46
+ unless @game.fight.nil?
47
+ player_array = @game.fight.players[team_sym]
48
+ player_idx = player_array.index(prev_player)
49
+
50
+ player_array[player_idx] = next_player unless player_idx.nil?
51
+ end
52
+
53
+ [prev_player, next_player]
54
+ end
55
+
56
+ # @return [:home, :away]
57
+ def rand_team
58
+ @prng.rand(2).zero? ? :home : :away
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,17 @@
1
+ require("hlockey/game/weather/audacity")
2
+ require("hlockey/game/weather/chicken")
3
+ require("hlockey/game/weather/incline")
4
+ require("hlockey/game/weather/stars")
5
+ require("hlockey/game/weather/sunset")
6
+ require("hlockey/game/weather/waves")
7
+
8
+ module Hlockey
9
+ class Game
10
+ ##
11
+ # Weathers modify the mechanics of a Game
12
+ module Weather
13
+ # Every weather class
14
+ WEATHERS = [Audacity, Chicken, Incline, Stars, Sunset, Waves].freeze
15
+ end
16
+ end
17
+ end
data/lib/hlockey/game.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require("hlockey/game/actions")
2
2
  require("hlockey/game/fight")
3
+ require("hlockey/game/weather")
3
4
  require("hlockey/constants")
4
5
  require("hlockey/message")
5
6
  require("hlockey/utils")
@@ -10,33 +11,42 @@ module Hlockey
10
11
  class Game
11
12
  include(Actions)
12
13
 
13
- ACTIONS_PER_PERIOD = 60
14
- NON_OT_PERIODS = 4
15
- NON_OT_ACTIONS = ACTIONS_PER_PERIOD * NON_OT_PERIODS
16
- TOTAL_ACTIONS = UPDATES_PER_HOUR - ACTIONS_PER_PERIOD
17
- TOTAL_PERIODS = TOTAL_ACTIONS / ACTIONS_PER_PERIOD
14
+ # @return [Team] the teams in the game
15
+ attr_reader(:home, :away)
18
16
 
19
- # @return [Weather]
17
+ # @return [Random] should be the same as the league's
18
+ attr_reader(:prng)
19
+
20
+ # @return [Team::Stadium] the stadium this game is located at
21
+ attr_reader(:stadium)
22
+
23
+ # @return [Weather::Weatherable] the weather effecting the game
20
24
  attr_reader(:weather)
21
25
 
22
- # @return [Array<Message>]
26
+ # @return [Array<Message>] messages about game events
23
27
  attr_reader(:stream)
24
28
 
25
- # @return [Integer]
26
- attr_reader(:actions, :shooting_chance)
29
+ # @return [Hash<Symbol => Integer>] the score of each team
30
+ attr_reader(:score)
31
+
32
+ # @return [Boolean] if the game is still in progress
33
+ attr_reader(:in_progress)
34
+
35
+ # @return [Integer] what period the game is in
36
+ attr_reader(:period)
27
37
 
28
- # @return [Fight, nil]
38
+ # @return [Fight, nil] the current fight, if there is any
29
39
  attr_reader(:fight)
30
40
 
31
41
  # @param home [Team]
32
42
  # @param away [Team]
33
43
  # @param prng [Random] should be League#prng
34
- # @param weather [Class<Weather>]
35
- def initialize(home, away, prng, weather)
44
+ def initialize(home, away, prng)
36
45
  @home = home
37
46
  @away = away
38
47
  @prng = prng
39
- @weather = weather.new(self)
48
+ @stadium = @home.stadium
49
+ @weather = Weather::WEATHERS.sample(random: prng).new(self)
40
50
  @stream = [Message.StartOfGame]
41
51
  @score = { home: 0, away: 0 }
42
52
  @in_progress = true
@@ -61,24 +71,33 @@ module Hlockey
61
71
  "#{Message.color(@home)} vs #{Message.color(@away)}"
62
72
  end
63
73
 
64
- # Does an action in the game
74
+ # Update the game state by one action
65
75
  def update
66
76
  return unless @in_progress
67
77
 
78
+ do_action
79
+ handle_parties
80
+ end
81
+
82
+ private
83
+
84
+ # Does an action in the game
85
+ def do_action
68
86
  @stream << Message.StartOfPeriod(@period) if @actions.zero?
69
87
  @actions += 1
70
88
 
71
89
  @weather.on_action
72
90
 
73
91
  unless @fight.nil?
74
- @stream << @fight.next_action
75
- if @stream.last.event == :FightEnded
76
- morale_change_amount = (@fight.score[:home] - @fight.score[:away]) / 10.0
77
- change_morale(@home, morale_change_amount)
78
- change_morale(@away, -morale_change_amount)
92
+ fight_message = @fight.next_action
93
+ @stream << fight_message
94
+ return unless fight_message.event == :FightEnded
79
95
 
80
- @fight = nil
81
- end
96
+ morale_change_amount = (@fight.score[:home] - @fight.score[:away]) / 10.0
97
+ change_morale(@home, morale_change_amount)
98
+ change_morale(@away, -morale_change_amount)
99
+
100
+ @fight = nil
82
101
  return
83
102
  end
84
103
 
@@ -99,8 +118,11 @@ module Hlockey
99
118
  else
100
119
  shoot
101
120
  end
121
+ end
102
122
 
103
- return unless @partying_teams.any? && @prng.rand(NON_OT_ACTIONS / 5).zero?
123
+ # Does the random chance of partying for teams in party time
124
+ def handle_parties
125
+ return unless @partying_teams.any? && random_event_occurs?(5)
104
126
 
105
127
  @partying_teams.each do |team|
106
128
  player = team.roster.values.sample(random: @prng)
@@ -113,33 +135,6 @@ module Hlockey
113
135
  end
114
136
  end
115
137
 
116
- # Makes a player shoot in the game, regardless of if it would normally occur
117
- # @param audacity [Boolean] if the function was called by Audacity weather
118
- def shoot(audacity: false)
119
- return if @puck_holder_pos.nil?
120
-
121
- if @shooting_chance < 5 &&
122
- try_block_shot(@prng.rand(2).zero? ? :ldef : :rdef, audacity: audacity)
123
- return
124
- end
125
- return if try_block_shot(:goalie, audacity: audacity)
126
-
127
- # Goal scored
128
-
129
- scoring_team = @team_with_puck == @home ? :home : :away
130
- @score[scoring_team] += 1
131
- weather.on_goal(scoring_team)
132
-
133
- @stream << Message.ShootScore(puck_holder, @home, @away, *@score.values, audacity)
134
-
135
- start_fight if @prng.rand(3 + @fight_chance) > 3
136
-
137
- start_faceoff
138
- @actions = ACTIONS_PER_PERIOD - 1 if @period >= NON_OT_PERIODS # Sudden death OT
139
- end
140
-
141
- private
142
-
143
138
  # Makes a player pass in the game, regardless of if it would normally occur
144
139
  def pass
145
140
  sender = puck_holder
@@ -170,6 +165,32 @@ module Hlockey
170
165
  @fight_chance += 0.1
171
166
  end
172
167
 
168
+ # Makes a player shoot in the game, regardless of if it would normally occur
169
+ # This is called outside of the class by Audacity weather (using #send)
170
+ # @param audacity [Boolean] if the function was called by Audacity weather
171
+ def shoot(audacity: false)
172
+ return if @puck_holder_pos.nil?
173
+
174
+ if @shooting_chance < 5 &&
175
+ try_block_shot(@prng.rand(2).zero? ? :ldef : :rdef, audacity: audacity)
176
+ return
177
+ end
178
+ return if try_block_shot(:goalie, audacity: audacity)
179
+
180
+ # Goal scored
181
+
182
+ scoring_team = @team_with_puck == @home ? :home : :away
183
+ @score[scoring_team] += 1
184
+ weather.on_goal(scoring_team)
185
+
186
+ @stream << Message.ShootScore(puck_holder, @home, @away, *@score.values, audacity)
187
+
188
+ start_fight if @prng.rand(3 + @fight_chance) > 3
189
+
190
+ start_faceoff
191
+ @actions = ACTIONS_PER_PERIOD - 1 if @period > NON_OT_PERIODS # Sudden death OT
192
+ end
193
+
173
194
  def end_period
174
195
  @weather.on_period_end
175
196
  @stream << Message.EndOfPeriod(@period, @home, @away, *@score.values)
@@ -177,7 +198,7 @@ module Hlockey
177
198
  @period += 1
178
199
  start_faceoff
179
200
 
180
- if @period >= NON_OT_PERIODS &&
201
+ if @period > NON_OT_PERIODS &&
181
202
  !(@score[:home] == @score[:away] && @period <= TOTAL_PERIODS)
182
203
  # Game is over
183
204
  @pre_morale_change_stats.each { |player, stats| player.stats = stats }
@@ -300,21 +321,9 @@ module Hlockey
300
321
  # @return [Hash<Symbol => Integer>]
301
322
  def weights(offensive)
302
323
  if offensive
303
- {
304
- lwing: 2,
305
- center: 2,
306
- rwing: 2,
307
- ldef: 1,
308
- rdef: 1
309
- }
324
+ { lwing: 2, center: 2, rwing: 2, ldef: 1, rdef: 1 }
310
325
  else
311
- {
312
- lwing: 1,
313
- center: 1,
314
- rwing: 1,
315
- ldef: 3,
316
- rdef: 3
317
- }
326
+ { lwing: 1, center: 1, rwing: 1, ldef: 3, rdef: 3 }
318
327
  end
319
328
  end
320
329
  end