class State

	def Links=(links)
		@links = links
	end
	
	def Links
		return @links
	end	
	
	def ArriveFunc
		@arriveFunc
	end
	
	def DepartFunc
		@arriveFunc
	end	
	
	def initialize(arriveFunc,departFunc,name)
		@links = []
		@arriveFunc = arriveFunc
		@departFunc = departFunc
	end
	
	def Evaluate()
		for t in @links
			if (t.Test)
				(@departFunc != nil)? @departFunc.call : 0
				(t.Finish.ArriveFunc != nil)? t.Finish.ArriveFunc.call : 0
				return t.Finish
			end
		end
		return self
	end
end

class Link
	def Start
		@start
	end
	def Finish
		@finish
	end
	
	def Test
		@test
	end
	
	def initialize(name,start,finish,test)
		@start = start
		@finish = finish
		@test = test
		
		# Link the tests
		@start.Links.push(self)
	end	
end


class Quest	
	def initialize()
		@name = ""
		@description = ""
	end
end

class Bunny

	def Eat
		print "Eating\n"
		print "Adding object to tick queue scheduled for 1 sec\n"
	end
	
	def Move
		print "Moving\n"
		print "Adding object to tick queue scheduled for 1 sec\n"
	end

	def initialize()
		# Define states
		@eat = State.new(method(:Eat),nil,"Eat")
		@walk = State.new(method(:Move),nil,"Move")
		
		# Define links
		@eatWalk = Link.new("1",@eat,@walk,true)
		@walkEat = Link.new("2",@walk,@eat,true)
		
		@currentState = @eat
	end
	
	def Tick()
		@currentState = @currentState.Evaluate()
	end
end


#begin rdoc
#Example thing
#1
#2
#3
#end
class Combat

	def HandToHand
		print "Eating\n"
		print "Adding object to tick queue scheduled for 1 sec\n"
	end

	#A
	#This is the weapon function
	#end
	def Weapon 
		print "Moving\n"
		print "Adding object to tick queue scheduled for 1 sec\n"
	end
	
	def Spell
		print "Moving\n"
		print "Adding object to tick queue scheduled for 1 sec\n"
	end	

	def initialize(mobile1,mobile1)
		
		# Involved parties
		@mobile1 = mobile1
		@mobile2 = mobile2
		
		
		# Define states
		@eat = State.new(method(:Eat),nil,"Eat")
		@walk = State.new(method(:Move),nil,"Move")
		
		# Define links
		@eatWalk = Link.new("1",@eat,@walk,true)
		@walkEat = Link.new("2",@walk,@eat,true)
		
		@currentState = @eat
	end
	
	def Tick()
		@currentState = @currentState.Evaluate()
	end
end


bunny = Bunny.new()
bunny.Tick()
bunny.Tick()
bunny.Tick()
bunny.Tick()