diff --git a/lib/ruby_warrior.rb b/lib/ruby_warrior.rb index 77bfcc17..8881f056 100644 --- a/lib/ruby_warrior.rb +++ b/lib/ruby_warrior.rb @@ -33,3 +33,4 @@ require 'ruby_warrior/abilities/bind' require 'ruby_warrior/abilities/listen' require 'ruby_warrior/abilities/direction_of_stairs' +require 'ruby_warrior/abilities/direction_of' diff --git a/lib/ruby_warrior/abilities/direction_of.rb b/lib/ruby_warrior/abilities/direction_of.rb new file mode 100644 index 00000000..6fb827d4 --- /dev/null +++ b/lib/ruby_warrior/abilities/direction_of.rb @@ -0,0 +1,13 @@ +module RubyWarrior + module Abilities + class DirectionOf < Base + def description + "Pass a Space as an argument, and the direction (:left, :right, :forward, :backward) to that space will be returned." + end + + def perform(space) + @unit.position.relative_direction_of(space) + end + end + end +end diff --git a/lib/ruby_warrior/abilities/direction_of_stairs.rb b/lib/ruby_warrior/abilities/direction_of_stairs.rb index dd7f0c1b..30c8b2a8 100644 --- a/lib/ruby_warrior/abilities/direction_of_stairs.rb +++ b/lib/ruby_warrior/abilities/direction_of_stairs.rb @@ -10,4 +10,4 @@ def perform end end end -end +end \ No newline at end of file diff --git a/lib/ruby_warrior/position.rb b/lib/ruby_warrior/position.rb index 67912249..9d9fe29f 100644 --- a/lib/ruby_warrior/position.rb +++ b/lib/ruby_warrior/position.rb @@ -43,11 +43,15 @@ def distance_from_stairs end def relative_direction_of_stairs - relative_direction(direction_of_stairs) + relative_direction_of(@floor.stairs_space) end - def direction_of_stairs - stairs_x, stairs_y = *@floor.stairs_location + def relative_direction_of(space) + relative_direction(direction_of(space)) + end + + def direction_of(space) + stairs_x, stairs_y = *space.location if (@x - stairs_x).abs > (@y - stairs_y).abs if stairs_x > @x :west diff --git a/lib/ruby_warrior/space.rb b/lib/ruby_warrior/space.rb index 7dc69c6a..3a355487 100644 --- a/lib/ruby_warrior/space.rb +++ b/lib/ruby_warrior/space.rb @@ -25,13 +25,17 @@ def empty? end def stairs? - @floor.stairs_location == [@x, @y] + @floor.stairs_location == location end def unit @floor.get(@x, @y) end + def location + [@x, @y] + end + def to_map if unit unit.to_map diff --git a/spec/ruby_warrior/abilities/direction_of_spec.rb b/spec/ruby_warrior/abilities/direction_of_spec.rb new file mode 100644 index 00000000..0ea671ef --- /dev/null +++ b/spec/ruby_warrior/abilities/direction_of_spec.rb @@ -0,0 +1,13 @@ +require File.dirname(__FILE__) + '/../../spec_helper' + +describe RubyWarrior::Abilities::DirectionOf do + before(:each) do + @position = stub + @distance = RubyWarrior::Abilities::DirectionOf.new(stub(:position => @position, :say => nil)) + end + + it "should return relative direction of given space" do + @position.stubs(:relative_direction_of).with(:space).returns(:left) + @distance.perform(:space).should == :left + end +end diff --git a/spec/ruby_warrior/position_spec.rb b/spec/ruby_warrior/position_spec.rb index ff24b2b6..37c1c541 100644 --- a/spec/ruby_warrior/position_spec.rb +++ b/spec/ruby_warrior/position_spec.rb @@ -73,12 +73,15 @@ @position.distance_from_stairs.should == 2 end - it "should return direction and relative direction of stairs" do + it "should return relative direction of stairs" do @floor.place_stairs(0, 0) - @position.direction_of_stairs.should == :north @position.relative_direction_of_stairs.should == :forward end + it "should return relative direction of given space" do + @position.relative_direction_of(@floor.space(0, 0)).should == :forward + end + it "should be able to determine relative direction" do @position.relative_direction(:north).should == :forward @position.rotate 1