CoralMUD-0.15/
CoralMUD-0.15/core/
CoralMUD-0.15/data/
CoralMUD-0.15/data/areas/
CoralMUD-0.15/data/help/
CoralMUD-0.15/data/players/
CoralMUD-0.15/lib/automap/
CoralMUD-0.15/lib/items/

$damage_adjectives = %w[pathetic piteous feeble listless weak poor trivial mediocre vigorous forceful potent strong powerful
                        vicious punishing terrific ferocious massive mighty brutal horrific savage crippling]
$damage_adj_interpolate_hash = {1=>0,2=>0,3=>1,4=>1, 5=>2, 6=>2, 10=>4, 30=>8, 100=>$damage_adjectives.count}
$damage_verbs ={:not_plural=> %w[miss tickle scratch nick] + ["lightly graze"] + %w[graze irritate bruise hit wound
                   smite maim mutilate mangle dismember ravage pulverize disfigure
                  destroy eviscerate slaughter annihilate decimate] + ["horribly disfigure"] + %w[OBLITERATE]}
$damage_verbs[:plural] = $damage_verbs.collect {|dv| dv.en.plural}

# return a verb based on a given percent.
def get_verb_from_percent pcnt, plural=:not_plural
  return $damage_verbs[plural].fetch(pcnt) {|i| i>0 ? "OBLITERATE" : "heal" }
end

def get_adjective_from_damage dmg
  puts dmg
  val = interpolate($damage_adj_interpolate_hash, dmg)
  return $damage_adjectives.fetch(val) {|i| i>0 ? "devastating" : "restorative" }
end
module HealthPool
  def dead?
    health <= 0
  end

  def health 
    100 - damage    
  end

  # deals damage and prints the facts about it.
  # returns true if player dies from the hit and false otherwise.
  # however, returns nil if target is already dead.
  def take_damage amt, who=nil
    pcnt = amt * 100 / self.health

    # already dead
    return nil if self.dead?    

    verb = get_verb_from_percent(pcnt)
    verb_plural = get_verb_from_percent(pcnt,:plural)
    adjective = get_adjective_from_damage(amt)
    if who    
      self.view "#{peek(who)} #{verb_plural} you with a #{adjective} attack." + ENDL
      who.view "You #{verb} #{peek(self)} with your #{adjective} attack." + ENDL
      self.in_room.display([:visual, "other.can_see?(actor) || other.can_see?(arg[0])"], who, [self, who],
            "<%=other.peek(actor)%> #{verb_plural} <%=other.peek(arg[0])%> with his #{adjective} attack.", self)
    end
    @damage = [] if !@damage
    @damage << {:amt=>amt, :type=>:normal}

    # if we're dead at this point we should act on it.
    if self.dead?
      self.view "The last bit of life flows from your body.  You've died." + ENDL
      self.in_room.display([:visual, "other.can_see?(actor)"], self, [self], "<%=other.peek(actor).capitalize%> has died.")
      if is_npc?
        self.make_corpse
        self.remove_from_gamespace # remove it from the room and (hopefully) from the gamespace for collection.
      end
      return true
    end
    return false
  end

  def heal_damage amt
    return if !@damage
    
    @damage.each do |dmg|
      if dmg[:amt] > amt
        dmg[:amt] -= amt
        amt = 0
        break
      else
        amt -= dmg[:amt]
        dmg[:amt] = 0
      end
    end

    @damage.delete_if {|dmg| dmg[:amt] <= 0}
    @damage = nil if @damage.empty?
    return amt
  end

  # return how much damage has been taken
  def damage
    count = 0
    @damage.each do |dmg|
      count += dmg[:amt]
    end
    return count
  end
end