Cartographer Bot

From Redwall MUCK Wiki


This code generates a pure-MPI bot that, once started, will explore any area with exits named for the cardinal directions (n, s, e, w) and collect information about the area. Its navigational logic is primitive, so it will sometimes spend time pacing back and forth, but I was concerned about bumping into MPI's limits on function invocations. As an example, this is a good demonstration of one of the more sophisticated things that is possible in MPI.

To map the results stored by the bot, see the map file.

@create Cartographer=me=laserbot
@set $laserbot=Xforcible
@flock $laserbot=me
@desc $laserbot=A bot that maps rooms.
+reg $laserbot:maploc=$lasertest:act/test
@act start;stop=$laserbot=$laserbot:start=$nothing
@lock $laserbot:start=$laserbot
@succ $laserbot:start={if:{eq:{&cmd},stop},{kill:{prop:_pid}},{null:{store:5,_x,{loc:this}},{store:100,_y,{loc:this}}}{exec!:run}}
@set $laserbot:start=run:{null:{store:{delay:2,\{lexec:scan\,{loc:this}\}\{exec:run\}},_pid}}
lsedit $laserbot=scan
.del ^ $
{func:ninety,__dir,{if:{eq:{&__dir},n},e,{if:{eq:{&__dir},s},w,{if:{eq:{&__dir},e},s,{if:{eq:{&__dir},w},n}}}}}
{with:x,{default:{prop:_explore/{loc:this}/x},{prop:_x}},
{with:y,{default:{prop:_explore/{loc:this}/y},{prop:_y}},
{with:loc,{loc:this},
{null:
	{store:
		{&loc},
		_map/1/{&y}/{&x}},
	{with:xits,{mklist:n,s,e,w},
	{with:choice,,
	{with:sel,
		{filter:xt,{&xits},
			{not:{prop!:_explore/{&loc}/{&xt}}}},
		{with:trial,1,
			{while:
				{and:
					{eq:{loc:this},{&loc}},
					{le:{&trial},8}},
				{set:choice,
					{if:{le:{&trial},{count:{&sel}}},
						{sublist:{&sel},{&trial}},
						{if:{and:
								{prop:_trend},
								{or:{not:
									{prop:_explore/{loc:this}/{ninety:{prop:_trend}}}},
								{lt:{div:
									{prop:_explore/{loc:this}/{prop:_trend}/count},
									{prop:_explore/{loc:this}/{ninety:{prop:_trend}}/count}},
								2}}},
						{prop:_trend}
						{delprop:_trend},
						{lrand:w\re\rs\rn}}}}
				{force:this,go {&choice}}
				{inc:trial}}
			{if:{gt:{subt:{&trial},{count:{&sel}}},1},
				{store:{&choice},_trend}}}
		{if:{ne:{&loc},{loc:this}},
			{with:opp,,
				{if:{eq:{&choice},n},
					{dec:y}
					{set:opp,s},
					{if:{eq:{&choice},s},
							{inc:y}
							{set:opp,n},
							{if:{eq:{&choice},e},
								{inc:x}
								{set:opp,w},
								{if:{eq:{&choice},w},
									{dec:x}
									{set:opp,e}}}}}
				{store:{loc:this},_explore/{&loc}/{&choice}}
				{store:{add:1,{prop:_explore/{&loc}/{&choice}/count}},_explore/{&loc}/{&choice}/count}
				{store:{&loc},_explore/{loc:this}/{&opp}}
				{store:{&x},_explore/{loc:this}/x}
				{store:{&y},_explore/{loc:this}/y}
				{store:{&x},_x}
				{store:{&y},_y}}
			}}}}}}}}
.end