home *** CD-ROM | disk | FTP | other *** search
- 1 rem *** pig in a poke ***
- 2 rem an example of game programming with a sprite
- 4 rem ** move top of memory to make room for video block at 32768
- 5 poke 55,255:poke 56,127:poke 643,255:poke 644,127
- 9 rem *** set-up subroutines ***
- 10 gosub 600:rem (video memory)
- 11 gosub 700:rem (background string)
- 12 gosub 800:rem (sprite shapes)
- 13 gosub 900:rem (sprite positions)
- 15 goto 100
- 98 rem *** action loop ***
- 100 k=kp(peek(653)):if k>2 or eg=1 then 300
- 105 if k>1 then 130
- 110 hp=hp+k(k):if hp<0 then hp=hz
- 115 if hp>hz then hp=0
- 120 if k<>xk then xk=k:poke lt(0),st(xk)
- 125 poke ht(0),hh(hp):poke hr,hb(hp)
- 130 if val(ti$)>=dt then gosub 500
- 135 if peek(cf)>0 then gosub 400
- 196 goto 100
- 198 rem *** wait for response ***
- 296 return
- 298 rem *** ending routines ***
- 300 print "[147]final score: "rt*100+vp*10:print:print:vp=15:poke vt(0),vv(vp)
- 310 print "to play again, press p":print "to quit, press q":hp=79
- 315 hp=79:poke hr,hb(hp):poke ht(0),hh(hp):xp=1:poke lt(0),st(xp)
- 320 z=peek(203):if z=62 then 370
- 325 poke ht(0),hh(hp):poke hr,hb(hp)
- 330 hp=hp+1:if hp>hz then hp=0
- 345 if z<>41 then 320
- 350 eg=0:dl=0:dt=1:ds=5:rt=0:rc=0:gosub 930:goto 100
- 369 rem ** put video memory back to first block, and screen memory to 1024
- 370 poke 56578,peek(56578)or3:poke 56576,(peek(56576)and 252)or 3
- 371 poke 53272,20:poke 648,4
- 379 rem ** reenable shift/commodore and run-stop/restore
- 380 poke 657,0:poke 792,71:poke 808,237
- 390 end
- 398 rem *** collision handler ***
- 399 rem ** end game?
- 400 vp=vp-1:if vp<0 then eg=1:return
- 401 rem ** move up
- 402 poke vt(0),vv(vp)
- 403 rem ** clear collision register
- 404 z=peek(cs):z=peek(cf)
- 405 rem ** new collision?
- 406 if peek(cf)>0 then 400
- 496 return
- 498 rem *** scroll routine ***
- 499 rem ** new row or simple jump?
- 500 if rc=ds then 506
- 501 rem ** simple jump
- 502 print "";
- 503 rc=rc+1:goto 520
- 505 rem ** put new row on screen
- 506 print ""mid$(ws$,wl(dl)+int(19*rnd(9)),40)"";
- 508 rc=0:rt=rt+1:dl=dl+1:if dl>8 then dl=0:ds=ds-1
- 509 rem ** end of game?
- 510 if rt>49 then eg=1
- 520 if peek(cf)>0 then gosub 400:rem ** collision
- 580 poke 217,l1:poke 218,l2
- 589 rem ** reset timer
- 590 ti$="000000"
- 596 return
- 598 rem *** arrange memory ***
- 599 rem use third video block (32768 to 49151), so rom character set is usable.
- 600 vb=32768:poke 56578,peek(56578)or3:poke 56576,(peek(56576)and 252)or 1
- 601 rem ** tell vic-2 where screen is without changing character set location
- 602 sb=0:poke 53272,(sb*16)+4:sb=vb+1024*sb
- 603 rem ** tell basic where screen is
- 604 bb=sb/256:poke 648,bb
- 608 rem *** register addresses ***
- 609 rem ** sprite shape location table
- 610 lt(0)=sb+1016:for i=1 to 7:lt(i)=lt(i-1)+1:next
- 611 rem ** sprite color table
- 612 ct(0)=53287:for i=1 to 7:ct(i)=ct(i-1)+1:next
- 613 rem ** sprite horizontal position table (low bytes)
- 614 ht(0)=53248:for i=1 to 7:ht(i)=ht(i-1)+2:next
- 615 rem ** sprite vertical position table
- 616 vt(0)=53249:for i=1 to 7:vt(i)=vt(i-1)+2:next
- 617 rem ** sprite horizontal high-bit register
- 618 hr=53264
- 619 rem ** sprite enable register
- 620 es=53269
- 621 rem ** vertical expansion register (1=double height)
- 622 ve=53271
- 623 rem ** horizontal expansion register (1=double width)
- 624 he=53277
- 625 rem ** sprite priority register (1=sprite is in front of foreground)
- 626 pr=53275
- 627 rem ** multicolor enable register (1=multi-color enabled)
- 628 em=53276
- 629 rem ** sprite multicolor color registers
- 630 mr=53285:rem ('01' register: add 1 to mr for '11' register)
- 631 rem ** sprite-sprite collision register
- 632 cs=53278
- 633 rem ** sprite-foreground collision register
- 634 cf=53279
- 635 rem ** set-bit and clear-bit values
- 636 bs(0)=1:for i=1 to 7:bs(i)=2*bs(i-1):next
- 637 for i=0 to 7:bc(i)=255-bs(i):next
- 638 rem *** initialize values ***
- 639 rem ** foreground color
- 640 poke 53281,9:print "[147][149]";:rem (brown)
- 641 rem ** background color
- 642 poke 53281,5 :rem (green)
- 643 rem ** border color
- 644 poke 53280,9:rem (brown)
- 645 rem ** sprite colors (defaults: whi,red,l-grn,pur,grn,blu,yel,m-gray)
- 646 poke ct(0),1:rem (the pig is white)
- 647 rem ** set priority
- 648 poke pr,0:rem (all in front)
- 649 rem ** set horizontal sizes
- 650 poke he,0:rem (all normal width)
- 651 rem ** set vertical sizes
- 652 poke ve,0:rem (all normal height)
- 653 rem ** enable sprites
- 654 poke es,bs(0):rem (sprite 0 only)
- 689 rem *** safety procedures ***
- 690 poke 657,128:rem disable shift/commodore character set switch
- 691 poke 808,234:poke 792,193:rem disable stop and stop/restore
- 696 return
- 698 rem *** background string ***
- 700 wc$="[214]":bc$=" "
- 709 rem set up wall string
- 710 for i=1 to 12
- 714 rem each wall unit is wider, each gap narrower
- 715 for j=1 to 5+i:ws$=ws$+wc$:next
- 720 for j=1 to 15-i:ws$=ws$+bc$:next
- 725 next
- 729 rem set wall starting points
- 730 wl(0)=1:for i=1 to 9:wl(i)=wl(i-1)+20:next
- 739 rem set difficulty levels (dl=spacing; dt=timing; ds=vertical spacing)
- 740 dl=0:dt=1:ds=5
- 796 return
- 798 rem *** sprite shapes ***
- 799 rem ** number of sprite shapes (-1);number of lines per sprite shape (-1)
- 800 ns=1:ts=9
- 801 rem ** locate sprite shape memory
- 802 st(0)=16:for i=1 to ns:st(i)=st(i-1)+1:next
- 803 rem ** loops
- 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
- 805 rem ** convert strings to shape bytes (use bs(0-7) to set bits)
- 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)
- 807 next:poke y,x:next:print ss$:next
- 808 z=64-(ts*3+2):for j=y+1 to y+z:poke j,0:next:next
- 809 rem sprite shape data, 21 lines per shape: *='on' .='off'
- 810 data ".....*..............**.."
- 811 data ".....**....******.....*."
- 812 data "....****************.*.."
- 813 data "...*.****************..."
- 814 data "**********************.."
- 815 data "**********************.."
- 816 data "....*****************..."
- 817 data "......**************...."
- 818 data "......**.*.....*.**....."
- 819 data ".....**..**...**.**....."
- 820 rem ** 2nd shape
- 821 data ".**..............*......"
- 822 data "*.....******....**......"
- 823 data ".*.****************....."
- 824 data "..****************.*...."
- 825 data ".**********************."
- 826 data ".**********************."
- 827 data "..*****************....."
- 828 data "...**************......."
- 829 data "....**.*.....*.**......."
- 830 data "....**.**...**..**......"
- 896 return
- 898 rem *** sprite positions ***
- 899 rem ** possible positions dim'ed
- 900 vz=19:hz=147:dim hh(hz),vv(vz),hb(hz)
- 901 rem ** assign horizontal values
- 902 x=24:b=0:for i=0 to hz:hh(i)=x:hb(i)=b
- 903 x=x+2:if x>255 then x=x-256:b=1
- 904 next
- 905 rem ** assign vertical values
- 906 x=53:for i=0 to vz:vv(i)=x:x=x+8:next
- 919 rem ** keypress matrix
- 920 dim kp(7),k(2)
- 921 for i=0 to 7:kp(i)=2:next:kp(1)=1:kp(2)=0:kp(7)=3
- 922 k(0)=-1:k(1)=1:k(2)=0
- 929 rem ** initial sprite positioning
- 930 hp=79:vp=vz:xk=1
- 931 poke vt(0),vv(vp):poke ht(0),hh(hp):poke hr,hb(hp)
- 939 rem ** tell vic-2 where to find sprite shape
- 940 poke lt(0),st(xk)
- 949 rem ** create screen display
- 950 print "[147]";:for i=0 to 5:for j=0 to ds:print "";:next
- 955 print mid$(ws$,1+int(19*rnd(9)),40);:next:print "";
- 959 rem ** clear screen line link table
- 960 l1=peek(217)or 128:l2=peek(218)or 128:poke 217,l1:poke 218,l2
- 969 rem ** clear collision registers
- 970 z=peek(cf):z=peek(cs)
- 989 rem ** set clock
- 990 ti$="000000"
- 996 return
-