SUBROUTINE LOOK(WHO) C C THIS ROUTINE IS TO 'LOOK AHEAD' TO A DESTINATION FROM A SPECIFIED POINT C TO SEE IF AN OBJECT (SHIP, FREIGHTER, ETC.) WILL BE ABLE TO GET THERE C WITHOUT HITTING SOMETHING IMMOVABLE. 'IMMOVABLE' IS DEFINED TO BE AN C INACTIVE SHIP, A STAR, A STARBASE, OR A HYPERSPACE PORT (RANDOM OR C FIXED). ALL OTHER THINGS ENCOUNTERED ARE DISREGARDED, SINCE IT IS C ASSUMED THAT THE OBJECT WILL EVENTUALLY MOVE OUT OF THE WAY. C C IF NOTHING IMMOVABLE IS ENCOUNTERED, THEN SIMPLY SET COURSE FOR THE C DESTINATION. IF SOMETHING IMMOVABLE IS ENCOUNTERED, THEN FROM A NORMAL C FROM THE TRUE BASE COURSE, LOOK AHEAD TO A POINT ON THE NORMAL TO EITHER C SIDE OF THE BASE COURSE TO SEE IF WE COULD MOVE TO THERE. EVENTUALLY, C WE WILL BE ABLE TO. IN THAT CASE, THAT POINT BECOMES THE TEMPORARY C DESTINATION, AND THE OBJECT WILL MOVE ALONG A COURSE TO IT. C INCLUDE 'TRKCOMMON.FTN' REAL LAUNCH INTEGER SCAN,WHOM,CREW,HYPER,TORPS,WHO LOGICAL*1 THRU,XSHIP,CLOAK,CLON,OK,FBASE,US REAL DX(3),DY(3) BYTE UNIV,MESSAG,INITLS,CHAR C C IX = IBASE(WHO,(FDBASE(WHO)*2)-1) IY = IBASE(WHO,FDBASE(WHO)*2) IELEM=1 C C CALCULATE THE COURSE TO THE DESTINATION C 10000 XI=FXCORD(WHO) YI=FYCORD(WHO) ITIMES=0 10001 CALL COURSE(XI,YI,IX,IY,EDIR,EDIS) TCOURS = (15.-EDIR)*30. IF (EDIR.LT.3) TCOURS = (3.-EDIR)*30. ITIMES=ITIMES+1 IF (ITIMES.EQ.1) ORGCRS=TCOURS C C NOW TRY TO MOVE C CALL MOVE(XI,YI,X,Y,TCOURS,10.,CHAR,UNIV) D WRITE (5,2) XI,YI,X,Y,CHAR,EDIR 2 FORMAT (' XI,YI = ',2(F6.2,2X),' X,Y = ',2(F6.2,2X),' CHAR = ',A1 1 ,' COURSE = ',F10.2) IX1=X IY1=Y C C HIT ANYTHING? C IF (IX1.EQ.IX.AND.IY1.EQ.IY) GOTO 20000 IF (CHAR.NE.'.') GOTO 10200 10007 XI=X YI=Y GOTO 10001 C C WE HIT SOMETHING. SEE IF IT'S SOMETHING WHICH C SHOULD MOVE OUT OF THE WAY (TORPEDO, ACTIVE SHIP, BLACK HOLE, A-M MINE). C IF IT IS, LOOK AHEAD THE REST OF THE WAY. IF IT WON'T MOVE, CALCULATE A C COURSE TO A POINT ON A NORMAL FROM THE BASE COURSE. C 10200 IF (CHAR.EQ.'@'.OR.CHAR.EQ.'#'.OR.CHAR.EQ.'+'.OR.CHAR.EQ.'^') 1 GOTO 10007 IF (CHAR.LT.'1'.OR.CHAR.GT.'8') GOTO 10009 DECODE (1,10008,CHAR) J 10008 FORMAT (I1) IF (XSHIP(J)) GOTO 10007 C C WHAT WE HAVE TO DO NOW IS TO LOOK EITHER SIDE OF THE OBSTRUCTION, C SETTING UP A TEMPORARY DESTINATION. THEN, WE SEE IF WE CAN GET THERE C WITHOUT HITTING SOMETHING IMMOVABLE. THE FOLLOWING CODE WILL SET UP C OFFSETS TO DO THIS. NOTE THAT THE OFFSETTING PORTION OF THE CODE IS C DONE ONLY ONCE WHEN WE'VE NOT CALCULATED A BASE COURSE BEFORE TO A C DESTINATION. C C IF WE'RE CURRENTLY OFFSETIING, THEN WE DON'T DO THIS. C 10009 IF (IELEM.GT.1) GOTO 10017 BCRS(WHO)=.FALSE. IELEM=3 DX(1)=IX1 DX(2)=IX1 DX(3)=IX1 DY(1)=IY1 DY(2)=IY1 DY(3)=IY1 IOFF = 2 IF ((TCOURS.GE.45.AND.TCOURS.LT.135).OR. 1 (TCOURS.GE.225.AND.TCOURS.LT.315)) IOFF = 1 D WRITE (5,3) IX1,IY1 3 FORMAT (' MTLOOK -- SETTING DX,DY WITH ',2(I3,2X)) C C WE'VE EITHER FINISHED OFFSETTING (DONE IN PAIRS OF OFFSETS, ONE OFFSET C TO EACH SIDE OF THE OBSTRUCTION), OR WE'VE NEVER OFFSETTED BEFORE. C THUS, DETERMINE THE OFFSETS NOW. C 10017 IF (IELEM.EQ.2) GOTO 10015 GOTO (10010,10011) IOFF 10010 DX(2)=DX(1)-1. DX(3)=DX(1)+1. GO TO 10012 10011 DY(2)=DY(2)-1. DY(3)=DY(1)+1. 10012 DO 10013 IZ=2,3 IF (DX(IZ).GT.100) DX(IZ)=DX(IZ)-100 IF (DY(IZ).GT.100) DY(IZ)=DY(IZ)-100 IF (DX(IZ).LT.1) DX(IZ)=100+DX(IZ) IF (DY(IZ).LT.1) DY(IZ)=100+DY(IZ) 10013 CONTINUE C C THE OFFSETS HAVE BEEN DETERMINED, NOW LOOK AT THEM. C 10014 IELEM=2 GOTO 10016 C 10015 IELEM=3 C 10016 IX = DX(IELEM) IY = DY(IELEM) D WRITE (5,1) IX,IY,IELEM 1 FORMAT (' MTLOOK -- OFFSETTING, IX,IY = ',2(I3,2X),' ELEM = ',I2) GOTO 10000 C C FOUND A NEW COURSE C 20000 FCOURS(WHO)=ORGCRS BCRS(WHO)=.TRUE. FXDEST(WHO)=IX1 FYDEST(WHO)=IY1 20001 RETURN END