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,50 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'mocha/setup'
4
+ require 'delve/scheduler/scheduler'
5
+
6
+ class SchedulerTest < Minitest::Test
7
+
8
+ def setup
9
+ @queue = mock('object')
10
+ @scheduler = Scheduler.new @queue
11
+ @item = 'item'
12
+ end
13
+
14
+ def test_get_time_from_event_queue
15
+ @queue.expects(:time).returns(10)
16
+ time = @scheduler.time
17
+ assert_equal 10, time
18
+ end
19
+
20
+ def test_get_next
21
+ @queue.expects(:get).returns(@item)
22
+ assert_equal @item, @scheduler.next
23
+ end
24
+
25
+ def test_remove_unknown_item_from_queue_returns_false
26
+ @queue.expects(:remove).with(@item).returns(false)
27
+ assert !@scheduler.remove(@item)
28
+ end
29
+
30
+ def test_remove_known_item_from_queue_returns_true
31
+ @queue.expects(:remove).with(@item).returns(true)
32
+ assert @scheduler.remove(@item)
33
+ end
34
+
35
+ def test_clear_clears_queue
36
+ @queue.expects(:clear)
37
+ @scheduler.clear
38
+ end
39
+
40
+ ## Not sure how exactly how to test this method
41
+
42
+ def test_add_non_repeating_item
43
+ @scheduler.add(@item)
44
+ end
45
+
46
+ def test_add_repeating_item
47
+ @scheduler.add(@item, true)
48
+ end
49
+
50
+ end
@@ -0,0 +1,33 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'mocha/setup'
4
+ require 'delve/scheduler/simple_scheduler'
5
+
6
+ class SimpleSchedulerTest < Minitest::Test
7
+
8
+ def setup
9
+ @queue = mock('object')
10
+ @scheduler = SimpleScheduler.new @queue
11
+ @item = 'item'
12
+ end
13
+
14
+ def test_add
15
+ @queue.expects(:add).with(@item, 0)
16
+ @scheduler.add(@item, false)
17
+ end
18
+
19
+ def test_next_without_repeating
20
+ @queue.expects(:get).returns(@item)
21
+ assert_equal @item, @scheduler.next
22
+ end
23
+
24
+ def test_next_with_repeating
25
+ @queue.expects(:get).twice.returns(@item)
26
+ @queue.expects(:add).with(@item, 0)
27
+ @scheduler.add(@item, true)
28
+ @queue.expects(:add).with(@item, 0)
29
+ @scheduler.next
30
+ assert_equal @item, @scheduler.next
31
+ end
32
+
33
+ end
@@ -0,0 +1,92 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'delve/screen_manager'
4
+
5
+ class ScreenManagerTest < Minitest::Test
6
+
7
+ def setup
8
+ @manager = ScreenManager.new
9
+ @screen = mock('object')
10
+ @display = mock('object')
11
+ @input = mock('object')
12
+ end
13
+
14
+ def test_empty_is_true_initially
15
+ assert @manager.empty?
16
+ @input = mock('object')
17
+ end
18
+
19
+ def test_push_first_screen
20
+ @manager.push_screen @screen
21
+ assert !@manager.empty?
22
+ end
23
+
24
+ def test_push_pop_first_screen
25
+ @manager.push_screen @screen
26
+ @manager.pop_screen
27
+ assert @manager.empty?
28
+ end
29
+
30
+ def test_send_events_to_top_screen
31
+ @screen.expects(:update).with(@input)
32
+ first_screen = mock('object')
33
+ first_screen.expects(:update).never
34
+
35
+ @manager.push_screen first_screen
36
+ @manager.push_screen @screen
37
+ @manager.update @input
38
+ end
39
+
40
+ def test_send_events_with_no_screen_should_fail
41
+ assert_raises RuntimeError do
42
+ @manager.update @input
43
+ end
44
+ end
45
+
46
+ def test_send_events_with_no_input_fails
47
+ @manager.push_screen @screen
48
+ assert_raises RuntimeError do
49
+ @manager.update nil
50
+ end
51
+ end
52
+
53
+ def test_cannot_render_with_no_screen
54
+ assert_raises RuntimeError do
55
+ @manager.render @display
56
+ end
57
+ end
58
+
59
+ def test_error_raised_when_display_is_nil
60
+ @manager.push_screen @screen
61
+ assert_raises RuntimeError do
62
+ @manager.render nil
63
+ end
64
+ end
65
+
66
+ def test_top_screen_is_rendered
67
+ @screen.expects(:render).with(@display)
68
+ @screen.expects(:partial?).returns(false)
69
+ first_screen = mock('object')
70
+ first_screen.expects(:render).never
71
+
72
+ @manager.push_screen first_screen
73
+ @manager.push_screen @screen
74
+ @manager.render @display
75
+ end
76
+
77
+ def test_partial_screen_rendering
78
+ @screen.expects(:render).with(@display)
79
+ @screen.expects(:partial?).returns(true)
80
+ first_screen = mock('object')
81
+ first_screen.expects(:render).never
82
+ first_screen.expects(:partial?).never
83
+ second_screen = mock('object')
84
+ second_screen.expects(:render).with(@display)
85
+ second_screen.expects(:partial?).returns(false)
86
+
87
+ @manager.push_screen first_screen
88
+ @manager.push_screen second_screen
89
+ @manager.push_screen @screen
90
+ @manager.render @display
91
+ end
92
+ end
@@ -0,0 +1,60 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'delve/widgets/border'
4
+
5
+ class BorderWidgetTest < Minitest::Test
6
+
7
+ def setup
8
+ @x = 1
9
+ @y = 1
10
+ @width = 10
11
+ @height = 4
12
+ @border = BorderWidget.new @x, @y, @width, @height
13
+ end
14
+
15
+ def test_initialising_without_x_position_raises_error
16
+ assert_raises RuntimeError do
17
+ BorderWidget.new nil, @y, @width, @height
18
+ end
19
+ end
20
+
21
+ def test_initialising_without_y_position_raises_error
22
+ assert_raises RuntimeError do
23
+ BorderWidget.new @x, nil, @width, @height
24
+ end
25
+ end
26
+
27
+ def test_initialising_without_width_raises_error
28
+ assert_raises RuntimeError do
29
+ BorderWidget.new @x, @y, nil, @height
30
+ end
31
+ end
32
+
33
+ def test_initalising_without_height_raises_error
34
+ assert_raises RuntimeError do
35
+ BorderWidget.new @x, @y, @width, nil
36
+ end
37
+ end
38
+
39
+ def test_initalising_with_text_smaller_than_text_with_plus_four_fails
40
+ assert_raises RuntimeError do
41
+ BorderWidget.new @x, @y, 6, 2, 'Some long text'
42
+ end
43
+ end
44
+
45
+ def test_render_fails_if_no_display_is_given
46
+ assert_raises RuntimeError do
47
+ @border.draw nil
48
+ end
49
+ end
50
+
51
+ def test_initialize_with_colors
52
+ BorderWidget.new @x, @y, @width, @height, nil, :red, :yellow
53
+ end
54
+
55
+ def test_render
56
+ display = mock('onject')
57
+ display.expects(:draw).times(24)
58
+ @border.draw(display)
59
+ end
60
+ end
@@ -0,0 +1,68 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'delve/widgets/key_value'
4
+
5
+ class KeyValueWidgetTest < Minitest::Test
6
+
7
+ def setup
8
+ @x = 1
9
+ @y = 1
10
+ @label = 'Name'
11
+ @value = 'Hero'
12
+ @widget = KeyValueWidget.new @x, @y, @label, @value
13
+ @display = mock('object')
14
+ end
15
+
16
+ def test_initialising_without_x_position_raises_error
17
+ assert_raises RuntimeError do
18
+ KeyValueWidget.new nil, @y, @label, @value
19
+ end
20
+ end
21
+
22
+ def test_initialising_without_y_position_raises_error
23
+ assert_raises RuntimeError do
24
+ KeyValueWidget.new @x, nil, @label, @value
25
+ end
26
+ end
27
+
28
+ def test_initialising_without_label_raises_error
29
+ assert_raises RuntimeError do
30
+ KeyValueWidget.new @x, @y, nil, @value
31
+ end
32
+ end
33
+
34
+ def test_initialising_without_value_raises_error
35
+ assert_raises RuntimeError do
36
+ KeyValueWidget.new @x, @y, @label, nil
37
+ end
38
+ end
39
+
40
+ def test_render_fails_if_no_display_is_given
41
+ assert_raises RuntimeError do
42
+ @widget.draw nil
43
+ end
44
+ end
45
+
46
+ def test_get_value
47
+ assert_equal @value, @widget.value
48
+ end
49
+
50
+ def test_set_value
51
+ @widget.value = 'Nameless'
52
+ assert_equal 'Nameless', @widget.value
53
+ end
54
+
55
+ def test_render
56
+ @display.expects(:draw).with(1, 1, 'N')
57
+ @display.expects(:draw).with(2, 1, 'a')
58
+ @display.expects(:draw).with(3, 1, 'm')
59
+ @display.expects(:draw).with(4, 1, 'e')
60
+ @display.expects(:draw).with(5, 1, ':')
61
+ @display.expects(:draw).with(6, 1, ' ')
62
+ @display.expects(:draw).with(7, 1, 'H')
63
+ @display.expects(:draw).with(8, 1, 'e')
64
+ @display.expects(:draw).with(9, 1, 'r')
65
+ @display.expects(:draw).with(10, 1, 'o')
66
+ @widget.draw(@display)
67
+ end
68
+ end
@@ -0,0 +1,103 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'delve/widgets/menu'
4
+
5
+ class MenuWidgetTest < Minitest::Test
6
+
7
+ def setup
8
+ @x = 5
9
+ @y = 5
10
+ @items = { 'n' => 'New Game', 'x' => 'Exit' }
11
+ @menu = MenuWidget.new @x, @y, @items
12
+ @display = mock('object')
13
+ end
14
+
15
+ def test_initialising_without_x_position_raises_error
16
+ assert_raises RuntimeError do
17
+ MenuWidget.new nil, @y, @items
18
+ end
19
+ end
20
+
21
+ def test_initialising_without_y_position_raises_error
22
+ assert_raises RuntimeError do
23
+ MenuWidget.new @x, nil, @items
24
+ end
25
+ end
26
+
27
+ def test_initialising_without_items_raises_error
28
+ assert_raises RuntimeError do
29
+ MenuWidget.new @x, @y, nil
30
+ end
31
+ end
32
+
33
+ def test_empty_items_fails
34
+ assert_raises RuntimeError do
35
+ MenuWidget.new @x, @y, Hash.new
36
+ end
37
+ end
38
+
39
+ def test_render_fails_if_no_display_is_given
40
+ assert_raises RuntimeError do
41
+ @menu.draw nil
42
+ end
43
+ end
44
+
45
+ def test_first_item_is_initially_selected
46
+ assert_equal 'New Game', @menu.selected_item
47
+ end
48
+
49
+ def test_move_down_selects_second_item
50
+ @menu.next
51
+ assert_equal 'Exit', @menu.selected_item
52
+ end
53
+
54
+ def test_move_down_then_up_selects_first_item
55
+ @menu.next
56
+ @menu.previous
57
+ assert_equal 'New Game', @menu.selected_item
58
+ end
59
+
60
+ def test_wrap_over_top
61
+ @menu.previous
62
+ assert_equal 'Exit', @menu.selected_item
63
+ end
64
+
65
+ def test_wrap_over_bottom
66
+ @menu.next
67
+ @menu.next
68
+ assert_equal 'New Game', @menu.selected_item
69
+ end
70
+
71
+ def test_false_returned_if_selecting_item_that_doesnt_exist
72
+ assert !@menu.select('p')
73
+ assert_equal 'New Game', @menu.selected_item
74
+ end
75
+
76
+ def test_selecting_by_key
77
+ assert @menu.select('x')
78
+ assert_equal 'Exit', @menu.selected_item
79
+ end
80
+
81
+ def test_render
82
+ @display.expects(:draw).times(12)
83
+ @menu.draw(@display)
84
+ end
85
+
86
+ def test_center_horizontally
87
+ @menu = MenuWidget.new :center, @y, {'a' => 'a'}
88
+ @display.expects(:width).returns(11)
89
+ @display.expects(:draw).with(6, @y, 'a', :red, :white)
90
+ @menu.draw @display
91
+ end
92
+
93
+ def test_center_vertically
94
+ @menu = MenuWidget.new @x, :center, {'a' => 'a'}
95
+ @display.expects(:height).returns(11)
96
+ @display.expects(:draw).with(@x, 6, 'a', :red, :white)
97
+ @menu.draw @display
98
+ end
99
+
100
+ def test_set_colors
101
+ MenuWidget.new @x, @y, @items, :red, :black, :green
102
+ end
103
+ end
@@ -0,0 +1,73 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'delve/widgets/multi_line'
4
+
5
+ class MultiLineWidgetTest < Minitest::Test
6
+
7
+ def setup
8
+ @x = 4
9
+ @y = 5
10
+ @lines = [ 'This is some text', 'With a new line' ]
11
+ @length = @lines[0].length + @lines[1].length
12
+ @widget = MultiLineWidget.new @x, @y, @lines
13
+ @display = mock('object')
14
+ end
15
+
16
+ def test_initialising_without_x_position_raises_error
17
+ assert_raises RuntimeError do
18
+ MultiLineWidget.new nil, @y, @lines
19
+ end
20
+ end
21
+
22
+ def test_initialising_without_y_position_raises_error
23
+ assert_raises RuntimeError do
24
+ MultiLineWidget.new @x, nil, @lines
25
+ end
26
+ end
27
+
28
+ def test_initialising_without_text_raises_error
29
+ assert_raises RuntimeError do
30
+ MultiLineWidget.new @x, @y, nil
31
+ end
32
+ end
33
+
34
+ def test_render_fails_if_no_display_is_given
35
+ assert_raises RuntimeError do
36
+ @widget.draw nil
37
+ end
38
+ end
39
+
40
+ def test_center_horizontally_on_odd_width_screen
41
+ @widget = MultiLineWidget.new :center, @y, ['a']
42
+ @display.expects(:width).returns(11)
43
+ @display.expects(:draw).with(6, @y, 'a')
44
+ @widget.draw @display
45
+ end
46
+
47
+ def test_center_horizontally_on_even_width_screen
48
+ @widget = MultiLineWidget.new :center, @y, ['a']
49
+ @display.expects(:width).returns(10)
50
+ @display.expects(:draw).with(5, @y, 'a')
51
+ @widget.draw @display
52
+ end
53
+
54
+ def test_center_vertically_on_odd_width_screen
55
+ @widget = MultiLineWidget.new @x, :center, ['a']
56
+ @display.expects(:height).returns(11)
57
+ @display.expects(:draw).with(@x, 6, 'a')
58
+ @widget.draw @display
59
+ end
60
+
61
+ def test_center_vertically_on_even_width_screen
62
+ @widget = MultiLineWidget.new @x, :center, ['a']
63
+ @display.expects(:height).returns(10)
64
+ @display.expects(:draw).with(@x, 5, 'a')
65
+ @widget.draw @display
66
+ end
67
+
68
+
69
+ def test_render
70
+ @display.expects(:draw).times(@length)
71
+ @widget.draw @display
72
+ end
73
+ end