void NewLocation(object oPC, location lPC, int iDirection, int iMapSkill);


void main()
{
  object oPC = OBJECT_SELF;
  object oMap = GetLocalObject(oPC,"oMapUsed");
  DeleteLocalObject(oPC,"oMapUsed");

  location lNewLoc1;
  location lNewLoc2;
  location lNewLoc3;
  location lNewLoc4;
  location lNewLoc5;
  location lNewLoc6;
  location lNewLoc7;
  location lNewLoc8;
  location lNewLoc9;
  location lNewLoc10;
  location lNewLoc11;
  location lNewLoc12;
  location lNewLoc13;
  location lNewLoc14;
  location lNewLoc15;
  location lNewLoc16;
  location lStartLoc = GetLocation(oPC);

  string sAreaTag = GetTag(GetArea(oPC));
  string sAreaName = GetName(GetArea(oPC));


  //Map location variables
  string sMapAreaTag = GetLocalString(oMap,"sMapAreaTag");
  string sMapAreaName = GetLocalString(oMap,"sMapAreaName");
  float fMapUsedX = GetLocalFloat(oMap,"fMapPositionX");
  float fMapUsedY = GetLocalFloat(oMap,"fMapPositionY");
  float fMapUsedZ = GetLocalFloat(oMap,"fMapPositionZ");
  float fMapOrientation = GetFacing(oPC);
  object oMapArea = GetObjectByTag(sMapAreaTag);
  //May need to filter out all non-area object types in case of
  //tag-related issues.. i.e. area tag matching a sword item tag.

  vector vMap = Vector(fMapUsedX,fMapUsedY,fMapUsedZ);
  int iMapSkill = GetLocalInt(oMap,"iMapUsedSkill");
  location lPC = Location(oMapArea,vMap,fMapOrientation);


  FloatingTextStringOnCreature("You unfurl the map and attempt to get your bearings...",oPC,FALSE);
  AssignCommand(oPC,ActionPlayAnimation(ANIMATION_FIREFORGET_READ,0.2,4.0));

  if (sAreaTag!=sMapAreaTag)
   {
    AssignCommand(oPC,DelayCommand(4.1,FloatingTextStringOnCreature("This map does not apear to be for this area.",oPC,FALSE)));
    AssignCommand(oPC,DelayCommand(4.2,ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD,1.0,1.0)));
    return;
   }




  NewLocation(oPC,lPC,1,iMapSkill);
  lNewLoc1 = GetLocalLocation(oPC,"lLoc1");
  NewLocation(oPC,lPC,2,iMapSkill);
  lNewLoc2 = GetLocalLocation(oPC,"lLoc1");
  NewLocation(oPC,lPC,3,iMapSkill);
  lNewLoc3 = GetLocalLocation(oPC,"lLoc1");
  NewLocation(oPC,lPC,4,iMapSkill);
  lNewLoc4 = GetLocalLocation(oPC,"lLoc1");
  NewLocation(oPC,lPC,5,iMapSkill);
  lNewLoc5 = GetLocalLocation(oPC,"lLoc1");
  NewLocation(oPC,lPC,6,iMapSkill);
  lNewLoc6 = GetLocalLocation(oPC,"lLoc1");
  NewLocation(oPC,lPC,7,iMapSkill);
  lNewLoc7 = GetLocalLocation(oPC,"lLoc1");
  NewLocation(oPC,lPC,8,iMapSkill);
  lNewLoc8 = GetLocalLocation(oPC,"lLoc1");
  if (iMapSkill>700)
   {
    NewLocation(oPC,lPC,9,iMapSkill);
    lNewLoc9 = GetLocalLocation(oPC,"lLoc1");
    NewLocation(oPC,lPC,10,iMapSkill);
    lNewLoc10 = GetLocalLocation(oPC,"lLoc1");
    NewLocation(oPC,lPC,11,iMapSkill);
    lNewLoc11 = GetLocalLocation(oPC,"lLoc1");
    NewLocation(oPC,lPC,12,iMapSkill);
    lNewLoc12 = GetLocalLocation(oPC,"lLoc1");
    NewLocation(oPC,lPC,13,iMapSkill);
    lNewLoc13 = GetLocalLocation(oPC,"lLoc1");
    NewLocation(oPC,lPC,14,iMapSkill);
    lNewLoc14 = GetLocalLocation(oPC,"lLoc1");
    NewLocation(oPC,lPC,15,iMapSkill);
    lNewLoc15 = GetLocalLocation(oPC,"lLoc1");
    NewLocation(oPC,lPC,16,iMapSkill);
    lNewLoc16 = GetLocalLocation(oPC,"lLoc1");
   }
  DeleteLocalLocation(oPC,"lLoc1");

  //This section of script provides an on-PC 'hook' so that
  //you can check for this varibale in any 'trigger' areas
  //So that the trigger is not activated by the PC being
  //sent to that trigger by this script.. since the PC is not
  //really at the trigger location.

  SetLocalInt(oPC,"iPCUsedMap",99);

  //------ This value is erased after the PC is sent back to
  //their original location.



  ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectCutsceneGhost(),oPC,9.0);
  //BlackScreen(oPC);
  AssignCommand(oPC,ActionJumpToLocation(lNewLoc1));
  DelayCommand(0.5,AssignCommand(oPC,ActionJumpToLocation(lNewLoc2)));
  DelayCommand(1.0,AssignCommand(oPC,ActionJumpToLocation(lNewLoc3)));
  DelayCommand(1.5,AssignCommand(oPC,ActionJumpToLocation(lNewLoc4)));
  DelayCommand(2.0,AssignCommand(oPC,ActionJumpToLocation(lNewLoc5)));
  DelayCommand(2.5,AssignCommand(oPC,ActionJumpToLocation(lNewLoc6)));
  DelayCommand(3.0,AssignCommand(oPC,ActionJumpToLocation(lNewLoc7)));
  DelayCommand(3.5,AssignCommand(oPC,ActionJumpToLocation(lNewLoc8)));
  if (iMapSkill>700)
    {
     DelayCommand(4.0,AssignCommand(oPC,ActionJumpToLocation(lNewLoc9)));
     DelayCommand(4.5,AssignCommand(oPC,ActionJumpToLocation(lNewLoc10)));
     DelayCommand(5.0,AssignCommand(oPC,ActionJumpToLocation(lNewLoc11)));
     DelayCommand(5.5,AssignCommand(oPC,ActionJumpToLocation(lNewLoc12)));
     DelayCommand(6.0,AssignCommand(oPC,ActionJumpToLocation(lNewLoc13)));
     DelayCommand(6.5,AssignCommand(oPC,ActionJumpToLocation(lNewLoc14)));
     DelayCommand(7.0,AssignCommand(oPC,ActionJumpToLocation(lNewLoc15)));
     DelayCommand(7.5,AssignCommand(oPC,ActionJumpToLocation(lNewLoc15)));
     DelayCommand(8.0,AssignCommand(oPC,ActionJumpToLocation(lStartLoc)));
     DelayCommand(8.1,AssignCommand(oPC,DeleteLocalInt(oPC,"iPCUsedMap")));
     DelayCommand(8.2,AssignCommand(oPC,FloatingTextStringOnCreature("You carefully study the map and get your bearings..",oPC,FALSE)));
    }
   else
    {
     DelayCommand(4.0,AssignCommand(oPC,ActionJumpToLocation(lStartLoc)));
     DelayCommand(4.1,AssignCommand(oPC,DeleteLocalInt(oPC,"iPCUsedMap")));
     DelayCommand(4.2,AssignCommand(oPC,FloatingTextStringOnCreature("You carefully study the map and get your bearings..",oPC,FALSE)));
    }


  //DelayCommand(4.1,StopFade(oPC));
}



void NewLocation(object oPC, location lPC, int iDirection, int iMapSkill)
 {
  location lNewLoc;
  location lSelf = lPC;
  vector vSelf = GetPositionFromLocation(lPC);
  object oArea = GetArea(oPC);
  vector vNewLoc;
  int vDirection;
  float fSelf;
  float fDistance;
  float fDistanceMax;
  location lSelf2;
  fSelf = GetFacing(oPC);
  fDistanceMax = 45.0;
  if (iDirection>8)
   {
    iDirection=iDirection-8;
    fDistanceMax=30.0;
   }
  switch (iDirection)
   {
    case 1:{fSelf=fSelf+45.0;break;}
    case 2:{fSelf=fSelf+90.0;break;}
    case 3:{fSelf=fSelf+135.0;break;}
    case 4:{fSelf=fSelf+180.0;break;}
    case 5:{fSelf=fSelf+225.0;break;}
    case 6:{fSelf=fSelf+270.0;break;}
    case 7:{fSelf=fSelf+315.0;break;}
    default:{break;}
   }

  fDistance = fDistanceMax / (1000.0/IntToFloat(iMapSkill));
  vNewLoc = vSelf + (AngleToVector(fSelf) * fDistance);
  lSelf2 = Location(oArea,vNewLoc,fSelf);
  SetLocalLocation(oPC,"lLoc1",lSelf2);
  return;
 }









/*
void main()
{
  object oPC = OBJECT_SELF;
  FloatingTextStringOnCreature("You unfurl the map and attempt to get your bearings...",oPC,FALSE);

  string sAreaResRef = GetResRef(GetArea(oPC));
  string sAreaName = GetName(GetArea(oPC));
  string sMapArea = GetLocalString(oPC,"sMapAreaResRef");
  string sMapName = GetLocalString(oPC,"sMapAreaName");

  DeleteLocalString(oPC,"sMapAreaResRef");
  DeleteLocalString(oPC,"sMapAreaName");

  AssignCommand(oPC,ActionPlayAnimation(ANIMATION_FIREFORGET_READ,0.2,10.0));

  if (sAreaResRef!=sMapArea)
   {
    AssignCommand(oPC,DelayCommand(9.5,FloatingTextStringOnCreature("This map does not apear to be for this area.",oPC,FALSE)));
    AssignCommand(oPC,DelayCommand(10.0,ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD,1.0,1.0)));
    return;
   }

  AssignCommand(oPC,DelayCommand(9.5,FloatingTextStringOnCreature("You carefully study the map and get your bearings..",oPC,FALSE)));
  AssignCommand(oPC,DelayCommand(10.0,ActionPlayAnimation(ANIMATION_LOOPING_LOOK_FAR,1.0,4.0)));
  DelayCommand(10.0,ExploreAreaForPlayer(GetArea(oPC),oPC));

}