basher-basher 0.1.1
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 +7 -0
- data/.gitignore +12 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +37 -0
- data/Rakefile +10 -0
- data/basher.gemspec +29 -0
- data/bin/basher +31 -0
- data/bin/console +10 -0
- data/bin/setup +8 -0
- data/lib/basher.rb +21 -0
- data/lib/basher/cursor.rb +59 -0
- data/lib/basher/dictionary.rb +50 -0
- data/lib/basher/game.rb +234 -0
- data/lib/basher/handler.rb +34 -0
- data/lib/basher/level.rb +131 -0
- data/lib/basher/refinements/string.rb +15 -0
- data/lib/basher/state.rb +46 -0
- data/lib/basher/timer.rb +69 -0
- data/lib/basher/ui.rb +125 -0
- data/lib/basher/ui/base_view.rb +28 -0
- data/lib/basher/ui/current_word_view.rb +38 -0
- data/lib/basher/ui/debug_view.rb +53 -0
- data/lib/basher/ui/info_view.rb +35 -0
- data/lib/basher/ui/loading_view.rb +11 -0
- data/lib/basher/ui/menu_view.rb +26 -0
- data/lib/basher/ui/progress_view.rb +29 -0
- data/lib/basher/ui/remaining_words_view.rb +34 -0
- data/lib/basher/ui/score_view.rb +41 -0
- data/lib/basher/ui/title_view.rb +37 -0
- data/lib/basher/version.rb +3 -0
- data/lib/basher/word.rb +40 -0
- metadata +189 -0
@@ -0,0 +1,38 @@
|
|
1
|
+
module Basher
|
2
|
+
module UI
|
3
|
+
class CurrentWordView < BaseView
|
4
|
+
using Basher::StringRefinements
|
5
|
+
|
6
|
+
attr_accessor :game
|
7
|
+
|
8
|
+
def self.lines
|
9
|
+
10
|
10
|
+
end
|
11
|
+
|
12
|
+
def setup
|
13
|
+
clear
|
14
|
+
|
15
|
+
remaining = game.word.remaining
|
16
|
+
window.attron(Ncurses::A_BOLD)
|
17
|
+
|
18
|
+
if will_overflow?
|
19
|
+
puts remaining, h: :center, v: :center
|
20
|
+
else
|
21
|
+
text = remaining.ascii(font: 'roman')
|
22
|
+
|
23
|
+
text.lines.each do |line|
|
24
|
+
puts line, h: :center
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
window.attroff(Ncurses::A_BOLD)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def will_overflow?
|
34
|
+
game.word.string.ascii_size(font: 'roman') >= parent.size.columns
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Basher
|
2
|
+
module UI
|
3
|
+
class DebugView < BaseView
|
4
|
+
attr_accessor :game
|
5
|
+
attr_accessor :last_input
|
6
|
+
|
7
|
+
def self.lines
|
8
|
+
1
|
9
|
+
end
|
10
|
+
|
11
|
+
def setup
|
12
|
+
draw_text = -> {
|
13
|
+
setup_left_part
|
14
|
+
setup_right_part
|
15
|
+
}
|
16
|
+
|
17
|
+
if game.state.in_game?
|
18
|
+
clear
|
19
|
+
render every: 0.04 do
|
20
|
+
draw_text.call
|
21
|
+
end
|
22
|
+
else
|
23
|
+
clear
|
24
|
+
draw_text.call
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def setup_left_part
|
31
|
+
state = game.state.current
|
32
|
+
left_part = [state, last_input].compact
|
33
|
+
|
34
|
+
if game.state.in_game?
|
35
|
+
seconds_elapsed = game.timer.total_elapsed
|
36
|
+
left_part.unshift seconds_elapsed
|
37
|
+
end
|
38
|
+
|
39
|
+
puts left_part.join(' | '), h: :left
|
40
|
+
end
|
41
|
+
|
42
|
+
def setup_right_part
|
43
|
+
active_views = game.send(:current_views).map do |v|
|
44
|
+
v.class.to_s.gsub(/^.*::/, '')
|
45
|
+
end.join(', ')
|
46
|
+
terminal_size = game.base_view.size
|
47
|
+
|
48
|
+
right_part = [active_views, terminal_size].join(' | ')
|
49
|
+
puts right_part, h: :right
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Basher
|
2
|
+
module UI
|
3
|
+
class InfoView < BaseView
|
4
|
+
attr_accessor :game
|
5
|
+
|
6
|
+
def self.lines
|
7
|
+
1
|
8
|
+
end
|
9
|
+
|
10
|
+
def setup
|
11
|
+
clear
|
12
|
+
window.attron(Ncurses::A_REVERSE)
|
13
|
+
|
14
|
+
# Draw the bar first
|
15
|
+
bar = Array.new(game.level.remaining.size, word_bar).join
|
16
|
+
puts bar, h: :center
|
17
|
+
|
18
|
+
# Add Level info above
|
19
|
+
puts "| Level #{game.level.difficulty} |", h: :center
|
20
|
+
|
21
|
+
window.attroff(Ncurses::A_REVERSE)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def word_bar
|
27
|
+
'-' * word_width
|
28
|
+
end
|
29
|
+
|
30
|
+
def word_width
|
31
|
+
size.columns / game.level.words.size
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Basher
|
2
|
+
module UI
|
3
|
+
class MenuView < BaseView
|
4
|
+
|
5
|
+
attr_accessor :state
|
6
|
+
|
7
|
+
def self.lines
|
8
|
+
1
|
9
|
+
end
|
10
|
+
|
11
|
+
def items
|
12
|
+
items = case state.current
|
13
|
+
when :menu then %w([S]-Start [Q]-Quit)
|
14
|
+
when :paused then %w([ESC]-Resume [Q]-Menu)
|
15
|
+
else []
|
16
|
+
end
|
17
|
+
items << "v #{Basher::VERSION}"
|
18
|
+
items.join(' | ')
|
19
|
+
end
|
20
|
+
|
21
|
+
def setup
|
22
|
+
puts items, h: :center
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Basher
|
2
|
+
module UI
|
3
|
+
class ProgressView < BaseView
|
4
|
+
attr_accessor :game
|
5
|
+
|
6
|
+
def self.lines
|
7
|
+
1
|
8
|
+
end
|
9
|
+
|
10
|
+
def setup
|
11
|
+
clear
|
12
|
+
render every: 0.1 do
|
13
|
+
clear(false)
|
14
|
+
window.attron(Ncurses::A_BOLD)
|
15
|
+
puts '=' * remaining, h: :left
|
16
|
+
window.attroff(Ncurses::A_BOLD)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def remaining
|
23
|
+
value = game.level.time_limit - game.level.timer.total_elapsed
|
24
|
+
result = value.to_f / game.level.time_limit
|
25
|
+
(size.columns * result).floor - 1
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Basher
|
2
|
+
module UI
|
3
|
+
class RemainingWordsView < BaseView
|
4
|
+
attr_accessor :game
|
5
|
+
|
6
|
+
def self.lines
|
7
|
+
1
|
8
|
+
end
|
9
|
+
|
10
|
+
def setup
|
11
|
+
clear
|
12
|
+
|
13
|
+
if will_overflow?
|
14
|
+
trimmed = remaining_words.join(' ')[0..(parent.columns - 1)]
|
15
|
+
words = trimmed[0..(trimmed.rindex(' ') - 1)]
|
16
|
+
else
|
17
|
+
words = remaining_words.join(' ')
|
18
|
+
end
|
19
|
+
|
20
|
+
puts words, h: :center
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def remaining_words
|
26
|
+
game.level.remaining[1..-1]
|
27
|
+
end
|
28
|
+
|
29
|
+
def will_overflow?
|
30
|
+
remaining_words.join(' ').size > columns
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Basher
|
2
|
+
module UI
|
3
|
+
class ScoreView < BaseView
|
4
|
+
attr_accessor :game
|
5
|
+
|
6
|
+
def self.lines
|
7
|
+
4
|
8
|
+
end
|
9
|
+
|
10
|
+
def setup
|
11
|
+
clear
|
12
|
+
|
13
|
+
misses = game.misses
|
14
|
+
wpm = game.wpm
|
15
|
+
cpm = game.cpm
|
16
|
+
|
17
|
+
puts "Level: #{game.level.difficulty}", h: :center
|
18
|
+
|
19
|
+
cursor.newline!
|
20
|
+
puts "(#{total_elapsed})", h: :center
|
21
|
+
|
22
|
+
cursor.newline!
|
23
|
+
puts "Words per minute: #{game.words_per_minute}", h: :center
|
24
|
+
|
25
|
+
cursor.newline!
|
26
|
+
puts "Chars per minute: #{game.chars_per_minute}", h: :center
|
27
|
+
|
28
|
+
cursor.newline!
|
29
|
+
puts "Accuracy: #{accuracy} (#{misses} misses)", h: :center
|
30
|
+
end
|
31
|
+
|
32
|
+
def total_elapsed
|
33
|
+
game.timer.total_elapsed_humanized
|
34
|
+
end
|
35
|
+
|
36
|
+
def accuracy
|
37
|
+
"#{game.accuracy} %"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Basher
|
2
|
+
module UI
|
3
|
+
class TitleView < BaseView
|
4
|
+
using Basher::StringRefinements
|
5
|
+
|
6
|
+
attr_accessor :state
|
7
|
+
|
8
|
+
def self.lines
|
9
|
+
11
|
10
|
+
end
|
11
|
+
|
12
|
+
def text
|
13
|
+
case state.current
|
14
|
+
when :menu then 'Basher!'
|
15
|
+
when :paused then 'Paused'
|
16
|
+
else ''
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def setup
|
21
|
+
if will_overflow?
|
22
|
+
puts text, h: :center, v: :center
|
23
|
+
else
|
24
|
+
text.ascii(font: 'broadway').lines.each do |line|
|
25
|
+
puts line, h: :center
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def will_overflow?
|
33
|
+
text.ascii_size(font: 'broadway') >= parent.columns
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/basher/word.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require 'artii'
|
3
|
+
|
4
|
+
module Basher
|
5
|
+
# Initializing a word with a string, returns a Basher::Word instance
|
6
|
+
# that holds a frozen reference to the original string, and has a cursor
|
7
|
+
# used for moving between the items in the string in a OOP fashion.
|
8
|
+
class Word
|
9
|
+
using Basher::StringRefinements
|
10
|
+
|
11
|
+
# Delegate cursor methods to the word itself.
|
12
|
+
extend Forwardable
|
13
|
+
def_delegators :cursor, :position, :previous,
|
14
|
+
:remaining, :advance!, :rewind!, :finished?
|
15
|
+
def_delegator :cursor, :item, :char
|
16
|
+
def_delegator :string, :size
|
17
|
+
|
18
|
+
# Frozen reference of the word.
|
19
|
+
attr_reader :string
|
20
|
+
# Basher::Word::Cursor instance.
|
21
|
+
attr_reader :cursor
|
22
|
+
|
23
|
+
# Returns a Word instance for the given string. The cursor's public
|
24
|
+
# methods are delegated to this instance as well.
|
25
|
+
def initialize(string)
|
26
|
+
@string = string.dup.freeze
|
27
|
+
@cursor = Cursor.new(@string)
|
28
|
+
end
|
29
|
+
|
30
|
+
# :nodoc:
|
31
|
+
def inspect
|
32
|
+
string
|
33
|
+
end
|
34
|
+
|
35
|
+
# :nodoc:
|
36
|
+
def to_s
|
37
|
+
string
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
metadata
ADDED
@@ -0,0 +1,189 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: basher-basher
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- shuriu
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-02-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.11'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.11'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '5.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '5.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: binding_of_caller
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry-byebug
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: curtis
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.1.3
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.1.3
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: artii
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 2.1.1
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 2.1.1
|
125
|
+
description:
|
126
|
+
email:
|
127
|
+
- stefan.rotariu@gmail.com
|
128
|
+
executables:
|
129
|
+
- basher
|
130
|
+
extensions: []
|
131
|
+
extra_rdoc_files: []
|
132
|
+
files:
|
133
|
+
- ".gitignore"
|
134
|
+
- ".travis.yml"
|
135
|
+
- Gemfile
|
136
|
+
- LICENSE.txt
|
137
|
+
- README.md
|
138
|
+
- Rakefile
|
139
|
+
- basher.gemspec
|
140
|
+
- bin/basher
|
141
|
+
- bin/console
|
142
|
+
- bin/setup
|
143
|
+
- lib/basher.rb
|
144
|
+
- lib/basher/cursor.rb
|
145
|
+
- lib/basher/dictionary.rb
|
146
|
+
- lib/basher/game.rb
|
147
|
+
- lib/basher/handler.rb
|
148
|
+
- lib/basher/level.rb
|
149
|
+
- lib/basher/refinements/string.rb
|
150
|
+
- lib/basher/state.rb
|
151
|
+
- lib/basher/timer.rb
|
152
|
+
- lib/basher/ui.rb
|
153
|
+
- lib/basher/ui/base_view.rb
|
154
|
+
- lib/basher/ui/current_word_view.rb
|
155
|
+
- lib/basher/ui/debug_view.rb
|
156
|
+
- lib/basher/ui/info_view.rb
|
157
|
+
- lib/basher/ui/loading_view.rb
|
158
|
+
- lib/basher/ui/menu_view.rb
|
159
|
+
- lib/basher/ui/progress_view.rb
|
160
|
+
- lib/basher/ui/remaining_words_view.rb
|
161
|
+
- lib/basher/ui/score_view.rb
|
162
|
+
- lib/basher/ui/title_view.rb
|
163
|
+
- lib/basher/version.rb
|
164
|
+
- lib/basher/word.rb
|
165
|
+
homepage: https://github.com/shuriu/basher
|
166
|
+
licenses:
|
167
|
+
- MIT
|
168
|
+
metadata: {}
|
169
|
+
post_install_message:
|
170
|
+
rdoc_options: []
|
171
|
+
require_paths:
|
172
|
+
- lib
|
173
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
174
|
+
requirements:
|
175
|
+
- - ">="
|
176
|
+
- !ruby/object:Gem::Version
|
177
|
+
version: '0'
|
178
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
|
+
requirements:
|
180
|
+
- - ">="
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: '0'
|
183
|
+
requirements: []
|
184
|
+
rubyforge_project:
|
185
|
+
rubygems_version: 2.5.1
|
186
|
+
signing_key:
|
187
|
+
specification_version: 4
|
188
|
+
summary: Small CLI text game that tests your typing speed.
|
189
|
+
test_files: []
|