need_for_type 0.2.2 → 0.3.0
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/README.md +1 -1
- data/lib/need_for_type/api.rb +23 -0
- data/lib/need_for_type/display_window.rb +48 -9
- data/lib/need_for_type/file_manager.rb +4 -6
- data/lib/need_for_type/states/end.rb +12 -7
- data/lib/need_for_type/states/game.rb +5 -2
- data/lib/need_for_type/states/submit_score.rb +36 -0
- data/lib/need_for_type/states.rb +1 -0
- data/lib/need_for_type/version.rb +1 -1
- metadata +32 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e9ac057bc5ffec238c4c19a18199453c10ee97e
|
4
|
+
data.tar.gz: 57f4b54ab2ac962fab3d459adbf23166a10db4d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 400d012e3c798d9900471714fe1bd861994b96b25c1cbeb637ec2a1f66fe6713390dc6149de063d74811c59c4fa7261c97aa8d9579badba56cf199783d4c9537
|
7
|
+
data.tar.gz: e3b390ee4248032e478a91f00513fbd0fbb6d21c48ce20e129eb1b2d8577efa0305113dc1caac2e00055ef6d0ddabfe3ee342465c056d09fb309abb604e4b0bf
|
data/README.md
CHANGED
@@ -28,7 +28,7 @@ You can run `./bin/console` for an interactive prompt that will allow you to exp
|
|
28
28
|
|
29
29
|
To install the development version of the gem onto your local machine, run `bundle exec rake install`.
|
30
30
|
|
31
|
-
To release a new version, update the version number in `version.rb
|
31
|
+
To release a new version, update the version number in `version.rb` and update the `CHANGELOG.md` accordingly, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
32
|
|
33
33
|
|
34
34
|
## Contributing
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'httparty'
|
3
|
+
|
4
|
+
module NeedForType::API
|
5
|
+
@@api_url = 'need-for-type.herokuapp.com'
|
6
|
+
|
7
|
+
def get_scores(text_id)
|
8
|
+
url = "https://#{@@api_url}/v1/scores?text_id=#{text_id}"
|
9
|
+
response = HTTParty.get(url)
|
10
|
+
JSON.parse(response.body)
|
11
|
+
end
|
12
|
+
|
13
|
+
def post_score(username, text_id, stats)
|
14
|
+
url = "https://#{@@api_url}/v1/scores"
|
15
|
+
headers = { 'Content-Type' => 'application/json' }
|
16
|
+
body = { score: { username: username,
|
17
|
+
text_id: text_id,
|
18
|
+
wpm: stats[:wpm],
|
19
|
+
time: stats[:total_time],
|
20
|
+
accuracy: stats[:accuracy] } }
|
21
|
+
HTTParty.post(url, headers: headers, body: body.to_json)
|
22
|
+
end
|
23
|
+
end
|
@@ -51,26 +51,52 @@ module NeedForType
|
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
-
def render_end(stats, selected_option)
|
54
|
+
def render_end(stats, scores, selected_option)
|
55
55
|
self.render_box do
|
56
56
|
self.render_with_color(GREEN) do
|
57
57
|
self.set_render_pos(3, 4)
|
58
58
|
self.addstr("Congratulations you crossed the finish line!")
|
59
59
|
|
60
|
-
|
60
|
+
self.set_render_pos(5, 4)
|
61
|
+
self.addstr("Your score:")
|
61
62
|
end
|
63
|
+
render_stats(stats, 6, 4, :vertical)
|
62
64
|
|
63
|
-
self.set_render_pos(
|
65
|
+
self.set_render_pos(10, 4)
|
66
|
+
self.render_text("Top scores:", GREEN, NORMAL)
|
67
|
+
render_scores(scores, 11, 4)
|
68
|
+
|
69
|
+
self.set_render_pos(17, 4)
|
64
70
|
mode = standout_mode(0, selected_option)
|
65
|
-
self.render_text("1.
|
71
|
+
self.render_text("1. Submit Score", WHITE, mode)
|
66
72
|
|
67
|
-
self.set_render_pos(
|
73
|
+
self.set_render_pos(18, 4)
|
68
74
|
mode = standout_mode(1, selected_option)
|
69
|
-
self.render_text("2.
|
75
|
+
self.render_text("2. Restart", WHITE, mode)
|
70
76
|
|
71
|
-
self.set_render_pos(
|
77
|
+
self.set_render_pos(19, 4)
|
72
78
|
mode = standout_mode(2, selected_option)
|
73
|
-
self.render_text("3.
|
79
|
+
self.render_text("3. Main Menu", WHITE, mode)
|
80
|
+
|
81
|
+
self.set_render_pos(20, 4)
|
82
|
+
mode = standout_mode(3, selected_option)
|
83
|
+
self.render_text("4. Exit", WHITE, mode)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def render_submit_score(username)
|
88
|
+
self.render_box do
|
89
|
+
self.set_render_pos(3, 4)
|
90
|
+
self.render_text("Submit your score !", GREEN, NORMAL)
|
91
|
+
|
92
|
+
self.set_render_pos(5, 4)
|
93
|
+
self.addstr("Type your username...")
|
94
|
+
|
95
|
+
self.set_render_pos(6, 4)
|
96
|
+
self.addstr(username)
|
97
|
+
|
98
|
+
self.set_render_pos(8, 4)
|
99
|
+
self.addstr("Click ENTER to submit")
|
74
100
|
end
|
75
101
|
end
|
76
102
|
|
@@ -87,8 +113,8 @@ module NeedForType
|
|
87
113
|
|
88
114
|
def render_stats(stats, y, x, mode)
|
89
115
|
stats_text = [
|
90
|
-
"Time: #{stats[:total_time].round(2)} sec",
|
91
116
|
"WPM: #{stats[:wpm].round}",
|
117
|
+
"Time: #{stats[:total_time].round(2)} sec",
|
92
118
|
"Accuracy: #{stats[:accuracy].round(2)} %"
|
93
119
|
]
|
94
120
|
|
@@ -104,5 +130,18 @@ module NeedForType
|
|
104
130
|
end
|
105
131
|
end
|
106
132
|
end
|
133
|
+
|
134
|
+
def render_scores(scores, y, x)
|
135
|
+
if scores.empty?
|
136
|
+
self.set_render_pos(y + 1, x)
|
137
|
+
self.addstr("There are no score yet for this text.")
|
138
|
+
else
|
139
|
+
scores.each do |s|
|
140
|
+
self.set_render_pos(y, x)
|
141
|
+
self.addstr("#{s['wpm']} wpm #{s['username']}")
|
142
|
+
y += 1
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
107
146
|
end
|
108
147
|
end
|
@@ -1,17 +1,15 @@
|
|
1
1
|
module NeedForType
|
2
2
|
class FileManager
|
3
|
-
attr_accessor :
|
3
|
+
attr_accessor :text, :text_id
|
4
4
|
|
5
5
|
def initialize()
|
6
6
|
@path = "#{NeedForType::GEM_ROOT}/assets/texts/"
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
|
-
def get_random_text
|
9
|
+
def read_random_text
|
11
10
|
directory_count = Dir[File.join(@path, '**', '*')].count
|
12
|
-
|
13
|
-
|
14
|
-
@content = File.read("#{@path}/text-#{random_file}.txt").strip
|
11
|
+
@text_id = rand(1..directory_count)
|
12
|
+
@text = File.read("#{@path}/text-#{@text_id}.txt").strip
|
15
13
|
end
|
16
14
|
end
|
17
15
|
end
|
@@ -1,25 +1,30 @@
|
|
1
|
-
require 'curses'
|
2
|
-
|
3
1
|
require 'need_for_type/states'
|
2
|
+
require 'need_for_type/api'
|
4
3
|
|
5
4
|
module NeedForType::States
|
6
5
|
class End < Menu
|
6
|
+
include NeedForType::API
|
7
7
|
|
8
|
-
def initialize(display_window, stats, difficulty)
|
8
|
+
def initialize(display_window, stats, difficulty, text_id)
|
9
9
|
super(display_window)
|
10
|
-
@difficulty = difficulty
|
11
10
|
@stats = stats
|
11
|
+
@difficulty = difficulty
|
12
|
+
@text_id = text_id
|
13
|
+
|
12
14
|
@option = 0
|
15
|
+
@scores = get_scores(@text_id)
|
13
16
|
end
|
14
17
|
|
15
18
|
def update
|
16
|
-
@display_window.render_end(@stats, @option)
|
19
|
+
@display_window.render_end(@stats, @scores, @option)
|
17
20
|
|
18
|
-
input_worker(
|
21
|
+
input_worker(4) do
|
19
22
|
case @option
|
20
23
|
when 0
|
21
|
-
return NeedForType::States::
|
24
|
+
return NeedForType::States::SubmitScore.new(@display_window, self, @text_id, @stats)
|
22
25
|
when 1
|
26
|
+
return NeedForType::States::Game.new(@display_window, @difficulty)
|
27
|
+
when 2
|
23
28
|
return NeedForType::States::Start.new(@display_window)
|
24
29
|
end
|
25
30
|
end
|
@@ -44,7 +44,10 @@ module NeedForType::States
|
|
44
44
|
|
45
45
|
def handle_start_game
|
46
46
|
file_manager = NeedForType::FileManager.new
|
47
|
-
|
47
|
+
file_manager.read_random_text
|
48
|
+
@text = file_manager.text
|
49
|
+
@text_id = file_manager.text_id
|
50
|
+
|
48
51
|
@display_window.render_game_text(@text, @chars_completed, @stats)
|
49
52
|
@start_time = Time.now
|
50
53
|
|
@@ -106,7 +109,7 @@ module NeedForType::States
|
|
106
109
|
def handle_end_game
|
107
110
|
calculate_stats
|
108
111
|
|
109
|
-
return NeedForType::States::End.new(@display_window, @stats, @difficulty)
|
112
|
+
return NeedForType::States::End.new(@display_window, @stats, @difficulty, @text_id)
|
110
113
|
end
|
111
114
|
|
112
115
|
def calculate_stats
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'curses'
|
2
|
+
|
3
|
+
require 'need_for_type/states'
|
4
|
+
require 'need_for_type/api'
|
5
|
+
|
6
|
+
module NeedForType::States
|
7
|
+
class SubmitScore < State
|
8
|
+
include NeedForType::API
|
9
|
+
|
10
|
+
def initialize(display_window, end_state, text_id, stats)
|
11
|
+
super(display_window)
|
12
|
+
@end_state = end_state
|
13
|
+
@text_id = text_id
|
14
|
+
@stats = stats
|
15
|
+
|
16
|
+
@username = ''
|
17
|
+
end
|
18
|
+
|
19
|
+
def update
|
20
|
+
@display_window.render_submit_score(@username)
|
21
|
+
|
22
|
+
input = @display_window.get_input
|
23
|
+
|
24
|
+
if input == Curses::Key::ENTER || input == 10
|
25
|
+
post_score(@username, @text_id, @stats)
|
26
|
+
return @end_state
|
27
|
+
elsif input == Curses::Key::BACKSPACE || input == 127
|
28
|
+
@username = @username.chop
|
29
|
+
elsif input.is_a? String
|
30
|
+
@username += input
|
31
|
+
end
|
32
|
+
|
33
|
+
return self
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/need_for_type/states.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: need_for_type
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- tiagonbotelho
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-10-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -53,6 +53,34 @@ dependencies:
|
|
53
53
|
- - ">="
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: json
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: httparty
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
56
84
|
description: need-for-type is a terminal type racer inpired by Nitro Type
|
57
85
|
email:
|
58
86
|
- tiagonbotelho@gmail.com
|
@@ -773,6 +801,7 @@ files:
|
|
773
801
|
- assets/texts/text-99.txt
|
774
802
|
- bin/need_for_type
|
775
803
|
- lib/need_for_type.rb
|
804
|
+
- lib/need_for_type/api.rb
|
776
805
|
- lib/need_for_type/display_window.rb
|
777
806
|
- lib/need_for_type/file_manager.rb
|
778
807
|
- lib/need_for_type/states.rb
|
@@ -781,6 +810,7 @@ files:
|
|
781
810
|
- lib/need_for_type/states/menu.rb
|
782
811
|
- lib/need_for_type/states/start.rb
|
783
812
|
- lib/need_for_type/states/state.rb
|
813
|
+
- lib/need_for_type/states/submit_score.rb
|
784
814
|
- lib/need_for_type/typer.rb
|
785
815
|
- lib/need_for_type/version.rb
|
786
816
|
- lib/need_for_type/window.rb
|