\begingroup \catcode`\^^A=11 \global\newlinechar`\^^A \gdef\want{\message{^^AWANT^^A}\wait} \gdef\donemsg{\message{^^ADONE^^A}} \gdef\send#1{\message{^^AHERE: #1^^A}} \gdef\wait{\begingroup\activecodes\read\sixt@@n to\command\expandafter\endgroup\command} \gdef\initloop{\@loopingtrue\@whilesw\if@looping\fi{\want}} \gdef\mainloop{\initloop\@loopingtrue\@whilesw\if@looping\fi{\trialloop}} \gdef\trialloop{% \startPicture \@innerlooptrue\@whilesw\if@innerloop\fi{\want}% \endPicture } \gdef\debug#1#2{\message{^^ADEBUG(#1): #2^^A}} \endgroup \def\echo#1#2{\debug#1{#2=\the#2}} \def\sdef#1{\expandafter\def\expandafter#1\space} % Def w/ space \sdef\init #1 #2 #3 #4 #5 #6 #7 #8 ;{% \global\@loopingfalse % gets us past the init loop \dset\dx=#1;% \dset\dy=#2;% \cset\limit=#3;% \dset\minsensor=#4;% \dset\maxsensor=#5;% \dset\maxspeed=#6;% \dset\maxturn=#7;% \dset\maxhardturn=#8;% \debug1{Got init!}% \unspace } \begingroup % catcode problems with reading b! \catcode`b\active \gdef\set@vctl#1#2;{% \gdef\accstate{#1}\gdef\turnstate{#2}% \ifx#1b\glet\accstate\b\fi } \endgroup \sdef\telem #1 #2 #3 #4 #5 #6 #7;{% \global\@loopingtrue\global\@innerlooptrue \cset\time=#1;% \set@vctl#2;% \dset\vx=#3;% \dset\vy=#4;% \dset\vdir=#5;% \dset\vspeed=#6;% \debug3{Telemetry: state=\accstate\turnstate}% \debug3{\vx=\the\vx, \vy=\the\vy, \vdir=\the\vdir, \vspeed=\the\vspeed}% #7% read the sensor data... (no ;) \debug1{#1: (\accstate\turnstate) #3,#4 @#5 v=#6 \if@swerving S\obs@obj\else R\fi}% \global\@talemdatatrue \processtelemetry \ifx\pulse\pulse@wait \glet\pulse\pulse@normal % start thinking again... \startTrial \fi\unspace } \sdef\boulderHit #1 ;{% % Should mark this on the map...? \global\@swervingfalse \debug1{Boing}% \unspace } \sdef\craterHit #1 ;{% \debug1{Crash}% \unspace } \sdef\martianHit #1 ;{% \debug1{Are you my mommy?}% \unspace } \sdef\success #1 ;{% \debug1{Success!}% % put a bug here to test robustness? \unspace } \sdef\pulse@normal #1 ;{% \cset\dt=#1;% \advance\dt-\clock \cset\clock=#1;% \ifnum\dt<100\ifnum\dt>\z@ % prevent (or cause) chaos \global\@talemdatafalse \projecttelemetry \fi\fi\unspace } \sdef\pulse@wait #1 ;{% \count@#1\advance\count@-\time\ifnum\count@>\droptimeout\done\fi \cset\clock=#1;\unspace } \let\pulse\pulse@wait \sdef\seeBoulder #1 #2 #3 {% \dset\dimen@=#3;\advance\dimen@\roverrad \add\boulders{(#1,#2,\the\dimen@)}\unspace } \sdef\seeCrater #1 #2 #3 {% \dset\dimen@=#3;\advance\dimen@\roverrad \add\craters{(#1,#2,\the\dimen@)}\unspace } \sdef\seeMartian #1 #2 #3 #4 {% \debug4{Ignoring a martian @ #1,#2:#3:#4}% \iflatex\drawmartian{#1}{#2}\fi\unspace } \sdef\seeHome #1 #2 #3 {% \debug4{Home in sight @ #1,#2:#3!}\unspace } \def\startTrial{% \glet\wantturn\-\glet\wantacc\- \glet\mode\dostart \global\@swervingfalse } \sdef\endTrial #1 #2 ;{% \debug1{Ending trial}% \glet\pulse\pulse@wait \global\@innerloopfalse %\global\@loopingfalse } % get rid of last page... \def\voidoutput{\setbox0\box255} \def\done{% \global\@loopingfalse\global\@innerloopfalse \donemsg\iflatex\global\output\xa{\the\output \global\output{\voidoutput}}\fi% } \def\eq?#1#2{\def\@tmp{#2}\ifx\@tmp#1\@testtrue\fi} \def\add#1#2{% \begingroup \edef\obj{#2}% \@testfalse \def\\{\eq?\obj}% \the#1% \relax \if@test\else % don't duplicate \global#1\xa\xa\xa{\xa\the\xa#1\xa\\\xa{\obj}}% \debug2{Adding obstacle #2 to #1}% \iflatex % only draw what we see... \ifx#1\boulders\xa\drawCircle\obj{gray}% \else\ifx#1\craters\xa\drawCircle\obj{brown}% \else\xa\drawCircle\obj{black}% \fi\fi\fi\fi \endgroup }