home *** CD-ROM | disk | FTP | other *** search
/ Ahoy 1985 September / Ahoy_Magazine_85-09_1985_Double_L.d64 / pig (.txt) < prev    next >
Commodore BASIC  |  2022-10-26  |  7KB  |  197 lines

  1. 1 rem    *** pig in a poke ***
  2. 2 rem an example of game programming with a sprite
  3. 4 rem ** move top of memory to make room for video block at 32768
  4. 5 poke 55,255:poke 56,127:poke 643,255:poke 644,127
  5. 9 rem      *** set-up subroutines ***
  6. 10 gosub 600:rem (video memory)
  7. 11 gosub 700:rem (background string)
  8. 12 gosub 800:rem (sprite shapes)
  9. 13 gosub 900:rem (sprite positions)
  10. 15 goto 100
  11. 98 rem      *** action loop ***
  12. 100 k=kp(peek(653)):if k>2 or eg=1 then 300
  13. 105 if k>1 then 130
  14. 110 hp=hp+k(k):if hp<0 then hp=hz
  15. 115 if hp>hz then hp=0
  16. 120 if k<>xk then xk=k:poke lt(0),st(xk)
  17. 125 poke ht(0),hh(hp):poke hr,hb(hp)
  18. 130 if val(ti$)>=dt then gosub 500
  19. 135 if peek(cf)>0 then gosub 400
  20. 196 goto 100
  21. 198 rem     *** wait for response ***
  22. 296 return
  23. 298 rem     *** ending routines ***
  24. 300 print "[147]final score:  "rt*100+vp*10:print:print:vp=15:poke vt(0),vv(vp)
  25. 310 print "to play again, press p":print "to quit, press q":hp=79
  26. 315 hp=79:poke hr,hb(hp):poke ht(0),hh(hp):xp=1:poke lt(0),st(xp)
  27. 320 z=peek(203):if z=62 then 370
  28. 325 poke ht(0),hh(hp):poke hr,hb(hp)
  29. 330 hp=hp+1:if hp>hz then hp=0
  30. 345 if z<>41 then 320
  31. 350 eg=0:dl=0:dt=1:ds=5:rt=0:rc=0:gosub 930:goto 100
  32. 369 rem ** put video memory back to first block, and screen memory to 1024
  33. 370 poke 56578,peek(56578)or3:poke 56576,(peek(56576)and 252)or 3
  34. 371 poke 53272,20:poke 648,4
  35. 379 rem ** reenable shift/commodore and run-stop/restore
  36. 380 poke 657,0:poke 792,71:poke 808,237
  37. 390 end
  38. 398 rem     *** collision handler ***
  39. 399 rem ** end game?
  40. 400 vp=vp-1:if vp<0 then eg=1:return
  41. 401 rem ** move up
  42. 402 poke vt(0),vv(vp)
  43. 403 rem ** clear collision register
  44. 404 z=peek(cs):z=peek(cf)
  45. 405 rem ** new collision?
  46. 406 if peek(cf)>0 then 400
  47. 496 return
  48. 498 rem     *** scroll routine ***
  49. 499 rem ** new row or simple jump?
  50. 500 if rc=ds then 506
  51. 501 rem ** simple jump
  52. 502 print "";
  53. 503 rc=rc+1:goto 520
  54. 505 rem ** put new row on screen
  55. 506 print ""mid$(ws$,wl(dl)+int(19*rnd(9)),40)"";
  56. 508 rc=0:rt=rt+1:dl=dl+1:if dl>8 then dl=0:ds=ds-1
  57. 509 rem ** end of game?
  58. 510 if rt>49 then eg=1
  59. 520 if peek(cf)>0 then gosub 400:rem ** collision
  60. 580 poke 217,l1:poke 218,l2
  61. 589 rem ** reset timer
  62. 590 ti$="000000"
  63. 596 return
  64. 598 rem    *** arrange memory ***
  65. 599 rem use third video block (32768 to 49151), so rom character set is usable.
  66. 600 vb=32768:poke 56578,peek(56578)or3:poke 56576,(peek(56576)and 252)or 1
  67. 601 rem ** tell vic-2 where screen is without changing character set location
  68. 602 sb=0:poke 53272,(sb*16)+4:sb=vb+1024*sb
  69. 603 rem ** tell basic where screen is
  70. 604 bb=sb/256:poke 648,bb
  71. 608 rem    *** register addresses ***
  72. 609 rem ** sprite shape location table
  73. 610 lt(0)=sb+1016:for i=1 to 7:lt(i)=lt(i-1)+1:next
  74. 611 rem ** sprite color table
  75. 612 ct(0)=53287:for i=1 to 7:ct(i)=ct(i-1)+1:next
  76. 613 rem ** sprite horizontal position table (low bytes)
  77. 614 ht(0)=53248:for i=1 to 7:ht(i)=ht(i-1)+2:next
  78. 615 rem ** sprite vertical position table
  79. 616 vt(0)=53249:for i=1 to 7:vt(i)=vt(i-1)+2:next
  80. 617 rem ** sprite horizontal high-bit register
  81. 618 hr=53264
  82. 619 rem ** sprite enable register
  83. 620 es=53269
  84. 621 rem ** vertical expansion register (1=double height)
  85. 622 ve=53271
  86. 623 rem ** horizontal expansion register (1=double width)
  87. 624 he=53277
  88. 625 rem ** sprite priority register (1=sprite is in front of foreground)
  89. 626 pr=53275
  90. 627 rem ** multicolor enable register (1=multi-color enabled)
  91. 628 em=53276
  92. 629 rem ** sprite multicolor color registers
  93. 630 mr=53285:rem ('01' register: add 1 to mr for '11' register)
  94. 631 rem ** sprite-sprite collision register
  95. 632 cs=53278
  96. 633 rem ** sprite-foreground collision register
  97. 634 cf=53279
  98. 635 rem ** set-bit and clear-bit values
  99. 636 bs(0)=1:for i=1 to 7:bs(i)=2*bs(i-1):next
  100. 637 for i=0 to 7:bc(i)=255-bs(i):next
  101. 638 rem     *** initialize values ***
  102. 639 rem ** foreground color
  103. 640 poke 53281,9:print "[147][149]";:rem (brown)
  104. 641 rem ** background color
  105. 642 poke 53281,5 :rem (green)
  106. 643 rem ** border color
  107. 644 poke 53280,9:rem (brown)
  108. 645 rem ** sprite colors (defaults: whi,red,l-grn,pur,grn,blu,yel,m-gray)
  109. 646 poke ct(0),1:rem (the pig is white)
  110. 647 rem ** set priority
  111. 648 poke pr,0:rem (all in front)
  112. 649 rem ** set horizontal sizes
  113. 650 poke he,0:rem (all normal width)
  114. 651 rem ** set vertical sizes
  115. 652 poke ve,0:rem (all normal height)
  116. 653 rem ** enable sprites
  117. 654 poke es,bs(0):rem (sprite 0 only)
  118. 689 rem     *** safety procedures ***
  119. 690 poke 657,128:rem disable shift/commodore character set switch
  120. 691 poke 808,234:poke 792,193:rem disable stop and stop/restore
  121. 696 return
  122. 698 rem     *** background string ***
  123. 700 wc$="[214]":bc$=" "
  124. 709 rem set up wall string
  125. 710 for i=1 to 12
  126. 714 rem each wall unit is wider, each gap narrower
  127. 715 for j=1 to 5+i:ws$=ws$+wc$:next
  128. 720 for j=1 to 15-i:ws$=ws$+bc$:next
  129. 725 next
  130. 729 rem set wall starting points
  131. 730 wl(0)=1:for i=1 to 9:wl(i)=wl(i-1)+20:next
  132. 739 rem set difficulty levels (dl=spacing; dt=timing; ds=vertical spacing)
  133. 740 dl=0:dt=1:ds=5
  134. 796 return
  135. 798 rem     *** sprite shapes ***
  136. 799 rem ** number of sprite shapes (-1);number of lines per sprite shape (-1)
  137. 800 ns=1:ts=9
  138. 801 rem ** locate sprite shape memory
  139. 802 st(0)=16:for i=1 to ns:st(i)=st(i-1)+1:next
  140. 803 rem ** loops
  141. 804 for i=0 to ns:for j=0 to ts:read ss$:for k=0 to 2:x=0:y=vb+st(i)*64+j*3+k
  142. 805 rem ** convert strings to shape bytes (use bs(0-7) to set bits)
  143. 806 for l=1 to 8:m=l+8*k:m=asc(mid$(ss$,m,1)):if m=42 then x=x or bs(8-l)
  144. 807 next:poke y,x:next:print ss$:next
  145. 808 z=64-(ts*3+2):for j=y+1 to y+z:poke j,0:next:next
  146. 809 rem sprite shape data, 21 lines  per shape: *='on'  .='off'
  147. 810 data ".....*..............**.."
  148. 811 data ".....**....******.....*."
  149. 812 data "....****************.*.."
  150. 813 data "...*.****************..."
  151. 814 data "**********************.."
  152. 815 data "**********************.."
  153. 816 data "....*****************..."
  154. 817 data "......**************...."
  155. 818 data "......**.*.....*.**....."
  156. 819 data ".....**..**...**.**....."
  157. 820 rem ** 2nd shape
  158. 821 data ".**..............*......"
  159. 822 data "*.....******....**......"
  160. 823 data ".*.****************....."
  161. 824 data "..****************.*...."
  162. 825 data ".**********************."
  163. 826 data ".**********************."
  164. 827 data "..*****************....."
  165. 828 data "...**************......."
  166. 829 data "....**.*.....*.**......."
  167. 830 data "....**.**...**..**......"
  168. 896 return
  169. 898 rem     *** sprite positions ***
  170. 899 rem ** possible positions dim'ed
  171. 900 vz=19:hz=147:dim hh(hz),vv(vz),hb(hz)
  172. 901 rem ** assign  horizontal values
  173. 902 x=24:b=0:for i=0 to hz:hh(i)=x:hb(i)=b
  174. 903 x=x+2:if x>255 then x=x-256:b=1
  175. 904 next
  176. 905 rem ** assign vertical values
  177. 906 x=53:for i=0 to vz:vv(i)=x:x=x+8:next
  178. 919 rem ** keypress matrix
  179. 920 dim kp(7),k(2)
  180. 921 for i=0 to 7:kp(i)=2:next:kp(1)=1:kp(2)=0:kp(7)=3
  181. 922 k(0)=-1:k(1)=1:k(2)=0
  182. 929 rem ** initial sprite positioning
  183. 930 hp=79:vp=vz:xk=1
  184. 931 poke vt(0),vv(vp):poke ht(0),hh(hp):poke hr,hb(hp)
  185. 939 rem ** tell vic-2 where to find sprite shape
  186. 940 poke lt(0),st(xk)
  187. 949 rem ** create screen display
  188. 950 print "[147]";:for i=0 to 5:for j=0 to ds:print "";:next
  189. 955 print mid$(ws$,1+int(19*rnd(9)),40);:next:print "";
  190. 959 rem ** clear screen line link table
  191. 960 l1=peek(217)or 128:l2=peek(218)or 128:poke 217,l1:poke 218,l2
  192. 969 rem ** clear collision registers
  193. 970 z=peek(cf):z=peek(cs)
  194. 989 rem ** set clock
  195. 990 ti$="000000"
  196. 996 return
  197.