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.
@@ -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,11 @@
1
+ module Basher
2
+ module UI
3
+ class LoadingView < BaseView
4
+ attr_accessor :text
5
+
6
+ def setup
7
+ puts text, h: :center, v: :center
8
+ end
9
+ end
10
+ end
11
+ 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
@@ -0,0 +1,3 @@
1
+ module Basher
2
+ VERSION = "0.1.1"
3
+ end
@@ -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: []