- 
                Notifications
    
You must be signed in to change notification settings  - Fork 828
 
vigi99Beginner
        viig99 edited this page Jan 13, 2012 
        ·
        4 revisions
      
    class Player
  	def initialize
  		@health_max = @current_health = @hp_before_last_turn = 20
  		@warrior = @last_command = @rescueDone = nil
  	end
  	def play_turn(warrior)
  		@warrior = warrior
  		updateGlobals
      decideDirectionToMove && return
    	if feel.empty? then
    		hp_in_percentage < 50 ? (weAreBeingHit? ? riskyToMove : enemyBeforeStairs) : (isnextEnemyRanged ? shoot : rangedInSight)
    	else
    		hp_in_percentage >= 50 ? ifWallTurnElseContinue : (weAreBeingHit? ? decideToFightOrFlee : checkCaptiveOrMoveBack)
    	end
  	end
    def decideDirectionToMove
      return false if (!look.map{|x| x.enemy?}.include?(true) && look.map{|x| x.captive?}.include?(true))
      if (look(:backward).map{|x| x.enemy? }.include?(true) || look(:backward).map(&:to_s).include?("Stairs") || look(:backward).map(&:to_s).include?("Captive"))
        if !isnextEnemyRanged
          @warrior.pivot! 
          return true
        end
      end
      false
    end
    def rangedInSight
      ((look[1].enemy? && look[2].enemy?) || look[1].character == 'S') ? shoot : move
    end
    def checkCaptiveOrMoveBack
      feel.captive? ? rescueCaptive : move(:backward)
    end
    def isnextEnemyRanged
      look.each do |enemy|
        return false if (enemy.captive? or enemy.stairs?)
        return true if (enemy.to_s == "Archer" || enemy.to_s == "Wizard")
      end
      false
    end
  	def move(direction=:forward)
  		@warrior.walk!(direction)	
  	end
    def look(direction=:forward)
      @warrior.look(direction)
    end
    def shoot(direction=:forward)
      @warrior.shoot!(direction)
    end
    def enemyBeforeStairs
      (look[1].enemy? && (look[1].character.to_s == 's'  || look[1].character.to_s == 'S') && look[2].stairs?) ? shoot : restUnlessStairs
    end
  	def restUnlessStairs(direction=:forward)
  		feel(direction).stairs? || (feel(direction).empty? && look(direction)[1].stairs? || (look[0].empty? && look[1].empty? && look[2].stairs?)) ? move(direction) : rest
  	end
  	def riskyToMove
  		hp_in_percentage > 30 ? (look[1].enemy? ? shoot : move) : move(:backward)
  	end
  	def feel(direction=:forward)
  		@warrior.feel(direction)
  	end
  	def updateGlobals
  		@hp_before_last_turn = @current_health
  		@current_health = @warrior.health
  	end
  	def decideToFightOrFlee
  		hp_in_percentage > 30 ? attack : ((look[0].character == 'a') ? attack : move(:backward))
  	end
  	def attack(direction=:forward)
  		@warrior.attack!(direction)
	  end
  	def rescueOrAttack(direction=:forward)
  		feel(direction).captive? ? rescueCaptive : attack
  	end
  	def ifWallTurnElseContinue(direction=:forward)
  		feel(direction).wall? ? @warrior.pivot! : rescueOrAttack
  	end
  	def rescueCaptive(direction=:forward)
  		@warrior.rescue!(direction)
  		@rescueDone = true
  	end
    def rest
      @warrior.rest!
    end
    def hp_in_percentage
      (@current_health.to_f/@health_max.to_f) * 100
    end
  	def weAreBeingHit?
  	  (@hp_before_last_turn > @current_health) ? true : false
  	end
end