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 >
Text File  |  1989-09-28  |  6KB  |  276 lines

  1. REM Serial battleships
  2. REM by Julia Forester
  3. REM (c) Atari St User
  4. REM Requires 96k workspace
  5. PROCinit
  6. REPEAT
  7. REPEAT
  8. TXTSIZE 9
  9. PROCdrawmap
  10. PROCclearbuf
  11. PROCposition
  12. PROCstart
  13. REPEAT
  14. IF at THEN PROCdefend ELSE PROCattack
  15. at=at EOR 1
  16. UNTIL score=bits OR hits=bits
  17. UNTIL FNfini
  18. END
  19.  
  20. DEF PROCsend(X%,Y%,H%)
  21. bytes(0)=X%+32:bytes(1)=Y%+32:bytes(2)=H%+32
  22. bytes(3)=(X%+Y%+H%+32)
  23. REPEAT
  24. REPEAT:PROCput(19):UNTIL FNget=17
  25. FOR i=0 TO 3
  26. PROCput(bytes(i))
  27. NEXT
  28. IF FNget=0 THEN PROCmsg("Error sending"):sent=0:ELSE sent=1
  29. UNTIL sent
  30. PROCmsg("Message received ok")
  31. ENDPROC
  32.  
  33. DEF PROCreceive
  34. okts=1
  35. REPEAT
  36. REPEAT:UNTIL FNget=19:PROCput(17)
  37. FOR i=0 TO 3:bytes(i)=FNget:NEXT
  38. sum=0
  39. FOR j=0 TO 2:sum=sum+bytes(j)-32:NEXT
  40. IF sum+32=bytes(3) THEN okts=0
  41. IF okts THEN PROCput(0) ELSE PROCput(19)
  42. UNTIL okts=0
  43. PROCmsg("Message received ok")
  44. FOR j=0 TO 2:bytes(j)=bytes(j)-32:NEXT
  45. ENDPROC
  46.  
  47. DEF PROCput(byte)
  48. PROCmsg("Sending data...")
  49. REPEAT:UNTIL OUTSTAT(1)
  50. OUT (1),byte
  51. ENDPROC
  52.  
  53. DEF FNget
  54. PROCmsg("Waiting for data...")
  55. REPEAT:UNTIL INPSTAT(1)
  56. a=INP(1)
  57. =a
  58.  
  59. DEF PROCinit
  60. a=RND(-TIME)
  61. IF SCREENMODE<>2 THEN a=ALERT("[1][| |Hi rez only!][Sorry]",1):END
  62. DIM number(6),coords(32,19),attack(32,19),bytes(3)
  63. RESERVE screen2,32512
  64. screen2=(screen2+512) AND $FFFFFF00
  65. screen1=PHYSBASE
  66. RS232 0,0
  67. PROCassemble
  68. GRAFRECT 0,0,640,400
  69. TXTRECT 0,0,640,400
  70. CLG 0
  71. a=ALERT("[1][|BATTLESHIPS RS232|by Julia Forester|for Atari ST User|Monochrome version][All this and beauty too...]",1)
  72. SETMOUSE 3,0
  73. land$="ABCDEFGHIJJHIFHGGIJIIHGEFFEDDCBBA"
  74. ENDPROC
  75.  
  76. DEF PROCattack
  77. PHYSBASE=screen2
  78. LOGBASE=PHYSBASE
  79. PROCmsg("")
  80. PRINT TAB(17,1)" Attacking phase "
  81. REPEAT
  82. PROCcursor
  83. IF attack(X%,Y%)<>255 THEN VDU7:PROCalrt("Already attacked there!")
  84. UNTIL attack(X%,Y%)=255
  85. PROCatrect(X%,Y%,0)
  86. PROCsend(X%,Y%,1)
  87. PROCreceive
  88. h=bytes(2)
  89. IF h=0 THEN PROCalrt("Oops, we missed!")
  90. IF h<>0 THEN PROCalrt("It's a hit!"):score=score+1
  91. PROCatrect(X%,Y%,h)
  92. ENDPROC
  93.  
  94. DEF PROCdefend
  95. PHYSBASE=screen1
  96. LOGBASE=PHYSBASE
  97. PROCmsg("")
  98. PRINT TAB(17,1)" Defending phase "
  99. PROCreceive
  100. x=bytes(0):y=bytes(1)
  101. IF coords(x,y)<>14 AND coords(x,y)<>15 THEN
  102. PROCalrt("We've been hit!"):PROCsend(x,y,coords(x,y)):hits=hits+1 
  103. ELSE PROCalrt("They missed us"):PROCsend(x,y,0)
  104. ENDIF
  105. PROCrect(x,y,0)
  106. ENDPROC
  107.  
  108. DEF PROCdrawmap
  109. FOR x%=0 TO 32
  110. FOR y%=0 TO 19
  111. attack(x%,y%)=255:coords(x%,y%)=0
  112. NEXT:NEXT
  113. i%=0
  114. HIDEMOUSE
  115. FOR X=0 TO 319 STEP 10
  116. i%=i%+1
  117. land=ASC(MID$(land$,i%,1))-ASC"A"
  118. FOR Y=29 TO 189 STEP 10
  119. land=land-1
  120. IF land>0 THEN PROCrect(X/10,Y/10,14) ELSE PROCrect(X/10,Y/10,15)
  121. NEXT
  122. NEXT
  123. CALL code
  124. SHOWMOUSE
  125. ENDPROC
  126.  
  127. DEF PROCposition
  128. RESTORE
  129. PRINT TAB(17,1)"Positional phase";
  130. PROCalrt("Starting positional phase")
  131. score=0:hits=0:bits=0:at=1
  132. FOR n=1 TO 6:READ number(n):NEXT
  133. FOR n=1 TO 6
  134. FOR i=0 TO number(n)
  135. REPEAT:oops=0
  136. PROCname(n,i)
  137. PROCcursor
  138. PROCitem(X%,Y%,n,n+1)
  139. UNTIL oops=0
  140. NEXT
  141. NEXT
  142. ENDPROC
  143.  
  144. DEF PROCrect(x%,y%,c%)
  145. FILLCOL 1:FILLSTYLE 2,c%
  146. BAR x%*20+1,y%*20+1,x%*20+19,y%*20+19
  147. coords(x%,y%)=c%
  148. ENDPROC
  149.  
  150. DEFPROCatrect(x%,y%,c%)
  151. FILLCOL 1:FILLSTYLE 2,c%
  152. BAR x%*20+1,y%*20+1,x%*20+19,y%*20+19
  153. attack(x%,y%)=c%
  154. ENDPROC
  155.  
  156. DEF PROCcursor
  157. REPEAT
  158. MOUSE a,a,B%,a
  159. UNTIL (B% AND 1)=0
  160. REPEAT
  161. MOUSE X%,Y%,B%,K%
  162. UNTIL (B% AND 1) AND Y%>40 AND Y%<384 
  163. X%=(X% DIV 20):Y%=(Y% DIV 20)
  164. ENDPROC
  165.  
  166. DEF PROCitem(x%,y%,item,c%)
  167. IF FNtest(x%,y%,item,c%)=0 THEN PROCalrt("Can't put "+name$+" there"):oops=1:SETMOUSE 3,1:ENDPROC
  168. RESTORE ("set"+STR$(item))
  169. READ name$,items,a
  170. FOR i%=1 TO items
  171. READ xo%,yo%
  172. IF items>0 THEN PROCrect(x%+xo%,y%+yo%,c%):bits=bits+1
  173. NEXT
  174. PROCrect(x%,y%,c%):bits=bits+1
  175. ENDPROC
  176.  
  177. DEF PROCname(item,num)
  178. RESTORE ("set"+STR$(item))
  179. READ name$:PROCmsg("Position:"+name$+" #"+STR$(num+1))
  180. ENDPROC
  181.  
  182. DEF PROCmsg(txt$)
  183. TXTSIZE 9
  184. FILLCOL 0:RECT 0,382,639,400
  185. PRINT TAB(0,35);txt$;
  186. ENDPROC
  187.  
  188. DEF FNtest(x%,y%,item,c%)
  189. ok=1
  190. RESTORE ("set"+STR$(item))
  191. READ name$,items,colour
  192. FOR i%=1 TO items
  193. READ xo%,yo%
  194. IF x%+xo%>0 AND x%+xo%<32 AND y%+yo%>0 AND y%+yo%<19 THEN PROCchk ELSE ok=0
  195. NEXT
  196. IF coords(x%,y%)<>colour THEN ok=0
  197. =ok
  198.  
  199. DEF PROCchk
  200. IF coords(x%+xo%,y%+yo%)<>colour THEN ok=0
  201. ENDPROC
  202.  
  203. DEF PROCalrt(msg$)
  204. GRAB 0,0,639,399:LOCAL x,y
  205. FILLCOL 0:FRRECT 140,155,480,250
  206. FOR x=0 TO 10 STEP 2
  207. RRECT 140+x,150+x,480-x,250-x
  208. NEXT
  209. TXTSIZE 7
  210. PRINT TAB(22,20)"Guru Meditation Commander"
  211. PRINT TAB(35-LEN(msg$)/2,24)msg$
  212. TIME=0:REPEAT:UNTIL TIME>300
  213. PUT 0,0,3
  214. ENDPROC
  215.  
  216. DEFPROCclearbuf
  217. PROCalrt("Clearing buffer")
  218. REPEAT:IF INPSTAT(1) THEN n=INP(1)
  219. PROCmsg(STR$(n)):UNTIL INPSTAT(1)=0
  220. PROCmsg("Ok. Buffer cleared!")
  221. ENDPROC
  222.  
  223. DEFPROCstart
  224. at=FNwhosFirst
  225. IF at THEN PROCalrt("Prepare to defend") ELSE PROCalrt("You are the aggressor!")
  226. ENDPROC
  227.  
  228. DEFFNwhosFirst
  229. a=ALERT("[2][| |Will you be attacker|or defender][Attack|Defend|Auto]",3)-1
  230. IF a=2 THEN IF INPSTAT(1)=0 THEN OUT(1),64:a=0 ELSE IF a=2 THEN a=1
  231. =a
  232.  
  233. DEFFNfini
  234. IF score=bits THEN 
  235. a=ALERT("[1][| Congratulations|You win, this time...][Play!|Quit]",1)-1
  236. ELSE a=ALERT("[1][|Attack force destroyed|All is lost...][Play|Surrender]",1)-1
  237. ENDIF
  238. IF a=0 THEN RUN
  239. =a
  240.  
  241. DEF PROCassemble
  242. RESERVE code,200
  243. FOR pass=0 TO 2 STEP 2
  244. [
  245. OPT pass,"L-W+"
  246. ORG 0,code
  247. transfer
  248. MOVE.L #PHYSBASE,A0
  249. MOVE.L #screen2,A1
  250. MOVE #8000,D0
  251. loop
  252. MOVE.L (A0)+,(A1)+
  253. DBRA D0,loop
  254. RTS
  255. ]
  256. NEXT
  257. ENDPROC
  258.  
  259. items:
  260. DATA 3,5,6,5,4,3
  261.  
  262. set1:
  263. DATA "Artillery",4,14,2,0,1,1,0,2,2,2
  264. set2:
  265. DATA "Infantry ",0,14,0,0
  266. set3:
  267. DATA "Cruiser",2,15,1,0,2,0
  268. set4:
  269. DATA "Aircraft",4,15,-1,1,0,1,1,1,0,2
  270. set5:
  271. DATA "Submarine",1,15,1,0
  272. set6:
  273. DATA "Carrier",5,15,1,0,2,0,3,0,4,0,2,-1
  274.  
  275.  
  276.