-
Notifications
You must be signed in to change notification settings - Fork 838
JarodBeginner
Jarod42 edited this page Sep 27, 2010
·
2 revisions
require 'set'
class Player
def initialize()
@archerInLine = false
@knowEnemy = Set.new
@seenStairs = false
end
def play_turn(warrior)
updateInfoBeginTurn(warrior)
action(warrior)
end
def getNextUnit(warrior, dir = :forward)
warrior.look(dir).each do |space|
return space.unit if !space.empty?
end
return nil
end
def unitType(unit)
return nil if unit == nil
return unit.character
end
def rangeunit?(warrior, dir = :forward)
unitType = unitType(getNextUnit(warrior, dir))
["a", "w"].each do |c| return true if c == unitType end
return false
end
def updateInfoBeginTurn(warrior)
warrior.look(:backward).each do |space|
@knowEnemy.add(space.unit) if space.enemy? != nil
@seenStairs = true if space.stairs?
end
warrior.look(:forward).each do |space|
@knowEnemy.add(space.unit) if space.enemy? != nil
@seenStairs = true if space.stairs?
end
@archerInLine = (rangeunit?(warrior) or rangeunit?(warrior, :backward))
end
def action(warrior)
if rescueAround(warrior) or finish(warrior) or attack(warrior) or restore(warrior)
return
else
move(warrior)
end
end
def neededMinHealth(warrior)
wantedHeath = 1
wantedHeath += 6 if !@seenStairs
@knowEnemy.each do |enemy|
case unitType(enemy)
when "S" then wantedHeath += 0
when "s" then wantedHeath += 4
when "a" then wantedHeath += 6
else wantedHeath += 0
end
end
return wantedHeath
end
def restore(warrior)
if warrior.health < neededMinHealth(warrior)
warrior.rest!
return true
end
return false
end
def attack(warrior)
nextUnit = getNextUnit(warrior)
case unitType(nextUnit)
when "w" then warrior.shoot!
when "a" then
if warrior.feel.enemy?
warrior.attack!
elsif nextUnit.health <= 3
warrior.shoot!
elsif warrior.look[1].enemy? or warrior.health - 3 > neededMinHealth(warrior)
warrior.walk!
else
warrior.shoot!
end
when "s" then # smaa(-3) or ssssm
if warrior.feel.enemy?
warrior.attack!
elsif nextUnit.health > 9
warrior.shoot!
else
warrior.walk!
end
when "S" then
if warrior.feel.enemy?
warrior.attack!
elsif (@archerInLine or nextUnit.health <= 5 or warrior.look[1].empty? \
or (warrior.health - 6 > neededMinHealth(warrior) and nextUnit.health <= 15))
warrior.walk!
else
puts ("neededHealth = #{neededMinHealth(warrior)}")
warrior.shoot!
end
else return false
end
@knowEnemy.subtract([nextUnit]) # it may die
return true
end
def finish(warrior, dir = :forward)
space = warrior.look(dir).each do |space|
break if (space.empty? and space.stairs?)
return false if !space.empty?
end
warrior.walk!
return true
end
def move(warrior)
if (warrior.feel.wall? \
or (warrior.feel.empty? and warrior.look[1].wall?))
warrior.pivot!
else
warrior.walk!
end
end
def rescueAround(warrior)
for dir in [:backward, :forward]
if (warrior.feel(dir).captive?)
warrior.rescue!(dir)
return true
end
if (warrior.feel(dir).empty?)
for i in (1 .. 2)
if (warrior.look(dir)[i].captive?)
warrior.walk!(dir)
return true
elsif (!warrior.look(dir)[i].empty?)
break
end
end
end
end
return false
end
end