home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
No Fragments Archive 10: Diskmags
/
nf_archive_10.iso
/
MAGS
/
ST_USER
/
1989
/
USER1289.MSA
/
LISTINGS_BATMONO.BSC
< prev
next >
Wrap
Text File
|
1989-09-28
|
6KB
|
276 lines
REM Serial battleships
REM by Julia Forester
REM (c) Atari St User
REM Requires 96k workspace
PROCinit
REPEAT
REPEAT
TXTSIZE 9
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<>2 THEN a=ALERT("[1][| |Hi rez only!][Sorry]",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,640,400
TXTRECT 0,0,640,400
CLG 0
a=ALERT("[1][|BATTLESHIPS RS232|by Julia Forester|for Atari ST User|Monochrome version][All this and beauty too...]",1)
SETMOUSE 3,0
land$="ABCDEFGHIJJHIFHGGIJIIHGEFFEDDCBBA"
ENDPROC
DEF PROCattack
PHYSBASE=screen2
LOGBASE=PHYSBASE
PROCmsg("")
PRINT TAB(17,1)" Attacking phase "
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("It's a hit!"):score=score+1
PROCatrect(X%,Y%,h)
ENDPROC
DEF PROCdefend
PHYSBASE=screen1
LOGBASE=PHYSBASE
PROCmsg("")
PRINT TAB(17,1)" Defending phase "
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(17,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 1:FILLSTYLE 2,c%
BAR x%*20+1,y%*20+1,x%*20+19,y%*20+19
coords(x%,y%)=c%
ENDPROC
DEFPROCatrect(x%,y%,c%)
FILLCOL 1:FILLSTYLE 2,c%
BAR x%*20+1,y%*20+1,x%*20+19,y%*20+19
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%>40 AND Y%<384
X%=(X% DIV 20):Y%=(Y% DIV 20)
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$)
TXTSIZE 9
FILLCOL 0:RECT 0,382,639,400
PRINT TAB(0,35);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,639,399:LOCAL x,y
FILLCOL 0:FRRECT 140,155,480,250
FOR x=0 TO 10 STEP 2
RRECT 140+x,150+x,480-x,250-x
NEXT
TXTSIZE 7
PRINT TAB(22,20)"Guru Meditation Commander"
PRINT TAB(35-LEN(msg$)/2,24)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") ELSE PROCalrt("You are the aggressor!")
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|You win, this time...][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