home *** CD-ROM | disk | FTP | other *** search
/ AMOS PD CD / amospdcd.iso / 526-550 / apd529 / shipwalker / shipwalk.amos / shipwalk.amosSourceCode
AMOS Source Code  |  1993-11-29  |  8KB  |  312 lines

  1. ' Walk through maze routine demo.
  2. ' by Sarv. Engelhardt, Sept 1990 
  3. ' exit with Esc key
  4. ' see doc.file for how to specify maze walls as data 
  5. ' size of maze is specified by XLIMIT and YLIMIT 
  6. ' make sure MAZE() array is large enough to hold data! 
  7. ' direction facing is D (1,2,3,4 for N,E,S,W)
  8. ' starting position in maze is XW,YW 
  9.  Load "shipicons.abk"
  10. ' Make Icon Mask doesn't seem to be necessary
  11. ' colour 0 is treated as transparent 
  12. Screen Open 0,320,250,16,Lowres
  13. Flash Off : Curs Off : Cls 0
  14. ' could use Get Sprite Palette here
  15. Palette $0,$ECA,$D00,$F60,$90,$3F1,$F,$2CD,$F0C,$A00,$BBB,$AAA,$999,$888,$777,$222
  16. Ink 1,0
  17. Box 9,9 To 125,121
  18. ' Double buffer with autoback 0
  19. ' screen is swapped in SPICT procedure 
  20. ' after drawing the view. Very smooth! 
  21. Double Buffer 
  22. Autoback 0
  23. Ink 1,0
  24. Box 9,9 To 125,121
  25. Dim MAZE(20,40),W(17),XP(8),YP(8),XM(8),YM(8)
  26. Global XLIMIT,YLIMIT,D,XW,YW,LEVEL
  27. Global MAZE(),W(),XP(),XM(),YP(),YM()
  28. XLIMIT=6 : YLIMIT=36
  29. 'set up initial position 
  30. D=4 : XW=2 : YW=2 : LEVEL=1
  31. 'load data for level 1 
  32. MAZEDAT["L1"]
  33. 'set up initial view 
  34. WALK
  35. ' Scan the keyboard
  36. ' cursor up = walk forward in direction facing 
  37. ' cursor left/right = turn left/right
  38. ' cursor down = turn around
  39. Do 
  40.    While K$=""
  41.       K$=Inkey$
  42.    Wend 
  43.    CODE=Scancode
  44. ' exit if ESC pressed
  45.    Exit If CODE=69
  46. ' Move in direction D, but only if not facing
  47. ' a wall W(12) 
  48.    If CODE=76 and W(12)<>1
  49.       If D=1 : Dec YW : End If 
  50.       If D=2 : Inc XW : End If 
  51.       If D=3 : Inc YW : End If 
  52.       If D=4 : Dec XW : End If 
  53.       WALK
  54.    End If 
  55.    If CODE=78
  56.       Inc D
  57.       If D>4 : D=1 : End If 
  58.       SPICT
  59.    End If 
  60.    If CODE=79
  61.       Dec D
  62.       If D<1 : D=4 : End If 
  63.       SPICT
  64.    End If 
  65.    If CODE=77
  66.       D=D+2
  67.       If D>4 : D=D-4 : End If 
  68.       SPICT
  69.    End If 
  70.    K$=""
  71. Loop 
  72. End 
  73. 'move forward
  74. Procedure WALK
  75. ' check limits of maze. The maze wraps around  
  76. ' if you walk beyond edges 
  77. If XW<0 Then XW=XW+XLIMIT
  78. If XW>XLIMIT-1 Then XW=XW-XLIMIT
  79. If YW<0 Then YW=YW+YLIMIT/2
  80. If YW>YLIMIT/2 Then YW=YW-YLIMIT/2
  81. Y2=2*YW : YP(0)=Y2 : XP(0)=XW
  82. XP(1)=XW+1 : XP(2)=XW+2 : XP(3)=XW+3
  83. XM(1)=XW-1 : XM(2)=XW-2 : XM(3)=XW-3
  84. YP(1)=Y2+1 : YP(2)=Y2+2 : YP(3)=Y2+3
  85. YP(5)=Y2+5 : YP(6)=Y2+6 : YP(7)=Y2+7
  86. YM(1)=Y2-1 : YM(2)=Y2-2 : YM(3)=Y2-3
  87. YM(4)=Y2-4 : YM(5)=Y2-5 : YP(4)=Y2+4
  88. For I=1 To 7
  89.    If XM(I)<0 Then XM(I)=XM(I)+XLIMIT
  90.    If YM(I)<0 Then YM(I)=YM(I)+YLIMIT
  91.    If YP(I)>YLIMIT Then YP(I)=YP(I)-YLIMIT
  92.    If XP(I)>XLIMIT Then XP(I)=XP(I)-XLIMIT
  93. Next I
  94. If XW=1 and YW=16
  95. ' Load maze data for new level 
  96. MAZEDAT["L2"]
  97. End If 
  98. SPICT
  99. End Proc
  100. 'these next four procedures calculate the view 
  101. 'in each direction 
  102. Procedure NORTH
  103. W(0)=MAZE(XP(0),YM(5))
  104. W(1)=MAZE(XP(1),YM(5))
  105. W(2)=MAZE(XP(0),YM(4))
  106. W(3)=MAZE(XP(1),YM(4))
  107. W(4)=MAZE(XM(1),YM(4))
  108. W(5)=MAZE(XP(0),YM(3))
  109. W(6)=MAZE(XP(1),YM(3))
  110. W(7)=MAZE(XP(0),YM(2))
  111. W(8)=MAZE(XP(1),YM(2))
  112. W(9)=MAZE(XM(1),YM(2))
  113. W(10)=MAZE(XP(0),YM(1))
  114. W(11)=MAZE(XP(1),YM(1))
  115. W(12)=MAZE(XP(0),YP(0))
  116. W(13)=MAZE(XM(1),YP(0))
  117. W(14)=MAZE(XP(1),YP(0))
  118. W(15)=MAZE(XP(0),YP(1))
  119. W(16)=MAZE(XP(1),YP(1))
  120. End Proc
  121. Procedure EAST
  122. W(0)=MAZE(XP(3),YP(0))
  123. W(1)=MAZE(XP(3),YP(2))
  124. W(2)=MAZE(XP(3),YP(1))
  125. W(3)=MAZE(XP(3),YP(3))
  126. W(4)=MAZE(XP(3),YM(1))
  127. W(5)=MAZE(XP(2),YP(0))
  128. W(6)=MAZE(XP(2),YP(2))
  129. W(7)=MAZE(XP(2),YP(1))
  130. W(8)=MAZE(XP(2),YP(3))
  131. W(9)=MAZE(XP(2),YM(1))
  132. W(10)=MAZE(XP(1),YP(0))
  133. W(11)=MAZE(XP(1),YP(2))
  134. W(12)=MAZE(XP(1),YP(1))
  135. W(13)=MAZE(XP(1),YM(1))
  136. W(14)=MAZE(XP(1),YP(3))
  137. W(15)=MAZE(XP(0),YP(0))
  138. W(16)=MAZE(XP(0),YP(2))
  139. End Proc
  140. Procedure SOUTH
  141. W(0)=MAZE(XP(1),YP(7))
  142. W(1)=MAZE(XP(0),YP(7))
  143. W(2)=MAZE(XP(0),YP(6))
  144. W(3)=MAZE(XM(1),YP(6))
  145. W(4)=MAZE(XP(1),YP(6))
  146. W(5)=MAZE(XP(1),YP(5))
  147. W(6)=MAZE(XP(0),YP(5))
  148. W(7)=MAZE(XP(0),YP(4))
  149. W(8)=MAZE(XM(1),YP(4))
  150. W(9)=MAZE(XP(1),YP(4))
  151. W(10)=MAZE(XP(1),YP(3))
  152. W(11)=MAZE(XP(0),YP(3))
  153. W(12)=MAZE(XP(0),YP(2))
  154. W(13)=MAZE(XP(1),YP(2))
  155. W(14)=MAZE(XM(1),YP(2))
  156. W(15)=MAZE(XP(1),YP(1))
  157. W(16)=MAZE(XP(0),YP(1))
  158. End Proc
  159. Procedure WEST
  160. W(0)=MAZE(XM(3),YP(2))
  161. W(1)=MAZE(XM(3),YP(0))
  162. W(2)=MAZE(XM(2),YP(1))
  163. W(3)=MAZE(XM(2),YM(1))
  164. W(4)=MAZE(XM(2),YP(3))
  165. W(5)=MAZE(XM(2),YP(2))
  166. W(6)=MAZE(XM(2),YP(0))
  167. W(7)=MAZE(XM(1),YP(1))
  168. W(8)=MAZE(XM(1),YM(1))
  169. W(9)=MAZE(XM(1),YP(3))
  170. W(10)=MAZE(XM(1),YP(2))
  171. W(11)=MAZE(XM(1),YP(0))
  172. W(12)=MAZE(XP(0),YP(1))
  173. W(13)=MAZE(XP(0),YP(3))
  174. W(14)=MAZE(XP(0),YM(1))
  175. W(15)=MAZE(XP(0),YP(2))
  176. W(16)=MAZE(XP(0),YP(0))
  177. End Proc
  178. 'load mazedata 
  179. Procedure MAZEDAT[LVL$]
  180. Restore LVL$
  181. For I=0 To YLIMIT
  182.    For J=0 To XLIMIT
  183.       Read MAZE(J,I)
  184.    Next J
  185. Next I
  186. L1: Data 1,1,3,3,1,1,1
  187. Data 1,1,3,0,3,1,1
  188. Data 1,1,0,0,1,1,1
  189. Data 1,1,0,0,0,1,1
  190. Data 1,0,0,0,0,1,1
  191. Data 1,2,0,0,0,2,1
  192. Data 0,1,1,1,1,0,1
  193. Data 3,1,0,2,1,0,1
  194. Data 0,0,0,0,1,2,1
  195. Data 3,1,0,1,2,0,3
  196. Data 0,1,1,0,0,0,1
  197. Data 3,1,0,2,1,0,3
  198. Data 0,0,0,0,1,1,0
  199. Data 3,1,0,1,2,0,3
  200. Data 0,1,1,0,0,0,0
  201. Data 3,1,0,2,1,0,3
  202. Data 0,0,0,0,1,1,0
  203. Data 3,1,0,1,2,0,3
  204. Data 0,1,1,0,0,0,0
  205. Data 3,1,2,1,1,0,3
  206. Data 0,0,0,0,2,1,0
  207. Data 3,1,1,1,1,2,1
  208. Data 0,0,0,0,0,0,0
  209. Data 3,1,1,0,2,1,1
  210. Data 0,1,2,1,1,0,0
  211. Data 3,1,0,1,0,1,1
  212. Data 0,0,0,0,0,0,0
  213. Data 3,1,0,1,0,1,1
  214. Data 0,0,1,2,2,0,0
  215. Data 1,1,1,0,1,1,1
  216. Data 0,0,0,0,0,0,0
  217. Data 1,2,1,0,1,2,1
  218. Data 1,0,1,1,0,0,1
  219. Data 1,1,1,0,2,1,1
  220. Data 0,1,0,0,1,1,0
  221. Data 1,1,1,0,1,1,1
  222. Data 0,0,3,3,0,0,0
  223. ' level 2
  224. L2: Data 1,1,1,1,1,1,1
  225. Data 1,0,1,0,1,0,1
  226. Data 0,1,0,0,1,0,0
  227. Data 1,1,2,0,0,1,1
  228. Data 1,0,1,1,0,1,1
  229. Data 1,0,1,0,1,0,1
  230. Data 0,0,0,0,2,2,0
  231. Data 1,0,1,0,1,1,1
  232. Data 0,0,1,2,0,0,0
  233. Data 1,0,1,0,1,1,1
  234. Data 1,2,0,0,0,0,1
  235. Data 1,0,1,0,1,1,1
  236. Data 0,1,2,1,0,0,0
  237. Data 1,1,0,1,0,1,1
  238. Data 0,0,0,0,1,0,0
  239. Data 1,1,0,1,1,0,1
  240. Data 2,2,1,1,0,1,2
  241. Data 1,0,1,2,1,1,1
  242. Data 1,0,1,0,0,0,1
  243. Data 1,0,1,2,1,1,1
  244. Data 0,1,1,0,0,0,0
  245. Data 1,0,1,2,1,2,1
  246. Data 1,0,1,0,1,0,1
  247. Data 1,0,1,2,1,2,1
  248. Data 0,1,1,0,0,1,0
  249. Data 1,0,1,2,1,0,1
  250. Data 1,0,1,0,1,0,1
  251. Data 1,0,1,2,1,0,1
  252. Data 0,1,1,0,2,1,0
  253. Data 1,2,1,2,1,0,1
  254. Data 1,0,1,0,1,2,1
  255. Data 1,0,1,2,1,0,1
  256. Data 1,0,1,0,0,1,1
  257. Data 1,1,1,2,2,1,1
  258. Data 0,1,1,0,1,0,0
  259. Data 1,1,1,2,1,1,1
  260. Data 0,0,1,1,0,0,0
  261. End Proc
  262. ' show the view
  263. Procedure SPICT
  264. 'get walls for direction faced 
  265. On D Proc NORTH,EAST,SOUTH,WEST
  266. ' background 
  267. Paste Icon 10,10,38
  268. ' create view
  269. ' 1 means wall; 2 means door; 3 means window 
  270. If W(0)<>0 Then Paste Icon 54,41,1
  271. If W(0)=3 Then Paste Icon 55,43,36
  272. If W(1)<>0 Then Paste Icon 74,41,2
  273. If W(1)=3 Then Paste Icon 74,42,37
  274. If W(2)<>0 Then Paste Icon 54,41,3
  275. If W(2)=2 Then Paste Icon 62,44,20
  276. If W(2)=3 Then Paste Icon 56,44,29
  277. If W(3)<>0 Then Paste Icon 81,41,5
  278. If W(3)=3 Then Paste Icon 83,44,30
  279. If W(4)<>0 Then Paste Icon 10,41,4
  280. If W(4)=3 Then Paste Icon 10,44,31
  281. If W(5)<>0 Then Paste Icon 43,33,7
  282. If W(5)=2 Then Paste Icon 48,38,23
  283. If W(5)=3 Then Paste Icon 46,38,34
  284. If W(6)<>0 Then Paste Icon 81,34,6
  285. If W(6)=2 Then Paste Icon 84,39,24
  286. If W(6)=3 Then Paste Icon 82,39,35
  287. If W(7)<>0 Then Paste Icon 43,34,8
  288. If W(7)=2 Then Paste Icon 62,40,19
  289. If W(7)=3 Then Paste Icon 47,40,26
  290. If W(8)<>0 Then Paste Icon 92,34,13
  291. If W(8)=2 Then Paste Icon 110,40,19
  292. If W(8)=3 Then Paste Icon 96,40,28
  293. If W(9)<>0 Then Paste Icon 10,34,11
  294. If W(9)=2 Then Paste Icon 14,40,19
  295. If W(9)=3 Then Paste Icon 10,40,27
  296. If W(10)<>0 Then Paste Icon 19,18,9
  297. If W(10)=2 Then Paste Icon 31,35,21
  298. If W(10)=3 Then Paste Icon 24,30,32
  299. If W(11)<>0 Then Paste Icon 91,18,10
  300. If W(11)=2 Then Paste Icon 98,35,22
  301. If W(11)=3 Then Paste Icon 94,33,33
  302. If W(12)<>0 Then Paste Icon 19,17,12
  303. If W(12)=2 Then Paste Icon 51,29,18
  304. If W(12)=3 Then Paste Icon 30,29,25
  305. If W(13)<>0 Then Paste Icon 10,17,16
  306. If W(14)<>0 Then Paste Icon 116,17,17
  307. If W(15)<>0 Then Paste Icon 10,10,14
  308. If W(16)<>0 Then Paste Icon 116,10,15
  309. 'transporter to next level 
  310. If XW=1 and YW=15 and D=3 Then Paste Icon 49,23,39
  311. Screen Swap : Wait Vbl 
  312. End Proc