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
checksums.yaml
ADDED
@@ -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
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -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.
|
data/README.md
ADDED
data/ROADMAP.md
ADDED
@@ -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]
|
data/Rakefile
ADDED
@@ -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]
|
data/bin/delve
ADDED
data/delve.gemspec
ADDED
@@ -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
|