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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +24 -0
- data/LICENSE +25 -0
- data/README.md +6 -0
- data/ROADMAP.md +92 -0
- data/Rakefile +25 -0
- data/bin/delve +15 -0
- data/delve.gemspec +17 -0
- data/doc/examples/ascii.rb +34 -0
- data/doc/examples/astar.rb +39 -0
- data/doc/examples/border.rb +13 -0
- data/doc/examples/cellular.rb +15 -0
- data/doc/examples/display.rb +27 -0
- data/doc/examples/engine.rb +29 -0
- data/doc/examples/menu.rb +22 -0
- data/doc/examples/noise.rb +37 -0
- data/doc/examples/progress.rb +25 -0
- data/doc/examples/rogue.rb +15 -0
- data/lib/delve.rb +109 -0
- data/lib/delve/component/collision.rb +17 -0
- data/lib/delve/component/movement.rb +78 -0
- data/lib/delve/component/position.rb +30 -0
- data/lib/delve/component/symbol.rb +23 -0
- data/lib/delve/display/curses_renderer.rb +63 -0
- data/lib/delve/display/display.rb +51 -0
- data/lib/delve/engine.rb +30 -0
- data/lib/delve/entity.rb +23 -0
- data/lib/delve/event_queue.rb +48 -0
- data/lib/delve/fov/discrete_shadowcasting.rb +78 -0
- data/lib/delve/fov/fov.rb +83 -0
- data/lib/delve/game.rb +22 -0
- data/lib/delve/generator/cellular.rb +111 -0
- data/lib/delve/generator/dungeon.rb +19 -0
- data/lib/delve/generator/map.rb +30 -0
- data/lib/delve/generator/noise.rb +33 -0
- data/lib/delve/generator/rogue.rb +403 -0
- data/lib/delve/input/curses_input.rb +28 -0
- data/lib/delve/input/input.rb +12 -0
- data/lib/delve/path/astar.rb +83 -0
- data/lib/delve/path/path.rb +70 -0
- data/lib/delve/scheduler/action_scheduler.rb +38 -0
- data/lib/delve/scheduler/scheduler.rb +37 -0
- data/lib/delve/scheduler/simple_scheduler.rb +21 -0
- data/lib/delve/screen_manager.rb +41 -0
- data/lib/delve/widgets/border.rb +44 -0
- data/lib/delve/widgets/key_value.rb +36 -0
- data/lib/delve/widgets/menu.rb +84 -0
- data/lib/delve/widgets/multi_line.rb +51 -0
- data/lib/delve/widgets/progress.rb +37 -0
- data/lib/delve/widgets/text.rb +37 -0
- data/lib/delve/widgets/viewport.rb +67 -0
- data/rot.js.LICENSE +25 -0
- data/templates/Gemfile.erb +4 -0
- data/templates/README.md.erb +22 -0
- data/templates/binfile.erb +21 -0
- data/templates/game_screen.rb.erb +51 -0
- data/templates/gemspec.erb +27 -0
- data/templates/loading_screen.rb.erb +46 -0
- data/templates/player_factory.rb.erb +19 -0
- data/templates/title_screen.rb.erb +42 -0
- data/templates/world.rb.erb +63 -0
- data/test/component/collision_test.rb +39 -0
- data/test/component/movement_test.rb +155 -0
- data/test/component/position_test.rb +43 -0
- data/test/component/symbol_test.rb +30 -0
- data/test/delve_test.rb +61 -0
- data/test/display/curses_renderer_test.rb +60 -0
- data/test/display/display_test.rb +86 -0
- data/test/engine_test.rb +36 -0
- data/test/entity_test.rb +48 -0
- data/test/event_queue_test.rb +86 -0
- data/test/game_test.rb +47 -0
- data/test/generator/dungeon_test.rb +21 -0
- data/test/generator/map_test.rb +31 -0
- data/test/generator/noise_test.rb +49 -0
- data/test/input/curses_input_test.rb +24 -0
- data/test/input/input_test.rb +21 -0
- data/test/path/astar_test.rb +22 -0
- data/test/path/path_test.rb +41 -0
- data/test/scheduler/action_scheduler_test.rb +54 -0
- data/test/scheduler/scheduler_test.rb +50 -0
- data/test/scheduler/simple_scheduler_test.rb +33 -0
- data/test/screen_manager_test.rb +92 -0
- data/test/widgets/border_test.rb +60 -0
- data/test/widgets/key_value_test.rb +68 -0
- data/test/widgets/menu_test.rb +103 -0
- data/test/widgets/multi_line_test.rb +73 -0
- data/test/widgets/progress_test.rb +96 -0
- data/test/widgets/text_test.rb +66 -0
- data/test/widgets/viewport_test.rb +154 -0
- metadata +193 -0
data/test/entity_test.rb
ADDED
@@ -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
|
data/test/game_test.rb
ADDED
@@ -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
|