delve 0.0.7

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.
Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +24 -0
  5. data/LICENSE +25 -0
  6. data/README.md +6 -0
  7. data/ROADMAP.md +92 -0
  8. data/Rakefile +25 -0
  9. data/bin/delve +15 -0
  10. data/delve.gemspec +17 -0
  11. data/doc/examples/ascii.rb +34 -0
  12. data/doc/examples/astar.rb +39 -0
  13. data/doc/examples/border.rb +13 -0
  14. data/doc/examples/cellular.rb +15 -0
  15. data/doc/examples/display.rb +27 -0
  16. data/doc/examples/engine.rb +29 -0
  17. data/doc/examples/menu.rb +22 -0
  18. data/doc/examples/noise.rb +37 -0
  19. data/doc/examples/progress.rb +25 -0
  20. data/doc/examples/rogue.rb +15 -0
  21. data/lib/delve.rb +109 -0
  22. data/lib/delve/component/collision.rb +17 -0
  23. data/lib/delve/component/movement.rb +78 -0
  24. data/lib/delve/component/position.rb +30 -0
  25. data/lib/delve/component/symbol.rb +23 -0
  26. data/lib/delve/display/curses_renderer.rb +63 -0
  27. data/lib/delve/display/display.rb +51 -0
  28. data/lib/delve/engine.rb +30 -0
  29. data/lib/delve/entity.rb +23 -0
  30. data/lib/delve/event_queue.rb +48 -0
  31. data/lib/delve/fov/discrete_shadowcasting.rb +78 -0
  32. data/lib/delve/fov/fov.rb +83 -0
  33. data/lib/delve/game.rb +22 -0
  34. data/lib/delve/generator/cellular.rb +111 -0
  35. data/lib/delve/generator/dungeon.rb +19 -0
  36. data/lib/delve/generator/map.rb +30 -0
  37. data/lib/delve/generator/noise.rb +33 -0
  38. data/lib/delve/generator/rogue.rb +403 -0
  39. data/lib/delve/input/curses_input.rb +28 -0
  40. data/lib/delve/input/input.rb +12 -0
  41. data/lib/delve/path/astar.rb +83 -0
  42. data/lib/delve/path/path.rb +70 -0
  43. data/lib/delve/scheduler/action_scheduler.rb +38 -0
  44. data/lib/delve/scheduler/scheduler.rb +37 -0
  45. data/lib/delve/scheduler/simple_scheduler.rb +21 -0
  46. data/lib/delve/screen_manager.rb +41 -0
  47. data/lib/delve/widgets/border.rb +44 -0
  48. data/lib/delve/widgets/key_value.rb +36 -0
  49. data/lib/delve/widgets/menu.rb +84 -0
  50. data/lib/delve/widgets/multi_line.rb +51 -0
  51. data/lib/delve/widgets/progress.rb +37 -0
  52. data/lib/delve/widgets/text.rb +37 -0
  53. data/lib/delve/widgets/viewport.rb +67 -0
  54. data/rot.js.LICENSE +25 -0
  55. data/templates/Gemfile.erb +4 -0
  56. data/templates/README.md.erb +22 -0
  57. data/templates/binfile.erb +21 -0
  58. data/templates/game_screen.rb.erb +51 -0
  59. data/templates/gemspec.erb +27 -0
  60. data/templates/loading_screen.rb.erb +46 -0
  61. data/templates/player_factory.rb.erb +19 -0
  62. data/templates/title_screen.rb.erb +42 -0
  63. data/templates/world.rb.erb +63 -0
  64. data/test/component/collision_test.rb +39 -0
  65. data/test/component/movement_test.rb +155 -0
  66. data/test/component/position_test.rb +43 -0
  67. data/test/component/symbol_test.rb +30 -0
  68. data/test/delve_test.rb +61 -0
  69. data/test/display/curses_renderer_test.rb +60 -0
  70. data/test/display/display_test.rb +86 -0
  71. data/test/engine_test.rb +36 -0
  72. data/test/entity_test.rb +48 -0
  73. data/test/event_queue_test.rb +86 -0
  74. data/test/game_test.rb +47 -0
  75. data/test/generator/dungeon_test.rb +21 -0
  76. data/test/generator/map_test.rb +31 -0
  77. data/test/generator/noise_test.rb +49 -0
  78. data/test/input/curses_input_test.rb +24 -0
  79. data/test/input/input_test.rb +21 -0
  80. data/test/path/astar_test.rb +22 -0
  81. data/test/path/path_test.rb +41 -0
  82. data/test/scheduler/action_scheduler_test.rb +54 -0
  83. data/test/scheduler/scheduler_test.rb +50 -0
  84. data/test/scheduler/simple_scheduler_test.rb +33 -0
  85. data/test/screen_manager_test.rb +92 -0
  86. data/test/widgets/border_test.rb +60 -0
  87. data/test/widgets/key_value_test.rb +68 -0
  88. data/test/widgets/menu_test.rb +103 -0
  89. data/test/widgets/multi_line_test.rb +73 -0
  90. data/test/widgets/progress_test.rb +96 -0
  91. data/test/widgets/text_test.rb +66 -0
  92. data/test/widgets/viewport_test.rb +154 -0
  93. metadata +193 -0
@@ -0,0 +1,96 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'delve/widgets/progress'
4
+ require 'mocha/setup'
5
+
6
+ class ProgressWidgetTest < Minitest::Test
7
+
8
+ def setup
9
+ @x = 1
10
+ @y = 1
11
+ @width = 5
12
+ @current = 12
13
+ @max = 12
14
+ @bg = :white
15
+ @fg = :red
16
+ @widget = ProgressWidget.new @x, @y, @width, @current, @max, @fg, @bg
17
+ @display = mock('object')
18
+ end
19
+
20
+ def test_initialising_without_x_position_raises_error
21
+ assert_raises RuntimeError do
22
+ ProgressWidget.new nil, @y, @width, @current, @max, @fg, @bg
23
+ end
24
+ end
25
+
26
+ def test_initialising_without_y_position_raises_error
27
+ assert_raises RuntimeError do
28
+ ProgressWidget.new @x, nil, @width, @current, @max, @fg, @bg
29
+ end
30
+ end
31
+
32
+ def test_initialising_without_width_raises_error
33
+ assert_raises RuntimeError do
34
+ ProgressWidget.new @x, @y, nil, @current, @max, @fg, @bg
35
+ end
36
+ end
37
+
38
+ def test_initialising_without_fg_raises_error
39
+ assert_raises RuntimeError do
40
+ ProgressWidget.new @x, @y, @width, @current, @max, nil, @bg
41
+ end
42
+ end
43
+
44
+ def test_initialising_without_bg_raises_error
45
+ assert_raises RuntimeError do
46
+ ProgressWidget.new @x, @y, @width, @current, @max, @fg, nil
47
+ end
48
+ end
49
+
50
+ def test_initialising_without_current_raises_error
51
+ assert_raises RuntimeError do
52
+ ProgressWidget.new @x, @y, @width, nil, @max, @fg, @bg
53
+ end
54
+ end
55
+
56
+ def test_initialising_without_max_raises_error
57
+ assert_raises RuntimeError do
58
+ ProgressWidget.new @x, @y, @width, @current, nil, @fg, @bg
59
+ end
60
+ end
61
+
62
+ def test_render_fails_if_no_display_is_given
63
+ assert_raises RuntimeError do
64
+ @widget.draw nil
65
+ end
66
+ end
67
+
68
+ def test_render_full
69
+ @display.expects(:draw).with(1, 1, ' ', @fg, @fg)
70
+ @display.expects(:draw).with(2, 1, ' ', @fg, @fg)
71
+ @display.expects(:draw).with(3, 1, ' ', @fg, @fg)
72
+ @display.expects(:draw).with(4, 1, ' ', @fg, @fg)
73
+ @display.expects(:draw).with(5, 1, ' ', @fg, @fg)
74
+ @widget.draw(@display)
75
+ end
76
+
77
+ def test_partially_full
78
+ @widget.current = 6
79
+ @display.expects(:draw).with(1, 1, ' ', @fg, @fg)
80
+ @display.expects(:draw).with(2, 1, ' ', @fg, @fg)
81
+ @display.expects(:draw).with(3, 1, ' ', @fg, @fg)
82
+ @display.expects(:draw).with(4, 1, ' ', @bg, @bg)
83
+ @display.expects(:draw).with(5, 1, ' ', @bg, @bg)
84
+ @widget.draw(@display)
85
+ end
86
+
87
+ def test_set_current_value
88
+ @widget.current = 2
89
+ assert_equal 2, @widget.current
90
+ end
91
+
92
+ def test_set_max_value
93
+ @widget.max = 100
94
+ assert_equal 100, @widget.max
95
+ end
96
+ end
@@ -0,0 +1,66 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'delve/widgets/text'
4
+
5
+ class TextWidgetTest < Minitest::Test
6
+
7
+ def test_initialising_without_x_position_raises_error
8
+ assert_raises RuntimeError do
9
+ TextWidget.new nil, 5, 'This is some text'
10
+ end
11
+ end
12
+
13
+ def test_initialising_without_y_position_raises_error
14
+ assert_raises RuntimeError do
15
+ TextWidget.new 5, nil, 'This is some more text'
16
+ end
17
+ end
18
+
19
+ def test_initialising_without_text_raises_error
20
+ assert_raises RuntimeError do
21
+ TextWidget.new 5, 5, nil
22
+ end
23
+ end
24
+
25
+ def test_render_fails_if_no_display_is_given
26
+ widget = TextWidget.new 2, 2, 'Text'
27
+ assert_raises RuntimeError do
28
+ widget.draw nil
29
+ end
30
+ end
31
+
32
+ def test_render_centered_horizontally
33
+ widget = TextWidget.new :center, 0, 'abc'
34
+ display = mock('object')
35
+ display.expects(:width).returns(10)
36
+ display.expects(:draw).with(4, 0, 'a')
37
+ display.expects(:draw).with(5, 0, 'b')
38
+ display.expects(:draw).with(6, 0, 'c')
39
+ widget.draw display
40
+ end
41
+
42
+ def test_render_centered_vertically
43
+ widget = TextWidget.new 0, :center, 'abc'
44
+ display = mock('object')
45
+ display.expects(:height).returns(10)
46
+ display.expects(:draw).with(0, 5, 'a')
47
+ display.expects(:draw).with(1, 5, 'b')
48
+ display.expects(:draw).with(2, 5, 'c')
49
+ widget.draw display
50
+ end
51
+
52
+ def test_render
53
+ display = mock('onject')
54
+ widget = TextWidget.new 1, 1, 'Some text'
55
+ display.expects(:draw).with(1, 1, 'S')
56
+ display.expects(:draw).with(2, 1, 'o')
57
+ display.expects(:draw).with(3, 1, 'm')
58
+ display.expects(:draw).with(4, 1, 'e')
59
+ display.expects(:draw).with(5, 1, ' ')
60
+ display.expects(:draw).with(6, 1, 't')
61
+ display.expects(:draw).with(7, 1, 'e')
62
+ display.expects(:draw).with(8, 1, 'x')
63
+ display.expects(:draw).with(9, 1, 't')
64
+ widget.draw(display)
65
+ end
66
+ end
@@ -0,0 +1,154 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'delve/widgets/viewport'
4
+
5
+ class ViewportWidgetTest < Minitest::Test
6
+
7
+ def setup
8
+ @x = 1
9
+ @y = 1
10
+ @width = 3
11
+ @height = 3
12
+ @world = mock('object')
13
+ @display = mock('object')
14
+
15
+ @viewport = ViewportWidget.new @x, @y, @width, @height, @world
16
+ end
17
+
18
+ def test_initialize_without_x_fails
19
+ assert_raises RuntimeError do
20
+ ViewportWidget.new nil, @y, @width, @height, @world
21
+ end
22
+ end
23
+
24
+ def test_initialize_without_y_fails
25
+ assert_raises RuntimeError do
26
+ ViewportWidget.new @x, nil, @width, @height, @world
27
+ end
28
+ end
29
+
30
+ def test_initialize_without_width_fails
31
+ assert_raises RuntimeError do
32
+ ViewportWidget.new @x, @y, nil, @height, @world
33
+ end
34
+ end
35
+
36
+ def test_initialize_without_height_fails
37
+ assert_raises RuntimeError do
38
+ ViewportWidget.new @x, @y, @width, nil, @world
39
+ end
40
+ end
41
+
42
+ def test_initialize_without_world_fails
43
+ assert_raises RuntimeError do
44
+ ViewportWidget.new @x, @y, @width, @height, nil
45
+ end
46
+ end
47
+
48
+ def test_focus_west_of_0_fails
49
+ assert_raises RuntimeError do
50
+ @viewport.focus -1, 5
51
+ end
52
+ end
53
+
54
+ def test_focus_north_of_0_fails
55
+ assert_raises RuntimeError do
56
+ @viewport.focus 4, -1
57
+ end
58
+ end
59
+
60
+ def test_focus_east_of_width_fails
61
+ @world.expects(:width).returns(10)
62
+ assert_raises RuntimeError do
63
+ @viewport.focus 10, 1
64
+ end
65
+ end
66
+
67
+ def test_focus_south_off_height_fails
68
+ @world.stubs(:width).returns(18)
69
+ @world.expects(:height).returns(9)
70
+ assert_raises RuntimeError do
71
+ @viewport.focus 1, 9
72
+ end
73
+ end
74
+
75
+ def test_draw_without_display_fails
76
+ assert_raises RuntimeError do
77
+ @viewport.draw nil
78
+ end
79
+ end
80
+
81
+ def test_focus_at_5_5_renders_4_4_to_6_6
82
+ @world.stubs(:width).returns(20)
83
+ @world.stubs(:height).returns(100)
84
+ expect_world 4, 4, 6, 6
85
+ expect_draw 1, 1, 3, 3
86
+
87
+ @viewport.focus 5, 5
88
+ @viewport.draw @display
89
+ end
90
+
91
+ def test_focus_at_0_0_renders_0_0_to_2_2
92
+ @world.stubs(:width).returns(20)
93
+ @world.stubs(:height).returns(100)
94
+ expect_world 0, 0, 2, 2
95
+ expect_draw 1, 1, 3, 3
96
+
97
+ @viewport.focus 0, 0
98
+ @viewport.draw @display
99
+ end
100
+
101
+ def test_focus_at_99_99_renders_97_97_to_99_99
102
+ @world.stubs(:width).returns(100)
103
+ @world.stubs(:height).returns(100)
104
+ expect_world 97, 97, 99, 99
105
+ expect_draw 1, 1, 3, 3
106
+
107
+ @viewport.focus 99, 99
108
+ @viewport.draw @display
109
+ end
110
+
111
+ def test_focus_at_0_0_puts_top_left_at_0_0
112
+ @world.stubs(:width).returns(100)
113
+ @world.stubs(:height).returns(100)
114
+
115
+ @viewport.focus 0, 0
116
+ assert_equal 0, @viewport.top_left[:x]
117
+ assert_equal 0, @viewport.top_left[:y]
118
+ end
119
+
120
+ def test_focus_at_99_99_puts_top_left_at_97_97
121
+ @world.stubs(:width).returns(100)
122
+ @world.stubs(:height).returns(100)
123
+
124
+ @viewport.focus 99, 99
125
+ assert_equal 97, @viewport.top_left[:x]
126
+ assert_equal 97, @viewport.top_left[:y]
127
+ end
128
+
129
+ def test_width
130
+ assert_equal @width, @viewport.width
131
+ end
132
+
133
+ def test_height
134
+ assert_equal @height, @viewport.height
135
+ end
136
+
137
+ private
138
+ def expect_world(sx, sy, ex, ey)
139
+ (sx..ex).each do |x|
140
+ (sy..ey).each do |y|
141
+ @world.expects(:at).with(x, y).returns({ :char => '.', :color => :white, :walkable => true })
142
+ end
143
+ end
144
+ end
145
+
146
+ def expect_draw(sx, sy, ex, ey)
147
+ (sx..ex).each do |x|
148
+ (sy..ey).each do |y|
149
+ @display.expects(:draw).with(x, y, '.', :white)
150
+ end
151
+ end
152
+ end
153
+
154
+ end
metadata ADDED
@@ -0,0 +1,193 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: delve
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.7
5
+ platform: ruby
6
+ authors:
7
+ - Benny Hallett
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 10.1.1
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 10.1.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 5.2.2
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 5.2.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: mocha
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.0.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.0.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: perlin_noise
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.1.2
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 0.1.2
69
+ description: Roguelike library inspired by rot.js and libtcod. Allows developers to
70
+ get a jumpstart on their roguelike development, by running a single command to get
71
+ started with an "@ walking around the world" demo.
72
+ email:
73
+ executables:
74
+ - delve
75
+ extensions: []
76
+ extra_rdoc_files: []
77
+ files:
78
+ - ".gitignore"
79
+ - Gemfile
80
+ - Gemfile.lock
81
+ - LICENSE
82
+ - README.md
83
+ - ROADMAP.md
84
+ - Rakefile
85
+ - bin/delve
86
+ - delve.gemspec
87
+ - doc/examples/ascii.rb
88
+ - doc/examples/astar.rb
89
+ - doc/examples/border.rb
90
+ - doc/examples/cellular.rb
91
+ - doc/examples/display.rb
92
+ - doc/examples/engine.rb
93
+ - doc/examples/menu.rb
94
+ - doc/examples/noise.rb
95
+ - doc/examples/progress.rb
96
+ - doc/examples/rogue.rb
97
+ - lib/delve.rb
98
+ - lib/delve/component/collision.rb
99
+ - lib/delve/component/movement.rb
100
+ - lib/delve/component/position.rb
101
+ - lib/delve/component/symbol.rb
102
+ - lib/delve/display/curses_renderer.rb
103
+ - lib/delve/display/display.rb
104
+ - lib/delve/engine.rb
105
+ - lib/delve/entity.rb
106
+ - lib/delve/event_queue.rb
107
+ - lib/delve/fov/discrete_shadowcasting.rb
108
+ - lib/delve/fov/fov.rb
109
+ - lib/delve/game.rb
110
+ - lib/delve/generator/cellular.rb
111
+ - lib/delve/generator/dungeon.rb
112
+ - lib/delve/generator/map.rb
113
+ - lib/delve/generator/noise.rb
114
+ - lib/delve/generator/rogue.rb
115
+ - lib/delve/input/curses_input.rb
116
+ - lib/delve/input/input.rb
117
+ - lib/delve/path/astar.rb
118
+ - lib/delve/path/path.rb
119
+ - lib/delve/scheduler/action_scheduler.rb
120
+ - lib/delve/scheduler/scheduler.rb
121
+ - lib/delve/scheduler/simple_scheduler.rb
122
+ - lib/delve/screen_manager.rb
123
+ - lib/delve/widgets/border.rb
124
+ - lib/delve/widgets/key_value.rb
125
+ - lib/delve/widgets/menu.rb
126
+ - lib/delve/widgets/multi_line.rb
127
+ - lib/delve/widgets/progress.rb
128
+ - lib/delve/widgets/text.rb
129
+ - lib/delve/widgets/viewport.rb
130
+ - rot.js.LICENSE
131
+ - templates/Gemfile.erb
132
+ - templates/README.md.erb
133
+ - templates/binfile.erb
134
+ - templates/game_screen.rb.erb
135
+ - templates/gemspec.erb
136
+ - templates/loading_screen.rb.erb
137
+ - templates/player_factory.rb.erb
138
+ - templates/title_screen.rb.erb
139
+ - templates/world.rb.erb
140
+ - test/component/collision_test.rb
141
+ - test/component/movement_test.rb
142
+ - test/component/position_test.rb
143
+ - test/component/symbol_test.rb
144
+ - test/delve_test.rb
145
+ - test/display/curses_renderer_test.rb
146
+ - test/display/display_test.rb
147
+ - test/engine_test.rb
148
+ - test/entity_test.rb
149
+ - test/event_queue_test.rb
150
+ - test/game_test.rb
151
+ - test/generator/dungeon_test.rb
152
+ - test/generator/map_test.rb
153
+ - test/generator/noise_test.rb
154
+ - test/input/curses_input_test.rb
155
+ - test/input/input_test.rb
156
+ - test/path/astar_test.rb
157
+ - test/path/path_test.rb
158
+ - test/scheduler/action_scheduler_test.rb
159
+ - test/scheduler/scheduler_test.rb
160
+ - test/scheduler/simple_scheduler_test.rb
161
+ - test/screen_manager_test.rb
162
+ - test/widgets/border_test.rb
163
+ - test/widgets/key_value_test.rb
164
+ - test/widgets/menu_test.rb
165
+ - test/widgets/multi_line_test.rb
166
+ - test/widgets/progress_test.rb
167
+ - test/widgets/text_test.rb
168
+ - test/widgets/viewport_test.rb
169
+ homepage: https://github.com/BennyHallett/delve
170
+ licenses:
171
+ - BSD
172
+ metadata: {}
173
+ post_install_message:
174
+ rdoc_options: []
175
+ require_paths:
176
+ - lib
177
+ required_ruby_version: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ required_rubygems_version: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ requirements: []
188
+ rubyforge_project:
189
+ rubygems_version: 2.2.2
190
+ signing_key:
191
+ specification_version: 4
192
+ summary: Roguelike library inspired by rot.js and libtcod
193
+ test_files: []