hlockey 4 → 6
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 +4 -4
- data/data/election.json +20 -0
- data/data/information.json +5 -0
- data/data/league.json +1984 -0
- data/data/links.json +5 -0
- data/data/previous_election_results.json +98 -0
- data/lib/hlockey/actions.rb +22 -0
- data/lib/hlockey/constants.rb +6 -0
- data/lib/hlockey/data.rb +6 -5
- data/lib/hlockey/game/fight.rb +35 -20
- data/lib/hlockey/game/weather/audacity.rb +20 -0
- data/lib/hlockey/game/weather/chicken.rb +57 -0
- data/lib/hlockey/game/weather/incline.rb +43 -0
- data/lib/hlockey/game/weather/stars.rb +23 -0
- data/lib/hlockey/game/weather/sunset.rb +23 -0
- data/lib/hlockey/game/weather/waves.rb +33 -0
- data/lib/hlockey/game/weather/weatherable.rb +63 -0
- data/lib/hlockey/game/weather.rb +17 -0
- data/lib/hlockey/game.rb +123 -89
- data/lib/hlockey/league.rb +68 -76
- data/lib/hlockey/message.rb +62 -62
- data/lib/hlockey/mod/fencebuilder.rb +16 -0
- data/lib/hlockey/mod/fencedestroyer.rb +16 -0
- data/lib/hlockey/mod/handholding.rb +55 -0
- data/lib/hlockey/mod/immaterial.rb +26 -0
- data/lib/hlockey/mod/locked.rb +22 -0
- data/lib/hlockey/mod/moddable.rb +49 -0
- data/lib/hlockey/mod/nonconfrontational.rb +17 -0
- data/lib/hlockey/mod/powernapper.rb +46 -0
- data/lib/hlockey/mod/punchy.rb +17 -0
- data/lib/hlockey/mod.rb +25 -0
- data/lib/hlockey/selfdescribable.rb +9 -0
- data/lib/hlockey/team/player.rb +58 -0
- data/lib/hlockey/team/stadium.rb +52 -0
- data/lib/hlockey/team.rb +66 -25
- data/lib/hlockey/utils.rb +10 -2
- data/lib/hlockey/version.rb +1 -1
- metadata +37 -19
- data/data/election.yaml +0 -21
- data/data/external/names.txt +0 -19948
- data/data/information.yaml +0 -24
- data/data/league.yaml +0 -1526
- data/data/links.yaml +0 -3
- data/data/previous_election_results.yaml +0 -59
- data/lib/hlockey/game/actions.rb +0 -27
- data/lib/hlockey/player.rb +0 -73
- data/lib/hlockey/weather.rb +0 -168
data/data/links.yaml
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
---
|
2
|
-
:vote_amt: 182
|
3
|
-
:categories:
|
4
|
-
:Bribery (77 votes):
|
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)
|
11
|
-
:Dave:
|
12
|
-
:winner: Orcadas Base Fog (1 vote / 29 total)
|
13
|
-
:most_votes: Pompei Eruptions (9 votes)
|
14
|
-
: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):
|
20
|
-
:Antalya Pirates:
|
21
|
-
:winner: Please Win Faceoffs (1 vote / 1 total)
|
22
|
-
:Baden Hallucinations:
|
23
|
-
:winner: Small Gamble (1 vote / 2 total)
|
24
|
-
:Kópavogur Seals:
|
25
|
-
:winner: Please Block Shots (1 vote / 4 total)
|
26
|
-
:Lagos Soup:
|
27
|
-
:winner: Big Gamble (4 votes / 8 total)
|
28
|
-
:Pica Acid:
|
29
|
-
:winner: Please Block Shots (1 vote / 2 total)
|
30
|
-
:Dawson City Impostors:
|
31
|
-
:winner: Please Win Faceoffs (3 votes / 5 total)
|
32
|
-
:Erlangen Ohms:
|
33
|
-
:winner: Draft (1 vote / 1 total)
|
34
|
-
:Pompei Eruptions:
|
35
|
-
:winner: Please Block Shots (1 vote / 1 total)
|
36
|
-
:Rio de Janeiro Directors:
|
37
|
-
:winner: Please Block Shots (1 vote / 1 total)
|
38
|
-
:Wyrzysk Rockets:
|
39
|
-
:winner: Please Win Faceoffs (1 vote / 1 total)
|
40
|
-
:Cape Town Transplants:
|
41
|
-
:winner: Small Gamble (1 vote / 1 total)
|
42
|
-
:Manbij Fish:
|
43
|
-
:winner: Big Gamble (0 votes / 0 total)
|
44
|
-
:Nagqu Paint:
|
45
|
-
:winner: Pleaase Win Faceoffs (1 vote / 1 total)
|
46
|
-
:Nice Backflippers:
|
47
|
-
:winner: Draft (1 vote / 1 total)
|
48
|
-
:Orcadas Base Fog:
|
49
|
-
:winner: Big Gamble (1 vote / 1 total)
|
50
|
-
:Baghdad Abacuses:
|
51
|
-
:winner: Small Gamble (0 votes / 0 total)
|
52
|
-
:Jakarta Architects:
|
53
|
-
:winner: Big Gamble (1 vote / 1 total)
|
54
|
-
:Kyoto Payphones:
|
55
|
-
:winner: Please Win Faceoffs (1 vote / 2 total)
|
56
|
-
:Stony Brook Reapers:
|
57
|
-
:winner: Draft (5 votes / 7 total)
|
58
|
-
:Sydney Thinkers:
|
59
|
-
:winner: Please Block Shots (1 vote / 1 total)
|
data/lib/hlockey/game/actions.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
module Hlockey
|
2
|
-
class Game
|
3
|
-
##
|
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
|
-
module Actions
|
7
|
-
# @return [Team] the teams in the game
|
8
|
-
attr_reader(:home, :away)
|
9
|
-
|
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)
|
18
|
-
|
19
|
-
# @param succeed_boost [Numeric] increases chance of action succeeding
|
20
|
-
# @param fail_boost [Numeric] decreases chance of action succeeding
|
21
|
-
# @return [Boolean] if the action succeeded
|
22
|
-
def action_succeeds?(succeed_boost, fail_boost)
|
23
|
-
@prng.rand(20) + (succeed_boost - fail_boost) > 9
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
data/lib/hlockey/player.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
require("hlockey/utils")
|
2
|
-
|
3
|
-
module Hlockey
|
4
|
-
class Player
|
5
|
-
attr_accessor(:team, :stats)
|
6
|
-
attr_reader(:to_s)
|
7
|
-
|
8
|
-
@cached_chain = nil
|
9
|
-
|
10
|
-
# @param team [Team]
|
11
|
-
# @param prng [#rand]
|
12
|
-
def initialize(team, prng = Random)
|
13
|
-
@to_s = make_name(prng)
|
14
|
-
@team = team
|
15
|
-
# Generate stats
|
16
|
-
@stats = {}
|
17
|
-
%i[offense defense agility].each { |stat| @stats[stat] = prng.rand * 5 }
|
18
|
-
end
|
19
|
-
|
20
|
-
# @return [Hash<Symbol => String>]
|
21
|
-
def stat_strings
|
22
|
-
@stats.transform_values do |stat|
|
23
|
-
stat.instance_of?(String) ? stat : stat.round(2).to_s.ljust(4, "0")
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def make_name(prng)
|
30
|
-
Array.new(2) do
|
31
|
-
combination = "__"
|
32
|
-
next_letter = ""
|
33
|
-
result = ""
|
34
|
-
|
35
|
-
10.times do
|
36
|
-
next_letters = name_chain[combination]
|
37
|
-
break if next_letters.nil?
|
38
|
-
|
39
|
-
cumulative_weights = []
|
40
|
-
next_letters.each_value do |v|
|
41
|
-
cumulative_weights << v + (cumulative_weights.last or 0)
|
42
|
-
end
|
43
|
-
|
44
|
-
next_letter = Utils.weighted_random(next_letters, prng)
|
45
|
-
break if next_letter == "_"
|
46
|
-
|
47
|
-
result += next_letter
|
48
|
-
combination = combination[1] + next_letter
|
49
|
-
end
|
50
|
-
|
51
|
-
result
|
52
|
-
end.join(" ")
|
53
|
-
end
|
54
|
-
|
55
|
-
def name_chain
|
56
|
-
if @cached_chain.nil?
|
57
|
-
@cached_chain = {}
|
58
|
-
File.open(File.expand_path("../../data/external/names.txt", __dir__)).each do |n|
|
59
|
-
name = "__#{n.chomp}__"
|
60
|
-
(name.length - 3).times do |i|
|
61
|
-
combination = name[i, 2]
|
62
|
-
next_letter = name[i + 2]
|
63
|
-
@cached_chain[combination] ||= {}
|
64
|
-
@cached_chain[combination][next_letter] ||= 0
|
65
|
-
@cached_chain[combination][next_letter] += 1
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
@cached_chain
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
data/lib/hlockey/weather.rb
DELETED
@@ -1,168 +0,0 @@
|
|
1
|
-
require("hlockey/game")
|
2
|
-
require("hlockey/message")
|
3
|
-
require("hlockey/player")
|
4
|
-
|
5
|
-
module Hlockey
|
6
|
-
class Weather
|
7
|
-
def initialize(game)
|
8
|
-
@game = game
|
9
|
-
@home = @game.home
|
10
|
-
@away = @game.away
|
11
|
-
@prng = @game.prng
|
12
|
-
end
|
13
|
-
|
14
|
-
def to_s
|
15
|
-
self.class.to_s.split("::").last
|
16
|
-
end
|
17
|
-
|
18
|
-
def on_game_start() end
|
19
|
-
|
20
|
-
def on_game_end() end
|
21
|
-
|
22
|
-
def on_period_end() end
|
23
|
-
|
24
|
-
def on_action() end
|
25
|
-
|
26
|
-
def on_goal(scoring_team) end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
# Swaps roster & shadows player, used for Chicken & Waves weather
|
31
|
-
# @param team_sym [:home, :away]
|
32
|
-
# @param pos [Symbol] position of player swapped out
|
33
|
-
# @param shadows_idx [Integer] index of shadows player swapped in
|
34
|
-
# @return [Array<Player>] the players that were swapped
|
35
|
-
def swap(team_sym, pos, shadows_idx)
|
36
|
-
team = @game.send(team_sym)
|
37
|
-
|
38
|
-
prev_player = team.roster[pos]
|
39
|
-
next_player = team.shadows[shadows_idx]
|
40
|
-
team.roster[pos] = next_player
|
41
|
-
team.shadows[shadows_idx] = prev_player
|
42
|
-
|
43
|
-
unless @game.fight.nil?
|
44
|
-
player_array = @game.fight.players[team_sym]
|
45
|
-
player_idx = player_array.index(prev_player)
|
46
|
-
|
47
|
-
player_array[player_idx] = next_player unless player_idx.nil?
|
48
|
-
end
|
49
|
-
|
50
|
-
[prev_player, next_player]
|
51
|
-
end
|
52
|
-
|
53
|
-
# @return [:home, :away]
|
54
|
-
def rand_team
|
55
|
-
@prng.rand(2).zero? ? :home : :away
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
class Audacity < Weather
|
60
|
-
def on_action
|
61
|
-
@game.shoot(audacity: true) if @prng.rand(Game::NON_OT_ACTIONS / 10).zero?
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
class Chicken < Weather
|
66
|
-
def on_game_start
|
67
|
-
@chickened_out = { home: {}, away: {} }
|
68
|
-
end
|
69
|
-
|
70
|
-
def on_action
|
71
|
-
return unless @prng.rand(Game::NON_OT_ACTIONS / 5).zero?
|
72
|
-
|
73
|
-
team = rand_team
|
74
|
-
pos, shadows_idx = get_swap(team)
|
75
|
-
if pos.nil? || shadows_idx.nil?
|
76
|
-
team = team == :home ? :away : :home
|
77
|
-
pos, shadows_idx = get_swap(team)
|
78
|
-
return if pos.nil? || shadows_idx.nil?
|
79
|
-
end
|
80
|
-
|
81
|
-
@chickened_out[team][pos] = shadows_idx
|
82
|
-
|
83
|
-
@game.stream << Message.ChickenedOut(*swap(team, pos, shadows_idx))
|
84
|
-
end
|
85
|
-
|
86
|
-
def on_game_end
|
87
|
-
@chickened_out.each do |team, swaps|
|
88
|
-
swaps.each { |pos, shadows_idx| swap(team, pos, shadows_idx) }
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
private
|
93
|
-
|
94
|
-
# @param team_sym [:home, :away]
|
95
|
-
# @return [Array<Symbol, Integer>]
|
96
|
-
def get_swap(team_sym)
|
97
|
-
team = @game.send(team_sym)
|
98
|
-
|
99
|
-
[
|
100
|
-
(team.roster.keys - @chickened_out[team_sym].keys).sample(random: @prng),
|
101
|
-
(team.shadows.each_index.to_a - @chickened_out[team_sym].values)
|
102
|
-
.sample(random: @prng)
|
103
|
-
]
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
class Inclines < Weather
|
108
|
-
def on_game_start
|
109
|
-
make_incline
|
110
|
-
end
|
111
|
-
|
112
|
-
def on_goal(scoring_team)
|
113
|
-
return unless scoring_team == @favored_team
|
114
|
-
|
115
|
-
@game.score[scoring_team] += @prng.rand(0.1..0.5)
|
116
|
-
make_incline
|
117
|
-
end
|
118
|
-
|
119
|
-
private
|
120
|
-
|
121
|
-
def make_incline
|
122
|
-
new_favored_team = rand_team
|
123
|
-
return unless new_favored_team != @favored_team
|
124
|
-
|
125
|
-
@favored_team = new_favored_team
|
126
|
-
@game.stream << Message.InclineFavors(@game.send(@favored_team))
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
class Stars < Weather
|
131
|
-
def on_period_end
|
132
|
-
team = %i[home away].find { |sym| @game.send(sym).to_s == "Sleepers" }
|
133
|
-
if team.nil?
|
134
|
-
return if @game.score[:home] == @game.score[:away]
|
135
|
-
|
136
|
-
team = @game.score.min_by { |_, v| v }.first
|
137
|
-
end
|
138
|
-
|
139
|
-
@game.score[team] += 0.5
|
140
|
-
@game.stream << Message.StarsAlign(@game.send(team))
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
class Sunset < Weather
|
145
|
-
def on_game_start
|
146
|
-
@score_amt = { home: 0, away: 0 }
|
147
|
-
end
|
148
|
-
|
149
|
-
def on_goal(scoring_team)
|
150
|
-
@score_amt[scoring_team] += 1
|
151
|
-
@game.score[scoring_team] -= @score_amt[scoring_team] * 0.2
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
class Waves < Weather
|
156
|
-
def on_action
|
157
|
-
return unless @prng.rand(Game::NON_OT_ACTIONS).zero?
|
158
|
-
|
159
|
-
team_sym = rand_team
|
160
|
-
team = @game.send(team_sym)
|
161
|
-
@game.stream << Message.WavesWashedAway(*swap(team_sym,
|
162
|
-
team.worst_player_pos,
|
163
|
-
@prng.rand(team.shadows.length)))
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
Weather::WEATHERS = [Audacity, Chicken, Inclines, Stars, Sunset, Waves].freeze
|
168
|
-
end
|