home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
No Fragments Archive 10: Diskmags
/
nf_archive_10.iso
/
MAGS
/
ST_USER
/
1989
/
USER1289.MSA
/
LISTINGS_BATTLEX.BSC
< prev
next >
Wrap
Text File
|
1989-09-28
|
6KB
|
282 lines
REM Serial battleships
REM by Julia Forester
REM (c) Atari St User
REM Requires 96k workspace
PROCinit
REPEAT
REPEAT
PROCdrawmap
PROCclearbuf
PROCposition
PROCstart
REPEAT
IF at THEN PROCdefend ELSE PROCattack
at=at EOR 1
UNTIL score=bits OR hits=bits
UNTIL FNfini
END
DEF PROCsend(X%,Y%,H%)
bytes(0)=X%+32:bytes(1)=Y%+32:bytes(2)=H%+32
bytes(3)=(X%+Y%+H%+32)
REPEAT
REPEAT:PROCput(19):UNTIL FNget=17
FOR i=0 TO 3
PROCput(bytes(i))
NEXT
IF FNget=0 THEN PROCmsg("Error sending"):sent=0:ELSE sent=1
UNTIL sent
PROCmsg("Message received ok")
ENDPROC
DEF PROCreceive
okts=1
REPEAT
REPEAT:UNTIL FNget=19:PROCput(17)
FOR i=0 TO 3:bytes(i)=FNget:NEXT
sum=0
FOR j=0 TO 2:sum=sum+bytes(j)-32:NEXT
IF sum+32=bytes(3) THEN okts=0
IF okts THEN PROCput(0) ELSE PROCput(19)
UNTIL okts=0
PROCmsg("Message received ok")
FOR j=0 TO 2:bytes(j)=bytes(j)-32:NEXT
ENDPROC
DEF PROCput(byte)
PROCmsg("Sending data...")
REPEAT:UNTIL OUTSTAT(1)
OUT (1),byte
ENDPROC
DEF FNget
PROCmsg("Waiting for data...")
REPEAT:UNTIL INPSTAT(1)
a=INP(1)
=a
DEF PROCinit
a=RND(-TIME)
IF SCREENMODE THEN a=ALERT("[1][|16 colour version| |Change to low rez!][Right away Maam!]",1):END
DIM number(6),coords(32,19),attack(32,19),bytes(3)
RESERVE screen2,32512
screen2=(screen2+512) AND $FFFFFF00
screen1=PHYSBASE
RS232 0,0
PROCassemble
GRAFRECT 0,0,320,200
TXTRECT 0,0,320,200
RESTORE colour:
FOR n=0 TO 10:READ a,b,c,d:SETCOL a,b,c,d:NEXT
CLG 13
a=ALERT("[1][|BATTLESHIPS RS232|by Julia Forester|for Atari ST User][So this is healthy living?]",1)
a=ALERT("[1][|Eat healthy things...| |Roast a vegetarian!][and they call this humor?]",1)
SETMOUSE 3,0
land$="ABCDEFGHIJJHIFHGGIJIIHGEFFEDDCBBA"
ENDPROC
DEF PROCattack
PHYSBASE=screen2
LOGBASE=PHYSBASE
PROCmsg("")
PRINT TAB(2,1)"Attack phase - select square to bomb "
REPEAT
PROCcursor
IF attack(X%,Y%)<>255 THEN VDU7:PROCalrt("Already attacked there!")
UNTIL attack(X%,Y%)=255
PROCatrect(X%,Y%,0)
PROCsend(X%,Y%,1)
PROCreceive
h=bytes(2)
IF h=0 THEN PROCalrt("Oops, we missed!")
IF h<>0 THEN PROCalrt("Great shot kid!"):score=score+1
PROCatrect(X%,Y%,h)
ENDPROC
DEF PROCdefend
PHYSBASE=screen1
LOGBASE=PHYSBASE
PROCmsg("")
PRINT TAB(2,1)" Defence phase - here they come..."
PROCreceive
x=bytes(0):y=bytes(1)
IF coords(x,y)<>14 AND coords(x,y)<>15 THEN
PROCalrt("We've been hit!"):PROCsend(x,y,coords(x,y)):hits=hits+1
ELSE PROCalrt("They missed us"):PROCsend(x,y,0)
ENDIF
PROCrect(x,y,0)
ENDPROC
DEF PROCdrawmap
FOR x%=0 TO 32
FOR y%=0 TO 19
attack(x%,y%)=255:coords(x%,y%)=0
NEXT:NEXT
i%=0
HIDEMOUSE
FOR X=0 TO 319 STEP 10
i%=i%+1
land=ASC(MID$(land$,i%,1))-ASC"A"
FOR Y=29 TO 189 STEP 10
land=land-1
IF land>0 THEN PROCrect(X/10,Y/10,14) ELSE PROCrect(X/10,Y/10,15)
NEXT
NEXT
CALL code
SHOWMOUSE
ENDPROC
DEF PROCposition
RESTORE
PRINT TAB(11,1)"Positional phase";
PROCalrt("Starting positional phase")
score=0:hits=0:bits=0:at=1
FOR n=1 TO 6:READ number(n):NEXT
FOR n=1 TO 6
FOR i=0 TO number(n)
REPEAT:oops=0
PROCname(n,i)
PROCcursor
PROCitem(X%,Y%,n,n+1)
UNTIL oops=0
NEXT
NEXT
ENDPROC
DEF PROCrect(x%,y%,c%)
FILLCOL c%
RECT x%*10+1,y%*10+1,x%*10+9,y%*10+9
coords(x%,y%)=c%
ENDPROC
DEFPROCatrect(x%,y%,c%)
FILLCOL c%
RECT x%*10+1,y%*10+1,x%*10+9,y%*10+9
attack(x%,y%)=c%
ENDPROC
DEF PROCcursor
REPEAT
MOUSE a,a,B%,a
UNTIL (B% AND 1)=0
REPEAT
MOUSE X%,Y%,B%,K%
UNTIL (B% AND 1) AND Y%>20 AND Y%<192
X%=(X% DIV 10):Y%=(Y% DIV 10)
ENDPROC
DEF PROCitem(x%,y%,item,c%)
IF FNtest(x%,y%,item,c%)=0 THEN PROCalrt("Can't put "+name$+" there"):oops=1:SETMOUSE 3,1:ENDPROC
RESTORE ("set"+STR$(item))
READ name$,items,a
FOR i%=1 TO items
READ xo%,yo%
IF items>0 THEN PROCrect(x%+xo%,y%+yo%,c%):bits=bits+1
NEXT
PROCrect(x%,y%,c%):bits=bits+1
ENDPROC
DEF PROCname(item,num)
RESTORE ("set"+STR$(item))
READ name$:PROCmsg("Position:"+name$+" #"+STR$(num+1))
ENDPROC
DEF PROCmsg(txt$)
FILLCOL 0:RECT 0,192,319,200
PRINT TAB(0,24);txt$;
ENDPROC
DEF FNtest(x%,y%,item,c%)
ok=1
RESTORE ("set"+STR$(item))
READ name$,items,colour
FOR i%=1 TO items
READ xo%,yo%
IF x%+xo%>0 AND x%+xo%<32 AND y%+yo%>0 AND y%+yo%<19 THEN PROCchk ELSE ok=0
NEXT
IF coords(x%,y%)<>colour THEN ok=0
=ok
DEF PROCchk
IF coords(x%+xo%,y%+yo%)<>colour THEN ok=0
ENDPROC
DEF PROCalrt(msg$)
GRAB 0,0,319,199:LOCAL x,y
FILLCOL 0:FRRECT 40,75,280,150
FOR x=0 TO 10 STEP 2
LINECOL x
RRECT 40+x,75+x,280-x,150-x
NEXT
PRINT TAB(7,12)"Guru Meditation Commander"
PRINT TAB(20-LEN(msg$)/2,14)msg$
TIME=0:REPEAT:UNTIL TIME>300
PUT 0,0,3
ENDPROC
DEFPROCclearbuf
PROCalrt("Clearing buffer")
REPEAT:IF INPSTAT(1) THEN n=INP(1)
PROCmsg(STR$(n)):UNTIL INPSTAT(1)=0
PROCmsg("Ok. Buffer cleared!")
ENDPROC
DEFPROCstart
at=FNwhosFirst
IF at THEN PROCalrt("Prepare to defend thyself") ELSE PROCalrt("May victory be swift!")
ENDPROC
DEFFNwhosFirst
a=ALERT("[2][| |Will you be attacker|or defender][Attack|Defend|Auto]",3)-1
IF a=2 THEN IF INPSTAT(1)=0 THEN OUT(1),64:a=0 ELSE IF a=2 THEN a=1
=a
DEFFNfini
IF score=bits THEN
a=ALERT("[1][| Congratulations|Enemy force repelled...][Play!|Quit]",1)-1
ELSE a=ALERT("[1][|Attack force destroyed|All is lost...][Play|Surrender]",1)-1
ENDIF
IF a=0 THEN RUN
=a
DEF PROCassemble
RESERVE code,200
FOR pass=0 TO 2 STEP 2
[
OPT pass,"L-W+"
ORG 0,code
transfer
MOVE.L #PHYSBASE,A0
MOVE.L #screen2,A1
MOVE #8000,D0
loop
MOVE.L (A0)+,(A1)+
DBRA D0,loop
RTS
]
NEXT
ENDPROC
items:
DATA 3,5,6,5,4,3
set1:
DATA "Artillery",4,14,2,0,1,1,0,2,2,2
set2:
DATA "Infantry ",0,14,0,0
set3:
DATA "Cruiser",2,15,1,0,2,0
set4:
DATA "Aircraft",4,15,-1,1,0,1,1,1,0,2
set5:
DATA "Submarine",1,15,1,0
set6:
DATA "Carrier",5,15,1,0,2,0,3,0,4,0,2,-1
colour:
DATA 11,0,3,2, 13,0,1,4, 0,0,0,0
DATA 1,5,5,5, 2,7,1,1, 4,0,7,7
DATA 6,7,5,5, 3,5,6,7, 5,4,7,2
DATA 14,0,0,0, 15,7,7,7