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,48 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'delve/entity'
4
+
5
+ class EntityTest < Minitest::Test
6
+
7
+ def setup
8
+ @entity = Entity.new
9
+ @component = mock('object')
10
+ end
11
+
12
+ def test_has_component_returns_false_if_doesnt_exist
13
+ assert !@entity.has?(:position)
14
+ end
15
+
16
+ def test_has_component_after_added
17
+ @component.expects(:id).twice.returns(:position)
18
+ @entity.add @component
19
+ assert @entity.has?(:position)
20
+ end
21
+
22
+ def test_adding_same_component_more_than_once_fails
23
+ @component.stubs(:id).returns(:position)
24
+ @entity.add @component
25
+ assert_raises RuntimeError do
26
+ @entity.add @component
27
+ end
28
+ end
29
+
30
+ def test_get_unknown_component_returns_nil
31
+ assert_nil @entity.get :position
32
+ end
33
+
34
+ def test_get_component
35
+ @component.stubs(:id).returns(:position)
36
+ @entity.add @component
37
+ assert_equal @component, @entity.get(:position)
38
+ end
39
+
40
+ def test_act
41
+ @component.stubs(:id).returns(:actor)
42
+ @component.expects(:act)
43
+ @entity.add @component
44
+
45
+ @entity.act
46
+ end
47
+
48
+ end
@@ -0,0 +1,86 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'delve/event_queue'
4
+
5
+ class EventQueueTest < Minitest::Test
6
+
7
+ def setup
8
+ @queue = EventQueue.new
9
+ @event = { :name => 'test-event' }
10
+ end
11
+
12
+ def test_initial_time_is_zero
13
+ assert_equal 0, @queue.time
14
+ end
15
+
16
+ def test_raises_error_if_nil_event_is_added
17
+ assert_raises RuntimeError do
18
+ @queue.add nil, 10
19
+ end
20
+ end
21
+
22
+ def test_raises_error_if_time_is_nil
23
+ assert_raises RuntimeError do
24
+ @queue.add @event, nil
25
+ end
26
+ end
27
+
28
+ def test_get_returns_nil_if_no_events
29
+ event = @queue.get
30
+
31
+ assert_nil event
32
+ end
33
+
34
+ def test_add_event_and_get_it_returns_same_event
35
+ @queue.add @event, 1
36
+ event = @queue.get
37
+
38
+ assert_equal @event, event
39
+ end
40
+
41
+ def test_add_event_and_get_it_advances_time
42
+ @queue.add @event, 10
43
+ @queue.get
44
+
45
+ assert_equal 10, @queue.time
46
+ end
47
+
48
+ def test_add_two_events_out_of_sequence_and_get_them
49
+ first_event = { :place => 1 }
50
+ second_event = { :place => 2 }
51
+ @queue.add second_event, 10
52
+ @queue.add first_event, 5
53
+
54
+ first = @queue.get
55
+ assert_equal 5, @queue.time
56
+
57
+ second = @queue.get
58
+ assert_equal 10, @queue.time
59
+
60
+ assert_equal first_event, first
61
+ assert_equal second_event, second
62
+ end
63
+
64
+ def test_remove_event_that_doesnt_exist_returns_false
65
+ result = @queue.remove({:event => 'fight'})
66
+ assert_equal false, result
67
+ end
68
+
69
+ def test_remove_event_that_actually_exists
70
+ @queue.add @event, 4
71
+ result = @queue.remove @event
72
+
73
+ assert result
74
+ end
75
+
76
+ def test_get_after_clear_returns_nil
77
+ @queue.add @event, 5
78
+ @queue.add @event, 8
79
+ @queue.clear
80
+
81
+ event = @queue.get
82
+
83
+ assert_nil event
84
+ end
85
+
86
+ end
@@ -0,0 +1,47 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'delve/game'
4
+
5
+ class GameTest < Minitest::Test
6
+
7
+ def setup
8
+ @display = mock('object')
9
+ @input = mock('object')
10
+ @screen_manager = mock('object')
11
+ @game = Game.new @display, @screen_manager, @input
12
+ end
13
+
14
+ def test_fail_if_display_is_nil
15
+ assert_raises RuntimeError do
16
+ @game = Game.new nil, @screen_manager, @input
17
+ end
18
+ end
19
+
20
+ def test_fail_if_screen_manager_is_nil
21
+ assert_raises RuntimeError do
22
+ @game = Game.new @display, nil, @input
23
+ end
24
+ end
25
+
26
+ def test_fail_if_input_is_nil
27
+ assert_raises RuntimeError do
28
+ @game = Game.new @display, @screen_manager, nil
29
+ end
30
+ end
31
+
32
+ def test_cannot_start_when_screen_manager_is_empty
33
+ @screen_manager.expects(:empty?).returns(true)
34
+ assert_raises RuntimeError do
35
+ @game.start
36
+ end
37
+ end
38
+
39
+ def test_start_game
40
+ @display.expects(:render)
41
+ @screen_manager.expects(:empty?).returns(false)
42
+ @screen_manager.expects(:render).with(@display)
43
+ @screen_manager.expects(:update).with(@input).returns(true)
44
+ @game.start
45
+ end
46
+
47
+ end
@@ -0,0 +1,21 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'delve/generator/dungeon'
4
+
5
+ class DungeonTest < Minitest::Test
6
+
7
+ def setup
8
+ @dungeon = Dungeon.new
9
+ end
10
+
11
+ def test_no_rooms_exist
12
+ assert !@dungeon.rooms.nil?
13
+ assert_equal 0, @dungeon.rooms.length
14
+ end
15
+
16
+ def test_no_corridors_exist
17
+ assert !@dungeon.corridors.nil?
18
+ assert_equal 0, @dungeon.corridors.length
19
+ end
20
+
21
+ end
@@ -0,0 +1,31 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'delve/generator/map'
4
+
5
+ class MapTest < Minitest::Test
6
+
7
+ def test_initialize_map
8
+ @map = Map.new 10, 15
9
+ assert_equal 10, @map.width
10
+ assert_equal 15, @map.height
11
+ end
12
+
13
+ def assert_initialize_map_with_defaults
14
+ @map = Map.new
15
+ assert_equal 80, @map.width
16
+ assert_equal 24, @map.height
17
+ end
18
+
19
+ def test_fill_map_with_ones
20
+ @map = Map.new 10, 10
21
+ result = @map.fill 1
22
+ tester = mock('object')
23
+ tester.expects(:go).with(1).times(100)
24
+ result.each do |y|
25
+ y.each do |val|
26
+ tester.go(val)
27
+ end
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,49 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'delve/generator/noise'
4
+
5
+ class NoiseTest < Minitest::Test
6
+
7
+ def test_not_defining_grain_fails
8
+ assert_raises RuntimeError do
9
+ Noise.new 10, 10, nil
10
+ end
11
+ end
12
+
13
+ def test_passing_unknown_grain_fails
14
+ assert_raises RuntimeError do
15
+ Noise.new 10, 10, :something
16
+ end
17
+ end
18
+
19
+ def test_width_less_than_zero_fails
20
+ assert_raises RuntimeError do
21
+ Noise.new -1, 10, :fine
22
+ end
23
+ end
24
+
25
+ def test_height_less_than_zero_fails
26
+ assert_raises RuntimeError do
27
+ Noise.new 10, -1, :fine
28
+ end
29
+ end
30
+
31
+ def test_generate_fine_noise
32
+ m = mock('object')
33
+ m.expects(:handle).times(9)
34
+ noise = Noise.new 3, 3, :fine
35
+ noise.generate do |x, y, value|
36
+ m.handle(x, y, value)
37
+ end
38
+ end
39
+
40
+ def test_generate_coarse_noise
41
+ m = mock('object')
42
+ m.expects(:handle).times(4)
43
+ noise = Noise.new 2, 2, :coarse
44
+ noise.generate do |x, y, value|
45
+ m.handle(x, y, value)
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,24 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'mocha/setup'
4
+ require 'curses'
5
+ require 'delve/input/curses_input'
6
+
7
+ class CursesInputTests < Minitest::Test
8
+
9
+ def setup
10
+ @input = CursesInput.new
11
+ end
12
+
13
+ def test_wait_for_input
14
+ Curses.expects(:getch)
15
+ @input.wait_for_input
16
+ end
17
+
18
+ def test_wait_for_non_character_input
19
+ Curses.expects(:getch).returns(263)
20
+ key = @input.wait_for_input
21
+ assert_equal :backspace, key
22
+ end
23
+
24
+ end
@@ -0,0 +1,21 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'delve/input/input'
4
+ require 'mocha/setup'
5
+
6
+ class InputTests < MiniTest::Test
7
+
8
+ def setup
9
+ @handler = mock('object')
10
+ @input = Input.new @handler
11
+ end
12
+
13
+ def test_error_raised_if_handler_is_nil
14
+ Input.new @handler
15
+ end
16
+
17
+ def test_wait_for_input_defers_to_handler
18
+ @handler.expects(:wait_for_input)
19
+ @input.wait_for_input
20
+ end
21
+ end
@@ -0,0 +1,22 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'delve/path/astar'
4
+
5
+ class AStarTest < Minitest::Test
6
+
7
+ def setup
8
+ @tox = 0
9
+ @toy = 0
10
+ @options = Hash.new
11
+ @free_checker = mock('object')
12
+ @free_checker.stubs(:respond_to?).with(:free?).returns(true)
13
+ @astar = AStar.new @tox, @toy, @free_checker, @options
14
+ end
15
+
16
+ def test_compute_fails_if_no_block_is_passed
17
+ assert_raises RuntimeError do
18
+ @astar.compute 0, 0
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,41 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'delve/path/path'
4
+
5
+ class PathTest < Minitest::Test
6
+
7
+ def setup
8
+ @tox = 0
9
+ @toy = 0
10
+ @options = Hash.new
11
+ @free_checker = mock('object')
12
+ end
13
+
14
+ def test_initialize_fails_if_tox_is_nil
15
+ assert_raises RuntimeError do
16
+ Path.new nil, @toy, @free_checker
17
+ end
18
+ end
19
+
20
+ def test_initialize_fails_if_toy_is_nil
21
+ assert_raises RuntimeError do
22
+ Path.new @tox, nil, @free_checker
23
+ end
24
+ end
25
+
26
+ def test_initialize_fails_if_free_checker_is_nil
27
+ assert_raises RuntimeError do
28
+ Path.new @toy, @toy, nil
29
+ end
30
+ end
31
+
32
+ def test_initialize_fails_if_free_checker_doesnt_respond_to_free?
33
+ checker = mock('object')
34
+ checker.expects(:respond_to?).with(:free?).returns(false)
35
+
36
+ assert_raises RuntimeError do
37
+ Path.new @toy, @tox, checker
38
+ end
39
+ end
40
+
41
+ end
@@ -0,0 +1,54 @@
1
+ require 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'mocha/setup'
4
+ require 'delve/scheduler/action_scheduler'
5
+
6
+ class ActionSchedulerTest < Minitest::Test
7
+
8
+ def setup
9
+ @queue = mock('object')
10
+ @scheduler = ActionScheduler.new @queue
11
+ @item = 'item'
12
+ @time = 10
13
+ end
14
+
15
+ def test_clear_calls_subclass_clear
16
+ @queue.expects(:clear)
17
+ @scheduler.clear
18
+ end
19
+
20
+ def test_remove_with_unknown_item
21
+ @queue.expects(:remove).with(@item).returns(false)
22
+ assert !@scheduler.remove(@item)
23
+ end
24
+
25
+ def test_remove_with_known_item
26
+ @queue.expects(:remove).with(@item).returns(true)
27
+ assert @scheduler.remove(@item)
28
+ end
29
+
30
+ def test_add_with_default_time
31
+ @queue.expects(:add).with(@item, 1)
32
+ @scheduler.add(@item, true)
33
+ end
34
+
35
+ def test_add_without_default_time
36
+ @queue.expects(:add).with(@item, @time)
37
+ @scheduler.add(@item, false, @time)
38
+ end
39
+
40
+ def test_next_without_repeating
41
+ @queue.expects(:get).returns(@item)
42
+ assert_equal @item, @scheduler.next
43
+ end
44
+
45
+ def test_next_with_repeating
46
+ @queue.expects(:get).twice.returns(@item)
47
+ @queue.expects(:add).with(@item, 1)
48
+ @scheduler.add(@item, true)
49
+ @queue.expects(:add).with(@item, 1)
50
+ @scheduler.next
51
+ assert_equal @item, @scheduler.next
52
+ end
53
+
54
+ end