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,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 10c84e05752953cb0e5e97d9d8890c3e6c5b4cf5
4
+ data.tar.gz: 7123fda111f93a53aa8eafac8c0897b5323c8dec
5
+ SHA512:
6
+ metadata.gz: 81d867799c356368a1db923fb164657f76bc5a8598a6ee5b6d79f9c1e4d037c587b47c602287ac63eb49667d5479c8109b422e7e1576805260177de5518c4508
7
+ data.tar.gz: 664fbffcd123832b3a605527025287f413fbb3da691e98778ab4b0ec443c046e6c7ba306b58047d56753d6a4106d751dfaeb56e34187c6cc758473428de64373
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
@@ -0,0 +1,24 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ delve (0.0.7)
5
+ perlin_noise
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ metaclass (0.0.2)
11
+ minitest (5.2.2)
12
+ mocha (1.0.0)
13
+ metaclass (~> 0.0.1)
14
+ perlin_noise (0.1.2)
15
+ rake (10.1.1)
16
+
17
+ PLATFORMS
18
+ ruby
19
+
20
+ DEPENDENCIES
21
+ delve!
22
+ minitest
23
+ mocha
24
+ rake
data/LICENSE ADDED
@@ -0,0 +1,25 @@
1
+ Copyright (c) 2014-now(), Benny Hallett
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification,
5
+ are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ * Neither the name of Ondrej Zara nor the names of its contributors may be used
13
+ to endorse or promote products derived from this software without specific
14
+ prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
20
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23
+ OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
25
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,6 @@
1
+ delve
2
+ =====
3
+
4
+ Roguelike Library for Ruby. Inspired by libtcod and rot.js
5
+
6
+ Some code ported from Rot.JS, by @ondras. The Rot.js license is included in rot.js.LICENSE
@@ -0,0 +1,92 @@
1
+ Roadmap
2
+ =======
3
+
4
+ **v0.3.0**
5
+
6
+ * Tile renderer
7
+
8
+ **v0.2.0**
9
+
10
+ * Generic YAML based entity factory
11
+ * Animation
12
+
13
+ **v0.1.0**
14
+
15
+ * Documentation on bennyhallett.github.io/delve
16
+ * Tutorial on rogue basin
17
+ * Blog post
18
+ * Reddit post
19
+ * Twitter post
20
+ * Make it work with both Ruby 1.9.3 and 2.x
21
+
22
+ **v0.0.8**
23
+
24
+ * Speed Scheduler
25
+ * Travis CI builds
26
+ * fix bug when rogue generator renders on large terminal
27
+ * Name generator
28
+ - Fantasy
29
+ - SciFi
30
+
31
+ **v0.0.7** (Initial release)
32
+
33
+ * Use engine in game gen
34
+ * Render spaces with default color rather than red question marks if unknown tile
35
+ * Command line takes params
36
+ * delve mygame -g dungeon -r curses -s scheduler
37
+ * Base FieldOfView class [DONE]
38
+ * Discrete shadowcasting FoV class
39
+ * Base Path class [DONE]
40
+ * A* Pathing class [DONE]
41
+ * Make move/collision component return the item that was in the collision
42
+
43
+ ========================================================================
44
+
45
+ **v0.0.6**
46
+
47
+ * Simple Scheduler [Done]
48
+ * Progress widget [Done]
49
+ * KeyValue widget [Done]
50
+
51
+ **v0.0.5**
52
+
53
+ * Use viewport in game generator [DONE]
54
+ * Place player on a walkable location [DONE]
55
+ * Viewport has top_left, width, height properties [DONE]
56
+ * Symbol component [DONE]
57
+
58
+ **v0.0.4**
59
+
60
+ * One command roguelike [DONE]
61
+ * Rogue generator [DONE]
62
+ * Cellular Automata generator [DONE]
63
+ * Move collision component into library [DONE]
64
+ * Make move component check for collisions [DONE]
65
+ * Center menu widget [DONE]
66
+ * Viewport widget [DONE]
67
+
68
+ **v0.0.3**
69
+
70
+ * Make game class use Input class [DONE]
71
+ * Border-box widget [DONE]
72
+ * option to not-render corners [DONE]
73
+ * option for centered text in header [DONE]
74
+ * Easier mapping to keys other than character keys [DONE]
75
+ * Game item [DONE]
76
+ * Position component [DONE]
77
+ * Movement component [DONE]
78
+ * Complete turn engine [DONE]
79
+ * Only include action turn scheduler [DONE]
80
+ * Text Widget improvements [DONE]
81
+ * :center both vertically and horizontally [DONE]
82
+ * Ascii Art widget (for doing main screen art, etc) [DONE]
83
+ * :center both vertically and horizontally [DONE]
84
+
85
+ **v0.0.2**
86
+
87
+ * Menu widget (both selection and key based) [DONE]
88
+ * Coloured output [DONE]
89
+ * Cursor off screen after render [DONE]
90
+ * Update requires means of input [DONE]
91
+ * Display can determine size of console [DONE]
92
+ * Noise takes step size for fine-grained vs coarse-grained [DONE]
@@ -0,0 +1,25 @@
1
+ require 'rake/clean'
2
+ require 'rubygems'
3
+ require 'rubygems/package_task'
4
+
5
+ spec = eval(File.read('delve.gemspec'))
6
+
7
+ Gem::PackageTask.new(spec) do |pkg|
8
+ end
9
+
10
+ require 'rake/testtask'
11
+ Rake::TestTask.new do |t|
12
+ t.libs << "test"
13
+ t.test_files = FileList[
14
+ 'test/*_test.rb',
15
+ 'test/scheduler/*_test.rb',
16
+ 'test/display/*_test.rb',
17
+ 'test/widgets/*_test.rb',
18
+ 'test/generator/*_test.rb',
19
+ 'test/component/*_test.rb',
20
+ 'test/input/*_test.rb',
21
+ 'test/path/*_test.rb'
22
+ ]
23
+ end
24
+
25
+ task :default => [:test]
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'delve'
4
+
5
+ name = ARGV.shift
6
+
7
+ if name.nil?
8
+ puts "Cannot create roguelike without a name"
9
+ exit 1
10
+ end
11
+
12
+ dir = File.expand_path('.').to_s
13
+
14
+ delve = Delve.new name
15
+ delve.create_game dir
@@ -0,0 +1,17 @@
1
+ Gem::Specification.new do |g|
2
+ g.name = 'delve'
3
+ g.version = '0.0.7'
4
+ g.date = '2014-03-24'
5
+ g.summary = 'Roguelike library inspired by rot.js and libtcod'
6
+ g.description = 'Roguelike library inspired by rot.js and libtcod. Allows developers to get a jumpstart on their roguelike development, by running a single command to get started with an "@ walking around the world" demo.'
7
+ g.authors = ['Benny Hallett']
8
+ g.files = `git ls-files`.split($/)
9
+ g.bindir = 'bin'
10
+ g.executables << 'delve'
11
+ g.homepage = 'https://github.com/BennyHallett/delve'
12
+ g.license = 'BSD'
13
+ g.add_development_dependency('rake', '10.1.1')
14
+ g.add_development_dependency('minitest', '5.2.2')
15
+ g.add_development_dependency('mocha', '1.0.0')
16
+ g.add_runtime_dependency('perlin_noise', '0.1.2')
17
+ end
@@ -0,0 +1,34 @@
1
+ require 'delve/display/display'
2
+ require 'delve/display/curses_renderer'
3
+ require 'delve/widgets/multi_line'
4
+
5
+ @lines = [
6
+ 'Ascii Art Demo',
7
+ '+-------------------------------------------+',
8
+ '| | | |',
9
+ '| | | | | | |',
10
+ '| | | | |',
11
+ '+-------------------------------------------+'
12
+ ]
13
+
14
+ def display_art x, y
15
+ art = MultiLineWidget.new x, y, @lines
16
+ display = Display.new CursesRenderer.new
17
+
18
+ art.draw display
19
+ display.render
20
+ end
21
+
22
+ display_art 1, 1
23
+ sleep 2
24
+
25
+ display_art :center, 1
26
+ sleep 2
27
+
28
+ display_art 1, :center
29
+ sleep 2
30
+
31
+ display_art :center, :center
32
+ sleep 2
33
+
34
+ display.exit
@@ -0,0 +1,39 @@
1
+ require 'delve/display/display'
2
+ require 'delve/display/curses_renderer'
3
+ require 'delve/path/astar'
4
+
5
+ class World
6
+
7
+ def free?(x, y)
8
+ true
9
+ end
10
+
11
+ end
12
+
13
+ display = Display.new CursesRenderer.new
14
+ colours = []
15
+
16
+ (0..5).each do |x|
17
+ colours << []
18
+ (0..5).each do |y|
19
+ colours[x] << :white
20
+ end
21
+ end
22
+
23
+ world = World.new
24
+ path = AStar.new 3, 4, world, { topology: :four }
25
+ path.compute(1, 2) do |x, y|
26
+ colours[x][y] = :red
27
+ end
28
+
29
+ (0..5).each do |x|
30
+ (0..5).each do |y|
31
+ display.draw x, y, 'o', colours[x][y], :black
32
+ end
33
+ end
34
+
35
+ display.render
36
+
37
+ sleep 2
38
+
39
+ display.exit
@@ -0,0 +1,13 @@
1
+ require 'delve/display/display'
2
+ require 'delve/display/curses_renderer'
3
+ require 'delve/widgets/border'
4
+
5
+ display = Display.new CursesRenderer.new
6
+ border = BorderWidget.new 0, 0, display.width, display.height, 'This is a border!!', :green, :black
7
+
8
+ border.draw display
9
+ display.render
10
+
11
+ sleep 4
12
+
13
+ display.exit
@@ -0,0 +1,15 @@
1
+ require 'delve/generator/cellular'
2
+ require 'delve/display/curses_renderer'
3
+ require 'delve/display/display'
4
+
5
+ display = Display.new CursesRenderer.new
6
+
7
+ cellular = CellularGenerator.new 120, 36
8
+ cellular.generate do |x, y, value|
9
+ display.draw(x, y, value == 1 ? '#' : '.')
10
+ end
11
+ display.render
12
+
13
+ sleep 4
14
+
15
+ display.exit
@@ -0,0 +1,27 @@
1
+ require 'delve/display/display'
2
+ require 'delve/display/curses_renderer'
3
+ require 'delve/input/input'
4
+ require 'delve/input/curses_input'
5
+ require 'delve/widgets/text'
6
+
7
+ title = TextWidget.new :center, 0, 'Press a character key to continue'
8
+ display = Display.new CursesRenderer.new
9
+ input = Input.new CursesInput.new
10
+ size = TextWidget.new 0, 1, "The console is #{display.width}x#{display.height}."
11
+
12
+ title.draw display
13
+ size.draw display
14
+ display.draw(2, 2, '@')
15
+ display.draw(4, 6, 'x')
16
+ display.render
17
+
18
+ x = input.wait_for_input
19
+
20
+ display.draw(5, 4, 'y')
21
+ display.draw(3, 3, 'p')
22
+ display.draw(0, 0, x)
23
+ display.render
24
+
25
+ sleep 2
26
+
27
+ display.exit
@@ -0,0 +1,29 @@
1
+ require 'delve/engine'
2
+ require 'delve/scheduler/simple_scheduler'
3
+ require 'delve/event_queue'
4
+
5
+ class Actor
6
+
7
+ def initialize(name)
8
+ @name = name
9
+ end
10
+
11
+ def act
12
+ puts "Actor #{@name} acting"
13
+ end
14
+
15
+ end
16
+
17
+ queue = EventQueue.new
18
+ scheduler = SimpleScheduler.new(queue)
19
+ engine = Engine.new(scheduler)
20
+
21
+ a = Actor.new 'a'
22
+ b = Actor.new 'b'
23
+ c = Actor.new 'c'
24
+
25
+ scheduler.add(a, false)
26
+ scheduler.add(b, false)
27
+ scheduler.add(c, false)
28
+
29
+ engine.unlock
@@ -0,0 +1,22 @@
1
+ require 'delve/display/display'
2
+ require 'delve/display/curses_renderer'
3
+ require 'delve/input/input'
4
+ require 'delve/input/curses_input'
5
+ require 'delve/widgets/menu'
6
+
7
+ display = Display.new CursesRenderer.new
8
+ input = Input.new CursesInput.new
9
+ menu = MenuWidget.new :center, 1, { 'f' => 'First item', 's' => 'Second item', 'd' => 'Third item' }
10
+
11
+ menu.draw display
12
+ display.render
13
+
14
+ x = input.wait_for_input
15
+ menu.select x
16
+
17
+ menu.draw display
18
+ display.render
19
+
20
+ sleep 2
21
+
22
+ display.exit
@@ -0,0 +1,37 @@
1
+ require 'delve/generator/noise'
2
+ require 'delve/display/curses_renderer'
3
+ require 'delve/display/display'
4
+
5
+ display = Display.new CursesRenderer.new
6
+
7
+ def generate_noise(grain, d)
8
+ noise = Noise.new 96, 32, grain
9
+ noise.generate do |x, y, value|
10
+ v = (value * 10).floor
11
+ t = '.'
12
+ t = '^' if v < 9
13
+ t = 'M' if v < 7
14
+ t = '.' if v < 5
15
+ t = 'w' if v < 3
16
+ t = 'W' if v < 1
17
+
18
+ bg = :black
19
+ bg = :green if v < 7
20
+ bg = :cyan if v < 3
21
+ bg = :blue if v < 1
22
+
23
+ fg = :white
24
+
25
+ d.draw(x, y, t, fg, bg)
26
+ end
27
+ end
28
+
29
+ generate_noise :fine, display
30
+ display.render
31
+ sleep 2
32
+
33
+ generate_noise :coarse, display
34
+ display.render
35
+ sleep 2
36
+
37
+ display.exit