(FILECREATED "21-Feb-86 16:41:43" {ERIS}<LISPUSERS>KOTO>WORM.;2 6357
changes to: (VARS WORMCOMS)
previous date: "12-Aug-85 09:26:16" {ERIS}<LISPUSERS>KOTO>WORM.;1)
(* Copyright (c) 1985, 1986 by Xerox Corporation. All rights reserved.)
(PRETTYCOMPRINT WORMCOMS)
(RPAQQ WORMCOMS ((FNS WORM WORM.ADVANCE-WORM WORM.DRAW-ONE-PART WORM.FIND-COORDINATES
WORM.SQUAR-DISTANCE)
(ALISTS (IDLE.FUNCTIONS Worm))))
(DEFINEQ
(WORM
[LAMBDA (WINDOW) (* sm " 9-Aug-85 17:10")
(while T
do (DISMISS 10)
(WORM.ADVANCE-WORM WINDOW])
(WORM.ADVANCE-WORM
[LAMBDA (WINDOW) (* sm "12-Aug-85 09:05")
(PROG (W-REG INC NEW-POS OLD-POS OLD-DIRECTION NEW-DIRECTION LAST-POS LAST-DIRECTION CENTER-POINT)
(SETQ INC (if (ZEROP (RAND 0 1))
THEN 20
ELSE -20))
(OPENW WINDOW)
(SETQ W-REG (WINDOWPROP WINDOW (QUOTE REGION)))
(SETQ CENTER-POINT (CONS (IQUOTIENT (fetch WIDTH of W-REG)
2)
(IQUOTIENT (fetch HEIGHT of W-REG)
2)))
(if (NULL (WINDOWPROP WINDOW (QUOTE WORM)))
then (CLEARW WINDOW)
[SETQ NEW-POS (CONS (RAND 25 (IPLUS (fetch WIDTH of W-REG)
-50))
(RAND 25 (IPLUS (fetch HEIGHT of W-REG)
-50]
(WORM.DRAW-ONE-PART (CAR NEW-POS)
(CDR NEW-POS)
25 WINDOW 0)
(WINDOWPROP WINDOW (QUOTE WORM)
(LIST (LIST NEW-POS 0)))
(WINDOWPROP WINDOW (QUOTE WORM.DIRECTION)
0)
(for I from 1 to 9 do (WORM.ADVANCE-WORM WINDOW))
else (PROG (CANDIDATE-LIST ITERATIONS DIS MINIMAL-DIS SECOND-ROUND CLOSEST-POINT)
(SETQ ITERATIONS 0)
[SETQ OLD-POS (CAR (CAR (WINDOWPROP WINDOW (QUOTE WORM]
TRY-AGAIN
(if (GREATERP ITERATIONS 18)
then (if (NULL CANDIDATE-LIST)
then (WINDOWPROP WINDOW (QUOTE WORM)
NIL)
(RETURN T))
(SETQ MINIMAL-DIS MAX.FIXP)
(for W in CANDIDATE-LIST when (LESSP (SETQ DIS (WORM.SQUAR-DISTANCE
(CAR W)
CENTER-POINT))
MINIMAL-DIS)
do (SETQ MINIMAL-DIS DIS)
(SETQ CLOSEST-POINT W))
(SETQ NEW-POS (CAR CLOSEST-POINT))
(SETQ NEW-DIRECTION (CADR CLOSEST-POINT))
(WINDOWPROP WINDOW (QUOTE WORM.DIRECTION)
NEW-DIRECTION)
else (add ITERATIONS 1)
(SETQ OLD-DIRECTION (WINDOWPROP WINDOW (QUOTE WORM.DIRECTION)))
[SETQ NEW-DIRECTION (IPLUS OLD-DIRECTION (if SECOND-ROUND
then INC
else (RAND -20 20]
(WINDOWPROP WINDOW (QUOTE WORM.DIRECTION)
NEW-DIRECTION)
(SETQ NEW-POS (WORM.FIND-COORDINATES (CAR OLD-POS)
(CDR OLD-POS)
50 NEW-DIRECTION))
(if (for W in (WINDOWPROP WINDOW (QUOTE WORM))
always (IGEQ (WORM.SQUAR-DISTANCE NEW-POS (CAR W))
(ITIMES 49 49)))
then (push CANDIDATE-LIST (LIST NEW-POS NEW-DIRECTION))
(if (NOT (SUBREGIONP (CREATEREGION 0 0 (fetch WIDTH
of W-REG)
(fetch HEIGHT of W-REG))
(CREATEREGION (IDIFFERENCE (CAR NEW-POS)
25)
(IDIFFERENCE (CDR NEW-POS)
25)
50 50)))
then (SETQ SECOND-ROUND T)
(GO TRY-AGAIN))
else (SETQ SECOND-ROUND T)
(GO TRY-AGAIN)))
(WORM.DRAW-ONE-PART (CAR NEW-POS)
(CDR NEW-POS)
25 WINDOW NEW-DIRECTION)
(WINDOWADDPROP WINDOW (QUOTE WORM)
(LIST NEW-POS NEW-DIRECTION)
T)
[if (GREATERP (LENGTH (WINDOWPROP WINDOW (QUOTE WORM)))
10)
then (WORM.DRAW-ONE-PART [CAAR (CAR (LAST (WINDOWPROP WINDOW (QUOTE WORM]
[CDAR (CAR (LAST (WINDOWPROP WINDOW (QUOTE WORM]
25 WINDOW
[CADR (CAR (LAST (WINDOWPROP WINDOW (QUOTE WORM]
T)
(WINDOWDELPROP WINDOW (QUOTE WORM)
(CAR (LAST (WINDOWPROP WINDOW (QUOTE WORM]
(WINDOWPROP WINDOW (QUOTE WORM.DIRECTION)
NEW-DIRECTION])
(WORM.DRAW-ONE-PART
[LAMBDA (X Y RADIUS WINDOW DIRECTION ERASE?) (* sm " 9-Aug-85 11:58")
(PROG (POS1 POS2)
(FILLCIRCLE X Y RADIUS (if ERASE?
then WHITESHADE
else BLACKSHADE)
WINDOW)
(if (NOT ERASE?)
then (SETQ POS1 (WORM.FIND-COORDINATES X Y (IDIFFERENCE RADIUS 6)
(IPLUS DIRECTION 90)))
(SETQ POS2 (WORM.FIND-COORDINATES X Y (IDIFFERENCE RADIUS 6)
(IDIFFERENCE DIRECTION 90)))
(FILLCIRCLE (CAR POS1)
(CDR POS1)
3 WHITESHADE WINDOW)
(FILLCIRCLE (CAR POS2)
(CDR POS2)
3 WHITESHADE WINDOW])
(WORM.FIND-COORDINATES
[LAMBDA (X1 Y1 LENGTH ANGLE) (* sm " 8-Aug-85 17:47")
(CONS (FIX (FPLUS (FTIMES (COS ANGLE)
LENGTH)
X1))
(FIX (FPLUS (FTIMES (SIN ANGLE)
LENGTH)
Y1])
(WORM.SQUAR-DISTANCE
[LAMBDA (P1 P2) (* sm " 9-Aug-85 10:24")
(IPLUS [ITIMES (ABS (IDIFFERENCE (CAR P1)
(CAR P2)))
(ABS (IDIFFERENCE (CAR P1)
(CAR P2]
(ITIMES (ABS (IDIFFERENCE (CDR P1)
(CDR P2)))
(ABS (IDIFFERENCE (CDR P1)
(CDR P2])
)
(ADDTOVAR IDLE.FUNCTIONS (Worm (QUOTE WORM)))
(PUTPROPS WORM COPYRIGHT ("Xerox Corporation" 1985 1986))
(DECLARE: DONTCOPY
(FILEMAP (NIL (482 6226 (WORM 492 . 674) (WORM.ADVANCE-WORM 676 . 4780) (WORM.DRAW-ONE-PART 4782 .
5515) (WORM.FIND-COORDINATES 5517 . 5806) (WORM.SQUAR-DISTANCE 5808 . 6224)))))
STOP