////////////////////////////////////////////////////////////////////////////////
//
//  Talus Menu on Rest
//  tal_rangerstart
//  OPW Integration and Clean Up By Don Anderson
//  dandersonru@msn.com
//
//  Used in Rest Menu Conversation
//
////////////////////////////////////////////////////////////////////////////////

string lessdetailedrace(object oTarg)
{
  string type;
  switch(GetRacialType(oTarg))
  {
    case RACIAL_TYPE_HUMAN:type="humanoid";break;
    case RACIAL_TYPE_HALFORC:type="humanoid";break;
    case RACIAL_TYPE_HALFLING:type="humanoid";break;
    case RACIAL_TYPE_HALFELF:type="humanoid";break;
    case RACIAL_TYPE_GNOME:type="humanoid";break;
    case RACIAL_TYPE_GIANT:type="giant";break;
    case RACIAL_TYPE_FEY:type="humanoid";break;
    case RACIAL_TYPE_ELF:type="humanoid";break;
    case RACIAL_TYPE_DWARF:type="humanoid";break;
    case RACIAL_TYPE_DRAGON:type="dragon";break;
    case RACIAL_TYPE_CONSTRUCT:type="golem";break;
    case RACIAL_TYPE_BEAST: type=GetName(oTarg);break;
    case RACIAL_TYPE_ANIMAL:type=GetName(oTarg);break;
    case RACIAL_TYPE_UNDEAD:type="humanoid";break;
    case RACIAL_TYPE_VERMIN:type="rodent";break;
    case RACIAL_TYPE_HUMANOID_GOBLINOID:type="goblin";break;
    case RACIAL_TYPE_HUMANOID_MONSTROUS:type="monster";break;
    case RACIAL_TYPE_HUMANOID_ORC:type="humanoid";break;
    case RACIAL_TYPE_OOZE:"slime";break;
    default: type="unknown creature";break;
  }
  return type;
}

string race(object oTarg)
{
  string type;
  switch(GetRacialType(oTarg))
  {
    case RACIAL_TYPE_HUMAN:type="human";break;
    case RACIAL_TYPE_HALFORC:type="half-orc";break;
    case RACIAL_TYPE_HALFLING:type="halfling";break;
    case RACIAL_TYPE_HALFELF:type="half-elf";break;
    case RACIAL_TYPE_GNOME:type="gnome";break;
    case RACIAL_TYPE_GIANT:type="giant";break;
    case RACIAL_TYPE_FEY:type="fey";break;
    case RACIAL_TYPE_ELF:type="elf";break;
    case RACIAL_TYPE_DWARF:type="dwarf";break;
    case RACIAL_TYPE_DRAGON:type="dragon";break;
    case RACIAL_TYPE_CONSTRUCT:type="golem";break;
    case RACIAL_TYPE_BEAST: type=GetName(oTarg);break;
    case RACIAL_TYPE_ANIMAL:type=GetName(oTarg);break;
    case RACIAL_TYPE_UNDEAD:type="undead humanoid";break;
    case RACIAL_TYPE_VERMIN:type="rodent";break;
    case RACIAL_TYPE_HUMANOID_GOBLINOID:type="goblin";break;
    case RACIAL_TYPE_HUMANOID_MONSTROUS:type="monster";break;
    case RACIAL_TYPE_HUMANOID_ORC:type="orc";break;
    case RACIAL_TYPE_OOZE:"slime";break;
    default: type="unknown creature";break;
  }
  return type;
}

void main()
{
  object oPC=GetPCSpeaker();
  object currentarea=GetArea(oPC);

  if(currentarea==GetLocalObject(oPC,"oldarea"))
  {
    SetCustomToken(8100,"You cannot use this ability more than twice in a row in the same area.");
    return;
  }
  else SetLocalObject(oPC,"oldarea",currentarea);

  location lTarget = GetLocation(oPC);
  int rangerlevels=GetLevelByClass(CLASS_TYPE_RANGER,oPC);
  float trackdist=24.0f+IntToFloat(4*rangerlevels);
  int maxtypes=3+(rangerlevels*2);
  int types=1;

  string message="",oldmessage="old",newmessage;
  string size;
  string type;
  string pronoun1;
  string pronoun2;
  string verb;
  string newresref;
  string oldresref;
  string armed;
  string armor;
  message+="";
  object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, trackdist, lTarget, TRUE, OBJECT_TYPE_CREATURE);
  while (oTarget!=OBJECT_INVALID && types<maxtypes)
  {
    armor=".";
    int targLevel=GetHitDice(oTarget);
    if(targLevel>20) size="huge";
    else if(targLevel>15) size="large";
    else if(targLevel>10) size="moderate sized";
    else if(targLevel>5) size="typical";
    else size="common";

    if(rangerlevels>=3) type=race(oTarget);
    else type=lessdetailedrace(oTarget);

    int weaponvalue=GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oTarget));
    if(weaponvalue>75) armed="heavily ";
    else if(weaponvalue>50) armed="well ";
    else armed="un";

    newresref=GetResRef(oTarget);
    if(newresref==oldresref)
    {
      pronoun1="a group of";
      pronoun2="s";
      verb="they are";
      if(type=="elf") type="elve";
    }
    else
    {
      pronoun1="a";
      pronoun2="";
      verb="it is";
    }

    if(rangerlevels>=8)
    {
      if(GetHasFeat(FEAT_ARMOR_PROFICIENCY_HEAVY,oTarget)) armor=" and "+verb+" obviously clad in heavy metal armor.";
      else if(GetHasFeat(FEAT_ARMOR_PROFICIENCY_MEDIUM,oTarget)) armor=" and "+verb+" probably wearing lightweight, leathery armor.";
      else armor=" and "+verb+" wearing little or no armor at all.";
    }

    newmessage="tracks of "+pronoun1+" "+size+" "+type+pronoun2+" are here, "+verb+" probably "+armed+"armed"+armor+"\n\n";
    if(newmessage!=oldmessage)
    {
      oldmessage=newmessage;
      message+=newmessage;
    }

    types++;
    oTarget = GetNextObjectInShape(SHAPE_SPHERE, trackdist, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
  }

  SetCustomToken(8100,message);
}