TinTin++ Mud Client Scripts
The following script allows you to scout an area, visiting every room in the area at least once. This is useful for quests that want you to find a mob or item in a random location in an area.

If you want to start out searching within a radius of 5 rooms first, set the scout[quick] variable from 0 to 5.

You need to have the area mapped using #map and the AREA field set for all rooms in the area using #map set roomarea , and to begin scouting you would type: scout

This script is written for v2.01.97 and higher

#VARIABLE {room_list} {}

#VARIABLE {scout}
{
     {quick} {0}
}
#VARIABLE {quick} {0}

#ALIAS {scout}
{
     #if {"%0" == ""}
     {
          #showme <118>Syntax: scout <area name>;
          #return
     };
     #if {"%1" == "pause"}
     {
          #variable scout[mode] paused;
          #return
     };
     #if {"%1" == "continue"}
     {
          #variable scout[mode] scout;
          #return
     };
     #if {"%1" == "reset"}
     {
          reset_area $scout[area];
          #return
     };
     #variable scout[area] {%0};
     #map list {} {} {} {$scout[area]} {variable} {room_list};
     #if {&room_list[] == 0}
     {
          #showme <118>scout {%1}: No rooms found belonging to %1.;
          #return
     };
     #loop {1} {&room_list[]} {cnt}
     {
          set_room_color *room_list[+$cnt] <128>;
          set_room_note *room_list[+$cnt] {unchecked};
          set_room_weight *room_list[+$cnt] {1000}
     };
     #map get roomvnum scout[inroom];
     #map get roomvnum scout[startroom];
     #variable scout[mode] prune;
     #loop {1} {&room_list[]} {cnt}
     {
          #map at *room_list[+$cnt] #map get roomexits scout[exit];
          #if {&scout[exit][] == 1}
          {
               #map goto *room_list[+$cnt];
               #map explore *scout[exit][+1];
               #path save forward scout[path];
               #foreach {$scout[path]} {scout[walk]}
               {
                    #map move $scout[walk]
               }
          }
     };
     #path destroy;
     #variable scout[mode] scout;
     #map goto $scout[inroom];
     scout_nearest_room;
     #ticker {scout}{#if {&scout[] && &room_list[]}{#if {"$scout[mode]" != "scout"}{#return};#line quiet {#path save length scout[len];#path save position scout[pos]};#if {$scout[pos] <= $scout[len]}{#path
walk}}}{0.25}
}

#ALIAS {scout_nearest_room}
{
     #variable scout[weight] {1000000};
     #line quiet {#map find $scout[startroom];#path save length scout[len];#path destroy};
     #if {$scout[len] == $scout[quick]}
     {
          #map at $scout[startroom] #map list {} {} {} {$scout[area]} {unchecked} {variable} {room_list}
     };
     #else
     {
          #map list {} {} {} {$scout[area]} {unchecked} {variable} {room_list}
     };
     #loop {1} {&room_list[]} {cnt}
     {
          #if {$room_list[+$cnt][distance] != -1 && $room_list[+$cnt][distance] < $scout[weight]}
          {
               #variable scout[weight] $room_list[+$cnt][distance];
               #variable scout[vnum]   *room_list[+$cnt]
          }
     };
     #if {$scout[weight] == 1000000}
     {
          #line ignore #showme <118>scout: Found &{room_list[]} rooms belonging to area '$scout[area]';
          #line ignore #showme <118>scout: Could not find a path leading to this area, aborting.;
          reset_area $scout[area]
     };
     #else
     {
          #map get roomvnum scout[inroom];
          #if {$scout[vnum] == $scout[inroom]}
          {
               scout_mark_room;
               #delay {scout} {scout_nearest_room} {0.25}
          };
          #else
          {
               #map find $scout[vnum]
          }
     }
}

#ALIAS {scout_mark_room}
{
     #if {&scout[] && &room_list[]}
     {
          #map get roomarea scout[inarea];
          #map get roomvnum scout[inroom];
          #if {"$scout[inarea]" == "$scout[area]"}
          {
               set_room_color {$scout[inroom]} {<118>};
               set_room_weight {$scout[inroom]} {10000};
               set_room_note {$scout[inroom]} {checked};
               #unvariable room_list[$scout[inroom]];
               #if {&room_list[] == 0}
               {
                    #delay {0.5}{#showme <118>scout: finished;reset_area $scout[area]};
                    #undelay {scout};
                    #unticker {scout}
               }
          }
     }
}

#EVENT {END OF PATH}
{
     #if {&scout[] && &room_list[]}
     {
          scout_nearest_room
     }
}

#EVENT {MAP ENTER ROOM}
{
     #if {&scout[]}
     {
          #switch {"$scout[mode]"}
          {
               #case {"prune"}
               {
                    reset_room_weight {}
               };
               #case {"scout"}
               {
                    scout_mark_room
               }
          }
     }
}

#ALIAS {set_room_note}
{
     #map at {%1} #map set roomnote %2
}

#ALIAS {set_room_color}
{
     #map at {%1} #map set roomcolor %2
}

#ALIAS {set_room_weight}
{
     #map at {%1} #map get roomweight scout[weight];
     #if {$scout[weight] < %2}
     {
          #map at {%1} #map set roomweight $scout[weight] + %2
     }
}

#ALIAS {reset_room_weight}
{
     #map at {%1} #map get roomweight scout[weight];
     #map at {%1} #map set roomweight $scout[weight] % 1000
}

#ALIAS {reset_area}
{
     #map list {} {} {} {%0} {variable} {room_list};
     #loop {1} {&room_list[]} {cnt}
     {
          set_room_color *room_list[+$cnt] <178>;
          reset_room_weight {*room_list[+$cnt]};
          set_room_note *room_list[+$cnt] {}
     };
     #variable room_list {};
     #variable scout {}
}