hlockey 2 → 4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/data/election.yaml +21 -0
- data/data/external/names.txt +19948 -0
- data/data/information.yaml +24 -0
- data/data/league.yaml +1526 -0
- data/data/links.yaml +3 -0
- data/data/previous_election_results.yaml +59 -0
- data/lib/hlockey/constants.rb +4 -0
- data/lib/hlockey/data.rb +17 -13
- data/lib/hlockey/game/actions.rb +27 -0
- data/lib/hlockey/game/fight.rb +99 -0
- data/lib/hlockey/game.rb +321 -159
- data/lib/hlockey/league.rb +254 -115
- data/lib/hlockey/message.rb +182 -0
- data/lib/hlockey/player.rb +73 -0
- data/lib/hlockey/team.rb +52 -35
- data/lib/hlockey/utils.rb +15 -0
- data/lib/hlockey/version.rb +3 -5
- data/lib/hlockey/weather.rb +168 -0
- data/lib/hlockey.rb +1 -3
- metadata +36 -16
- data/bin/hlockey +0 -104
- data/lib/hlockey/data/election.yaml +0 -16
- data/lib/hlockey/data/information.yaml +0 -12
- data/lib/hlockey/data/league.yaml +0 -846
- data/lib/hlockey/data/links.yaml +0 -2
- data/lib/hlockey/messages.rb +0 -100
data/data/links.yaml
ADDED
@@ -0,0 +1,59 @@
|
|
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/data.rb
CHANGED
@@ -1,13 +1,17 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
#
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
1
|
+
require("hlockey/team") # Class stored in league data
|
2
|
+
require("yaml")
|
3
|
+
|
4
|
+
module Hlockey
|
5
|
+
##
|
6
|
+
# Module containing methods to load Hlockey data
|
7
|
+
module Data
|
8
|
+
class << self
|
9
|
+
data_dir = File.expand_path("../../data", __dir__)
|
10
|
+
|
11
|
+
Dir.glob("*.yaml", base: data_dir).each do |data_file|
|
12
|
+
category = File.basename(data_file, ".yaml")
|
13
|
+
define_method(category) { YAML.unsafe_load_file("#{data_dir}/#{data_file}") }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,27 @@
|
|
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
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require("hlockey/game/actions")
|
2
|
+
require("hlockey/message")
|
3
|
+
|
4
|
+
module Hlockey
|
5
|
+
class Game
|
6
|
+
##
|
7
|
+
# A fight within a Hlockey game
|
8
|
+
class Fight
|
9
|
+
include(Actions)
|
10
|
+
|
11
|
+
# @return [Hash<Symbol => Array<Player>>] the players in the fight
|
12
|
+
attr_reader(:players)
|
13
|
+
|
14
|
+
# @param game [Game] the game the fight is a part of
|
15
|
+
def initialize(game)
|
16
|
+
@home = game.home
|
17
|
+
@away = game.away
|
18
|
+
@prng = game.prng
|
19
|
+
@actions = 0
|
20
|
+
@players = {
|
21
|
+
home: [@home.roster.values.sample(random: @prng)],
|
22
|
+
away: [@away.roster.values.sample(random: @prng)]
|
23
|
+
}
|
24
|
+
@score = { home: 0, away: 0 }
|
25
|
+
@in_progress = true
|
26
|
+
end
|
27
|
+
|
28
|
+
# @return [Message] the message to add to the game stream
|
29
|
+
def next_action
|
30
|
+
@actions += 1
|
31
|
+
|
32
|
+
case @prng.rand(@actions)
|
33
|
+
when 0..3 # attack
|
34
|
+
attack
|
35
|
+
when 4..7 # player joins
|
36
|
+
team_joining = opposite(rand_team)
|
37
|
+
|
38
|
+
player_joining = get_joining_player(team_joining)
|
39
|
+
if player_joining.nil?
|
40
|
+
team_joining = opposite(team_joining)
|
41
|
+
player_joining = get_joining_player(team_joining)
|
42
|
+
return attack if player_joining.nil?
|
43
|
+
end
|
44
|
+
|
45
|
+
@players[team_joining] << player_joining
|
46
|
+
|
47
|
+
Message.PlayerJoinedFight(send(team_joining), player_joining)
|
48
|
+
else # fight ends
|
49
|
+
@in_progress = false
|
50
|
+
|
51
|
+
Message.FightEnded
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
# @return [Message] returned by #next_action for same purpose
|
58
|
+
def attack
|
59
|
+
attacking_team = rand_team
|
60
|
+
defending_team = opposite(attacking_team)
|
61
|
+
|
62
|
+
attacking_player = @players[attacking_team].sample(random: @prng)
|
63
|
+
defending_player = @players[defending_team].sample(random: @prng)
|
64
|
+
|
65
|
+
blocked = action_succeeds?(defending_player.stats[:defense],
|
66
|
+
attacking_player.stats[:offense])
|
67
|
+
|
68
|
+
@score[attacking_team] += 1 unless blocked
|
69
|
+
|
70
|
+
Message.FightAttack(attacking_player, defending_player, blocked)
|
71
|
+
end
|
72
|
+
|
73
|
+
# @param team [:home, :away]
|
74
|
+
# @return [Player, nil]
|
75
|
+
def get_joining_player(team)
|
76
|
+
(send(team).roster.values - @players[team]).sample(random: @prng)
|
77
|
+
end
|
78
|
+
|
79
|
+
# @return [:home, :away] randomly selected based on amount of players in fight
|
80
|
+
def rand_team
|
81
|
+
rand_is_home? ? :home : :away
|
82
|
+
end
|
83
|
+
|
84
|
+
# @param team [:home, :away]
|
85
|
+
# @return [:home, :away] :away if `team` is :home, :home if `team` is :away
|
86
|
+
def opposite(team)
|
87
|
+
team == :home ? :away : :home
|
88
|
+
end
|
89
|
+
|
90
|
+
# @return [Boolean] if randomly selected team is home team
|
91
|
+
def rand_is_home?
|
92
|
+
home_player_amount = @home.roster.values.length
|
93
|
+
away_player_amount = @away.roster.values.length
|
94
|
+
|
95
|
+
@prng.rand(home_player_amount + away_player_amount) < home_player_amount
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|