hlockey 4 → 6
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 +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
|