gamebox 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/History.txt +18 -0
  2. data/Manifest.txt +85 -0
  3. data/README.txt +33 -0
  4. data/Rakefile +42 -0
  5. data/TODO.txt +29 -0
  6. data/bin/gamebox +49 -0
  7. data/docs/gamebox04_big.png +0 -0
  8. data/docs/getting_started.rdoc +99 -0
  9. data/docs/logo.png +0 -0
  10. data/lib/gamebox.rb +6 -0
  11. data/lib/gamebox/actor.rb +143 -0
  12. data/lib/gamebox/actor_factory.rb +64 -0
  13. data/lib/gamebox/actor_view.rb +35 -0
  14. data/lib/gamebox/ai/line_of_site.rb +61 -0
  15. data/lib/gamebox/ai/polaris.rb +107 -0
  16. data/lib/gamebox/ai/two_d_grid_location.rb +21 -0
  17. data/lib/gamebox/ai/two_d_grid_map.rb +77 -0
  18. data/lib/gamebox/aliasing.rb +16 -0
  19. data/lib/gamebox/animated.rb +84 -0
  20. data/lib/gamebox/behavior.rb +16 -0
  21. data/lib/gamebox/config_manager.rb +22 -0
  22. data/lib/gamebox/console_app.rb +39 -0
  23. data/lib/gamebox/data/fonts/Asimov.ttf +0 -0
  24. data/lib/gamebox/data/fonts/GAMEBOX_FONTS_GO_HERE +0 -0
  25. data/lib/gamebox/data/graphics/GAMEBOX_GRAPHICS_GO_HERE +0 -0
  26. data/lib/gamebox/data/graphics/logo.png +0 -0
  27. data/lib/gamebox/data/music/GAMEBOX_MUSIC_GOES_HERE +0 -0
  28. data/lib/gamebox/data/sounds/GAMEBOX_SOUND_FX_GO_HERE +0 -0
  29. data/lib/gamebox/director.rb +47 -0
  30. data/lib/gamebox/gamebox_application.rb +77 -0
  31. data/lib/gamebox/graphical.rb +24 -0
  32. data/lib/gamebox/graphical_actor_view.rb +31 -0
  33. data/lib/gamebox/inflections.rb +52 -0
  34. data/lib/gamebox/inflector.rb +278 -0
  35. data/lib/gamebox/input_manager.rb +104 -0
  36. data/lib/gamebox/layered.rb +34 -0
  37. data/lib/gamebox/level.rb +64 -0
  38. data/lib/gamebox/linked_list.rb +137 -0
  39. data/lib/gamebox/logo.rb +11 -0
  40. data/lib/gamebox/metaclass.rb +6 -0
  41. data/lib/gamebox/mode.rb +123 -0
  42. data/lib/gamebox/mode_manager.rb +80 -0
  43. data/lib/gamebox/numbers_ext.rb +3 -0
  44. data/lib/gamebox/physical.rb +139 -0
  45. data/lib/gamebox/physical_director.rb +17 -0
  46. data/lib/gamebox/physical_level.rb +89 -0
  47. data/lib/gamebox/physics.rb +27 -0
  48. data/lib/gamebox/publisher_ext.rb +13 -0
  49. data/lib/gamebox/resource_manager.rb +122 -0
  50. data/lib/gamebox/score.rb +35 -0
  51. data/lib/gamebox/sorted_list.rb +59 -0
  52. data/lib/gamebox/sound_manager.rb +84 -0
  53. data/lib/gamebox/surface_ext.rb +37 -0
  54. data/lib/gamebox/svg_actor.rb +55 -0
  55. data/lib/gamebox/svg_document.rb +160 -0
  56. data/lib/gamebox/template_app/README +30 -0
  57. data/lib/gamebox/template_app/Rakefile +20 -0
  58. data/lib/gamebox/template_app/config/boot.rb +5 -0
  59. data/lib/gamebox/template_app/config/environment.rb +29 -0
  60. data/lib/gamebox/template_app/config/game.yml +6 -0
  61. data/lib/gamebox/template_app/config/mode_level_config.yml +3 -0
  62. data/lib/gamebox/template_app/config/objects.yml +29 -0
  63. data/lib/gamebox/template_app/data/fonts/FONTS_GO_HERE +0 -0
  64. data/lib/gamebox/template_app/data/graphics/GRAPHICS_GO_HERE +0 -0
  65. data/lib/gamebox/template_app/data/music/MUSIC_GOES_HERE +0 -0
  66. data/lib/gamebox/template_app/data/sounds/SOUND_FX_GO_HERE +0 -0
  67. data/lib/gamebox/template_app/doc/README_FOR_APP +1 -0
  68. data/lib/gamebox/template_app/lib/code_statistics.rb +107 -0
  69. data/lib/gamebox/template_app/lib/diy.rb +371 -0
  70. data/lib/gamebox/template_app/lib/platform.rb +16 -0
  71. data/lib/gamebox/template_app/src/app.rb +8 -0
  72. data/lib/gamebox/template_app/src/demo_level.rb +20 -0
  73. data/lib/gamebox/template_app/src/game.rb +22 -0
  74. data/lib/gamebox/template_app/src/my_actor.rb +17 -0
  75. data/lib/gamebox/version.rb +10 -0
  76. data/lib/gamebox/viewport.rb +81 -0
  77. data/lib/gamebox/wrapped_screen.rb +15 -0
  78. data/script/perf_polaris.rb +36 -0
  79. data/test/helper.rb +25 -0
  80. data/test/test_actor.rb +38 -0
  81. data/test/test_animated.rb +64 -0
  82. data/test/test_line_of_site.rb +14 -0
  83. data/test/test_physical.rb +26 -0
  84. data/test/test_polaris.rb +193 -0
  85. data/test/test_viewport.rb +116 -0
  86. metadata +188 -0
@@ -0,0 +1,16 @@
1
+ # Helper functions for determining platform
2
+
3
+ # TODO how do I do this in ruby 1.9, since PLATFORM doesn't exist?
4
+ class Platform
5
+ def self.mac?
6
+ return PLATFORM =~ /darwin/
7
+ end
8
+
9
+ def self.windows?
10
+ return PLATFORM =~ /mswin/
11
+ end
12
+
13
+ def self.linux?
14
+ return PLATFORM =~ /linux/
15
+ end
16
+ end
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ $: << "#{File.dirname(__FILE__)}/../config"
3
+
4
+ require 'environment'
5
+
6
+ if $0 == __FILE__
7
+ GameboxApp.run ARGV, ENV
8
+ end
@@ -0,0 +1,20 @@
1
+ require 'level'
2
+ require 'ftor'
3
+ class DemoLevel < Level
4
+ def setup
5
+ @my_actor = create_actor :my_actor
6
+ @my_actor.x = 10
7
+ @my_actor.y = 10
8
+
9
+ @stars = []
10
+ 20.times { @stars << Ftor.new(rand(@width),rand(@height)) }
11
+ end
12
+
13
+ def draw(target, x_off, y_off)
14
+ target.fill [25,25,25,255]
15
+ for star in @stars
16
+ target.draw_circle_s([star.x,star.y],1,[255,255,255,255])
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,22 @@
1
+ class Game
2
+
3
+ constructor :wrapped_screen, :input_manager, :sound_manager,
4
+ :mode_manager
5
+
6
+ def setup
7
+ # @sound_manager.play :current_rider
8
+
9
+ @mode_manager.change_mode_to :default
10
+ end
11
+
12
+ def update(time)
13
+ @mode_manager.update time
14
+ draw
15
+ end
16
+
17
+ def draw
18
+ @mode_manager.draw @wrapped_screen
19
+ @wrapped_screen.flip
20
+ end
21
+
22
+ end
@@ -0,0 +1,17 @@
1
+ require 'actor'
2
+ require 'actor_view'
3
+
4
+ class MyActorView < ActorView
5
+ def draw(target, x_off, y_off)
6
+ target.draw_box [@actor.x,@actor.y], [20,20], [240,45,45,255]
7
+ end
8
+ end
9
+
10
+ class MyActor < Actor
11
+
12
+ def setup
13
+ # TODO setup stuff here
14
+ # subscribe for an event or something?
15
+ end
16
+
17
+ end
@@ -0,0 +1,10 @@
1
+ module Gamebox
2
+ module VERSION #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 0
5
+ TINY = 1
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
10
+
@@ -0,0 +1,81 @@
1
+ require 'numbers_ext'
2
+ require 'publisher'
3
+
4
+ # Viewport represents the current "camera" location. Essensially it translates from
5
+ # world to screen coords and from screen coords to world coords.
6
+ class Viewport
7
+ extend Publisher
8
+ can_fire :scrolled
9
+
10
+ attr_accessor :x_offset, :y_offset, :follow_target, :width,
11
+ :height
12
+
13
+ def debug
14
+ "xoff:#{@x_offset} yoff:#{@y_offset}"
15
+ end
16
+
17
+ def initialize(width, height)
18
+ @x_offset = 0
19
+ @y_offset = 0
20
+
21
+ @width = width
22
+ @height = height
23
+ end
24
+
25
+ def x_offset(layer=1)
26
+ return 0 if layer == Float::Infinity
27
+ return @x_offset if layer == 1
28
+ @x_offset / layer
29
+ end
30
+
31
+ def y_offset(layer=1)
32
+ return 0 if layer == Float::Infinity
33
+ return @y_offset if layer == 1
34
+ @y_offset / layer
35
+ end
36
+
37
+ def update(time)
38
+ scrolled = false
39
+ if @follow_target
40
+ x_diff = @width/2 + @follow_offset_x - @follow_target.x - @x_offset
41
+ if x_diff.abs > @buffer_x
42
+ # move screen
43
+ if x_diff > 0
44
+ @x_offset += x_diff - @buffer_x
45
+ scrolled = true
46
+ else
47
+ @x_offset += x_diff + @buffer_x
48
+ scrolled = true
49
+ end
50
+ end
51
+
52
+ y_diff = @height/2 + @follow_offset_y - @follow_target.y - @y_offset
53
+ if y_diff.abs > @buffer_y
54
+ # move screen
55
+ if y_diff > 0
56
+ @y_offset += y_diff - @buffer_y
57
+ scrolled = true
58
+ else
59
+ @y_offset += y_diff + @buffer_y
60
+ scrolled = true
61
+ end
62
+ end
63
+
64
+ fire :scrolled if scrolled
65
+ end
66
+ end
67
+
68
+ def follow(target, off=[0,0], buff=[0,0])
69
+ @follow_target = target
70
+ @follow_offset_x = off[0]
71
+ @follow_offset_y = off[1]
72
+ @buffer_x = buff[0]
73
+ @buffer_y = buff[1]
74
+
75
+ @x_offset = @width/2 - @follow_target.x + @follow_offset_x
76
+ @y_offset = @height/2 - @follow_target.y + @follow_offset_y
77
+
78
+ fire :scrolled
79
+ end
80
+
81
+ end
@@ -0,0 +1,15 @@
1
+ class WrappedScreen
2
+ constructor :config_manager
3
+ attr_accessor :screen
4
+ def setup
5
+ w,h = @config_manager[:screen_resolution]
6
+ flags = []
7
+ flags << HWSURFACE
8
+ flags << DOUBLEBUF
9
+ flags << FULLSCREEN if @config_manager[:fullscreen]
10
+ @screen = Screen.set_mode [w,h], 0, flags
11
+ end
12
+ def method_missing(name,*args)
13
+ @screen.send name, *args
14
+ end
15
+ end
@@ -0,0 +1,36 @@
1
+ $: << File.dirname(__FILE__)+"/../lib/gamebox"
2
+
3
+ require 'ai/polaris'
4
+ require 'ai/two_d_grid_map'
5
+
6
+ @map = TwoDGridMap.new 100, 90
7
+
8
+ from = TwoDGridLocation.new 0, 0
9
+ to = TwoDGridLocation.new 9, 0
10
+ @pather = Polaris.new @map
11
+
12
+ require 'benchmark'
13
+ Benchmark.bm do|b|
14
+
15
+ b.report("warm up") do
16
+ 10.times { path = @pather.guide(from,to) }
17
+ end
18
+
19
+ b.report("shorter path") do
20
+ 10.times { path = @pather.guide(from,to) }
21
+ end
22
+
23
+ to = TwoDGridLocation.new 92, 0
24
+ b.report("longer path") do
25
+ 10.times { path = @pather.guide(from,to) }
26
+ end
27
+
28
+ # put up a wall
29
+ @map.h.times do |i|
30
+ @map.place TwoDGridLocation.new(89, i), "ME"
31
+ end
32
+
33
+ b.report("blocked path") do
34
+ 10.times { path = @pather.guide(from,to) }
35
+ end
36
+ end
@@ -0,0 +1,25 @@
1
+ $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'gamebox'))
2
+
3
+ require 'rubygems'
4
+
5
+ require 'bacon'
6
+ require 'mocha'
7
+ require 'aliasing'
8
+
9
+ class Bacon::Context
10
+ include Mocha::Standalone
11
+ def it_with_mocha description
12
+ it_without_mocha description do
13
+ mocha_setup
14
+ yield
15
+ mocha_verify
16
+ mocha_teardown
17
+ end
18
+ end
19
+ alias_method_chain :it, :mocha
20
+ end
21
+
22
+
23
+ require 'metaclass'
24
+ require 'actor'
25
+
@@ -0,0 +1,38 @@
1
+ require 'helper'
2
+ require 'actor'
3
+
4
+ describe 'A new actor' do
5
+ before do
6
+ opts = {:level=>"level", :input=>"input", :resources=>"resource"}
7
+ @actor = Actor.new opts
8
+ end
9
+
10
+ it 'should be alive' do
11
+ @actor.alive?.should.equal true
12
+ end
13
+
14
+ it 'should be at (0,0)' do
15
+ @actor.x.should.equal 0
16
+ @actor.y.should.equal 0
17
+ end
18
+
19
+ it 'should have atts set' do
20
+ @actor.level.should.equal "level"
21
+ @actor.input_manager.should.equal "input"
22
+ @actor.resource_manager.should.equal "resource"
23
+ @actor.behaviors.size.should.equal 0
24
+ end
25
+
26
+ it 'should fire anything' do
27
+ should.not.raise do
28
+ @actor.when :foofoo_bar do
29
+ "blah"
30
+ end
31
+ end
32
+ end
33
+
34
+ it 'should setup behaviors' do
35
+ should.flunk 'cannot test easily!'
36
+ end
37
+
38
+ end
@@ -0,0 +1,64 @@
1
+ require 'helper'
2
+ require 'animated'
3
+ require 'mocha'
4
+
5
+ describe 'A new animated behavior' do
6
+ before do
7
+ @rm = stub(:load_animation_set => ['1.png_img_obj','2.png_img_obj'])
8
+
9
+ opts = {:level=>"level", :input=>"input", :resources=>@rm}
10
+ @actor = Actor.new opts
11
+ @animated = Animated.new @actor
12
+ end
13
+
14
+ it 'should define methods on actor' do
15
+ @actor.should.respond_to? :image
16
+ @actor.should.respond_to? :start_animating
17
+ @actor.should.respond_to? :stop_animating
18
+ @actor.should.respond_to? :action=
19
+ @actor.should.respond_to? :animated
20
+ end
21
+
22
+ it 'shouldn\'t update frame for non-animating' do
23
+ @animated.stop_animating
24
+
25
+ @animated.update Animated::FRAME_UPDATE_TIME+1
26
+
27
+ @animated.frame_time.should.equal 0
28
+ @animated.frame_num.should.equal 0
29
+ end
30
+
31
+ it 'should update frame for animating' do
32
+ time_passed = Animated::FRAME_UPDATE_TIME-1
33
+ @animated.update time_passed
34
+ @animated.frame_time.should.equal time_passed
35
+ @animated.frame_num.should.equal 0
36
+
37
+ time_passed_again = 2
38
+ @animated.update time_passed_again
39
+ # we rolled over the time
40
+ @animated.frame_time.should.equal 1
41
+ @animated.frame_num.should.equal 1
42
+
43
+ time_passed_again = Animated::FRAME_UPDATE_TIME
44
+ @animated.update time_passed_again
45
+ # we rolled over the time
46
+ @animated.frame_time.should.equal 1
47
+ @animated.frame_num.should.equal 0
48
+ end
49
+
50
+ it 'should stop animating' do
51
+ @animated.stop_animating
52
+ @animated.animating.should.equal false
53
+ end
54
+
55
+ it 'should start animating' do
56
+ @animated.start_animating
57
+ @animated.animating.should.equal true
58
+ end
59
+
60
+ it 'should set the action and animate accordingly' do
61
+ should.flunk 'finish me'
62
+ end
63
+
64
+ end
@@ -0,0 +1,14 @@
1
+ require 'helper'
2
+ require 'ai/line_of_site'
3
+ require 'ai/two_d_grid_map'
4
+
5
+ describe 'A new LineOfSite' do
6
+ before do
7
+ @map = TwoDGridMap.new 10, 20
8
+ @los = LineOfSite.new @map
9
+ end
10
+
11
+ it 'should be sane' do
12
+ true.should == true
13
+ end
14
+ end
@@ -0,0 +1,26 @@
1
+ require 'helper'
2
+ require 'physical'
3
+ require 'actor'
4
+ require 'mocha'
5
+
6
+ class CircleActor < Actor
7
+ has_behaviors :physical => {:shape => :circle,
8
+ :mass => 500,
9
+ :radius => 10}
10
+ end
11
+
12
+ describe 'A new physical behavior' do
13
+ before do
14
+ @level = stub(:load_animation_set => ['1.png_img_obj','2.png_img_obj'],:register_physical_object => true)
15
+
16
+ opts = {:level=>@level, :input=>"input", :resources=>"rm"}
17
+ @actor = CircleActor.new opts
18
+ @physical = @actor.physical
19
+ end
20
+
21
+ it 'should add methods to its actor' do
22
+ @actor.should.respond_to? :x
23
+ should.flunk 'testing this feels dirty...'
24
+ end
25
+
26
+ end
@@ -0,0 +1,193 @@
1
+ require 'helper'
2
+ require 'ai/polaris'
3
+ require 'ai/two_d_grid_map'
4
+
5
+ describe 'A new polaris' do
6
+ before do
7
+ @map = TwoDGridMap.new 10, 20
8
+ @pather = Polaris.new @map
9
+ end
10
+
11
+ it 'should return an empty path if destination is not valid' do
12
+ from = TwoDGridLocation.new @map.w-1, @map.h-1
13
+ to = TwoDGridLocation.new @map.w, @map.h
14
+ @pather.guide(from,to).should == nil
15
+
16
+ to = TwoDGridLocation.new(-1, -1)
17
+ @pather.guide(from,to).should == nil
18
+ end
19
+
20
+ it 'should return an empty path if start is not valid' do
21
+ from = TwoDGridLocation.new @map.w, @map.h
22
+ to = TwoDGridLocation.new @map.w-1, @map.h-1
23
+ @pather.guide(from,to).should == nil
24
+
25
+ from = TwoDGridLocation.new -1, -1
26
+ @pather.guide(from,to).should == nil
27
+ end
28
+
29
+ it 'should return the path of "to" for accessible neighbor' do
30
+ from = TwoDGridLocation.new 0, 0
31
+ to = TwoDGridLocation.new 1, 0
32
+
33
+ path = @pather.guide(from,to)
34
+ path.should != nil
35
+ path.size.should == 1
36
+
37
+ path.first.cost_to.should == TwoDGridMap::TRAVEL_COST_STRAIGHT
38
+ path.first.dist_from.should == 0
39
+ path.first.location.x.should == to.x
40
+ path.first.location.y.should == to.y
41
+ end
42
+
43
+ it 'should return the right horizontal path of length 2' do
44
+ from = TwoDGridLocation.new 0, 0
45
+ to = TwoDGridLocation.new 2, 0
46
+
47
+ path = @pather.guide(from,to)
48
+
49
+ path.should != nil
50
+ path.size.should == 2
51
+
52
+ path.first.location.x.should == 1
53
+ path.first.location.y.should == 0
54
+ path.last.location.should == to
55
+ end
56
+
57
+ it 'should return the left horizontal path of length 2' do
58
+ from = TwoDGridLocation.new 2, 0
59
+ to = TwoDGridLocation.new 0, 0
60
+
61
+ path = @pather.guide(from,to)
62
+
63
+ path.should != nil
64
+ path.size.should == 2
65
+
66
+ path.first.location.x.should == 1
67
+ path.first.location.y.should == 0
68
+ path.last.location.should == to
69
+ end
70
+
71
+
72
+ it 'should return the left up diag path of length 2' do
73
+ from = TwoDGridLocation.new 2, 2
74
+ to = TwoDGridLocation.new 0, 0
75
+
76
+ path = @pather.guide(from,to)
77
+
78
+ path.should != nil
79
+ path.size.should == 2
80
+
81
+ path.first.location.x.should == 1
82
+ path.first.location.y.should == 1
83
+ path.last.location.should == to
84
+ end
85
+
86
+ it 'should return the right up diag path of length 2' do
87
+ from = TwoDGridLocation.new 2, 2
88
+ to = TwoDGridLocation.new 4, 0
89
+
90
+ path = @pather.guide(from,to)
91
+
92
+ path.should != nil
93
+ path.size.should == 2
94
+
95
+ path.first.location.x.should == 3
96
+ path.first.location.y.should == 1
97
+ path.last.location.should == to
98
+ end
99
+
100
+ it 'should return the right down diag path of length 2' do
101
+ from = TwoDGridLocation.new 2, 2
102
+ to = TwoDGridLocation.new 4, 4
103
+
104
+ path = @pather.guide(from,to)
105
+
106
+ path.should != nil
107
+ path.size.should == 2
108
+
109
+ path.first.location.x.should == 3
110
+ path.first.location.y.should == 3
111
+ path.last.location.should == to
112
+ end
113
+
114
+ it 'should return the left down diag path of length 2' do
115
+ from = TwoDGridLocation.new 2, 2
116
+ to = TwoDGridLocation.new 0, 4
117
+
118
+ path = @pather.guide(from,to)
119
+
120
+ path.should != nil
121
+ path.size.should == 2
122
+
123
+ path.first.location.x.should == 1
124
+ path.first.location.y.should == 3
125
+ path.last.location.should == to
126
+ end
127
+
128
+ it 'should return go around an obstacle' do
129
+ from = TwoDGridLocation.new 0, 0
130
+ to = TwoDGridLocation.new 2, 0
131
+
132
+ in_the_way = TwoDGridLocation.new 1, 0
133
+ @map.place in_the_way, "ME"
134
+
135
+ path = @pather.guide(from,to)
136
+
137
+ path.should != nil
138
+ path.size.should == 2
139
+
140
+ path.first.location.x.should == 1
141
+ path.first.location.y.should == 1
142
+ path.last.location.should == to
143
+ end
144
+
145
+ it 'should return shortest path of horizontal and diag length 5' do
146
+ from = TwoDGridLocation.new 0, 0
147
+ to = TwoDGridLocation.new 5, 4
148
+
149
+ path = @pather.guide(from,to)
150
+
151
+ path.should != nil
152
+ path.size.should == 5
153
+
154
+ # make sure that all elements of the path are neighbors
155
+ prev_el = PathElement.new from, nil
156
+ path.each do |path_el|
157
+ @map.neighbors(prev_el.location).should.include? path_el.location
158
+ prev_el = path_el
159
+ end
160
+
161
+ path.last.location.should == to
162
+ end
163
+
164
+ it 'should return nil when the shortest path is longer than the max step passed in' do
165
+ from = TwoDGridLocation.new 0, 0
166
+ to = TwoDGridLocation.new 5, 4
167
+
168
+ path = @pather.guide(from,to,nil,4)
169
+ path.should == nil
170
+ end
171
+
172
+ it 'should return nil when the path does not exist for unit type' do
173
+ from = TwoDGridLocation.new 0, 0
174
+ to = TwoDGridLocation.new 2, 0
175
+
176
+ path = @pather.guide(from,to,:blocked)
177
+ path.should == nil
178
+ end
179
+
180
+ it 'should return nil when the path does not exist' do
181
+ from = TwoDGridLocation.new 0, 0
182
+ to = TwoDGridLocation.new 2, 0
183
+
184
+ # put up a wall
185
+ @map.h.times do |i|
186
+ @map.place TwoDGridLocation.new(1, i), "ME"
187
+ end
188
+
189
+ path = @pather.guide(from,to)
190
+ path.should == nil
191
+ @pather.nodes_considered.should == @map.h
192
+ end
193
+ end