home *** CD-ROM | disk | FTP | other *** search
/ AMOS PD CD / amospdcd.iso / 551-575 / apd566 / source / ladybug.amos / ladybug.amosSourceCode
AMOS Source Code  |  1994-01-01  |  23KB  |  795 lines

  1. 'NB: If you haven't read the Read Me! file then take note.  This is an 
  2. '    incomplete attempt at a game trying a certain method of bob updating. 
  3. '    My aim is to get complex movement patterns for the baddies through the
  4. '    maze (so they take the obvious route to the ladybug!) while having  
  5. '    only a short time between updates (and get rid of all other niggling
  6. '    problems as well)...
  7.  
  8. Screen Open 1,64,42,16,Lowres
  9. Curs Off : Flash Off 
  10. Screen Hide 
  11. Hide : Curs Off 
  12. '
  13. Global PL
  14. Load Iff "SLBTitleScreen.IFF",0
  15. TITLE_SCREEN
  16. '
  17. WDTH=12 : HGHT=12
  18. N_ICONS=79
  19. HISCORE=10000
  20. N_TAKE=54 : Rem .... Number of gettable objects  
  21. S_TAKE=20 : Rem .... Start of gettable objects 
  22. Dim M(WDTH,HGHT),N(WDTH,HGHT),O(WDTH,HGHT),X(16),Y(16),B(16),STAND(16)
  23. Dim LIVES(PL),SCORE(PL),EXTRA(PL),MARKV(PL),MARKX(PL),MARKY(PL),MARKT(PL)
  24. Dim WORTH(N_TAKE),OX(16),OY(16),U(16),V(16),WEAPON(PL),AM$(17),DEAD(PL)
  25. Dim SHIELDT(PL),WPX(3),WPY(3),NPX(3),NPY(3)
  26. AM$(17)="A 1,"
  27. For I=4 To 8
  28.    For J=5 To 8
  29.       AM$(17)=AM$(17)+"("+Str$(J)+","+Str$(I)+")"
  30.    Next J
  31. Next I
  32. AM$(17)=AM$(17)+"(5,20)(20,5)(21,5)(22,5)(23,5)"
  33. For I=0 To N_TAKE : WORTH(I)=100 : Next I
  34. SPT=-1
  35. Global M(),N(),O(),WDTH,HGHT,X(),Y(),B(),N_BUGS,SPO,SPX,SPY,SPT,AM$()
  36. Global LIVES(),SCORE(),EXTRA(),MARKV(),MARKX(),MARKY(),MARKT(),WORTH()
  37. Global N_TAKE,TIME,TX,TY,LIGHT,STAND(),OX(),OY(),HARVEST,CREDITS,FINISH
  38. Global U(),V(),HISCORE,WEAPON(),S_TAKE,DEAD(),SHIELDT(),LEVEL
  39. Global WPX(),WPY(),N_WEAPON_POS,NPX(),NPY(),N_NESTS
  40. '
  41. Auto View Off 
  42. Load Iff "LadybugScreen.IFF",0
  43. '
  44. Ink 1,0
  45. H$=Str$(HISCORE)-" " : Text 315-Text Length(H$),232,H$
  46. Text 306,80,"0" : Text 306,141,"0"
  47. '
  48. Double Buffer : Autoback 0 : Update Off 
  49. Flash 15,"(F00,35)(ABF,60)(4F4,120)"
  50. '
  51. Load "LadybugSprites.abk"
  52. Load "LadybugIcons.abk"
  53. Make Icon Mask 
  54. For I=1 To Length(1)
  55.    Hot Spot I,$11
  56. Next I
  57. '
  58. For I=0 To PL
  59.    For J=1 To 3
  60.       '      Inc LIVES(I)
  61.       LIVES[I,1]
  62.    Next J
  63. Next I
  64. '
  65. Every 20 Proc COUNTER
  66. LEVEL_LOAD
  67. '
  68. Do 
  69.    MOVE_LADYBUG
  70.    MOVE_BADDIES
  71.    DISPLAY_SCREEN
  72. Loop 
  73. '
  74. Procedure LEVEL_LOAD
  75.    Every Off : Rem Bob Off  
  76.    Bob Clear 
  77.    Inc LEVEL
  78.    LEVEL$="Small"+(Str$((LEVEL-1) mod 3+1)-" ")+".LBM"
  79.    Load LEVEL$,6
  80.    S=Start(6) : L=Length(6)
  81.    For I=0 To 3 : WPX(I)=0 : WPY(I)=0 : Next I
  82.    N_WEAPON_POS=-1
  83.    For J=1 To HGHT
  84.       For I=1 To WDTH
  85.          M(I,J)=Val(Bin$(Peek(S+(J-1)*WDTH+I-1),4))
  86.          N(I,J)=Peek(S+(J-1)*WDTH+I-1)-M(I,J)
  87.          If Btst(4,N(I,J)) and N_WEAPON_POS<3
  88.             Inc N_WEAPON_POS : WPX(N_WEAPON_POS)=I : WPY(N_WEAPON_POS)=J
  89.          End If 
  90.       Next I
  91.    Next J
  92.    N_NESTS=-1
  93.    For J=1 To HGHT
  94.       For I=1 To WDTH
  95.          O(I,J)=Peek(S+L/2+(J-1)*WDTH+I-1)
  96.          If O(I,J)=75 and N_NESTS<3
  97.             Inc N_NESTS : NPX(N_NESTS)=I : NPY(N_NESTS)=J
  98.          End If 
  99.       Next I
  100.    Next J
  101.    '
  102.    Erase 6
  103.    '
  104.    Auto View Off 
  105.    Screen Open 2,260,256,32,Lowres
  106.    Screen To Back 2
  107. '   Auto View On 
  108.    For J=1 To HGHT
  109.       For I=1 To WDTH
  110.          If I<WDTH Then MR=M(I+1,J)+1
  111.          If J<HGHT Then MD=M(I,J+1)+1
  112.          ' ..... NR=N(I+1,J) : ND=N(I,J+1)
  113.          If(MR>1 and MR<7) or MR=10 Then Bset 1,N(I,J)
  114.          If(MD>1 and MD<5) or(MD>6 and MD<9) or MD=10 Then Bset 2,N(I,J)
  115.          '
  116.          '
  117.          If I<WDTH and J<HGHT
  118.             If Btst(5,N(I+1,J)) or Btst(5,N(I+1,J+1)) : Bclr 1,N(I,J) : End If 
  119.             If Btst(6,N(I,J+1)) or Btst(6,N(I+1,J+1)) : Bclr 2,N(I,J) : End If 
  120.          End If 
  121.          '
  122.          '
  123.          Paste Icon I*21-13,J*21-11,M(I,J)+76
  124.       Next I
  125.    Next J
  126.    For J=1 To HGHT
  127.       For I=1 To WDTH
  128.          If Btst(5,N(I,J)) Then VDOOR[I,J,I*21-13,J*21-11]
  129.          If Btst(6,N(I,J)) Then HDOOR[I,J,I*21-13,J*21-11]
  130.       Next I
  131.    Next J
  132.    For J=1 To HGHT
  133.       For I=1 To WDTH
  134.          If O(I,J) : Paste Icon I*21-8,J*21-6,O(I,J) : End If 
  135.       Next I
  136.    Next J
  137.    '   For J=1 To HGHT
  138.    '      For I=1 To WDTH 
  139.    '        If Btst(1,N(I,J)) Then Draw I*21+10,J*21-11 To I*21+10,J*21+10
  140.    '        If Btst(2,N(I,J)) Then Draw I*21-11,J*21+10 To I*21+10,J*21+10
  141.    '      Next I
  142.    '   Next J 
  143.    '
  144. '
  145.    Screen Copy 2,8,10,244,246 To 0,8,10
  146.    Screen Close 2
  147.    Screen 0
  148.    A=(LEVEL-1)/4+1 : B=(LEVEL-1) mod 4+1
  149.    Text 290,45,Str$(A)-" "+"_"+Str$(B)-" "
  150. '
  151.    If LIGHT=18 Then A=TIME : B=140 Else A=1 : B=TIME
  152.    LIGHT=18
  153.    For K=A To B
  154.       If K<19 Then I=120+K*7 : J=3
  155.       If K>17 and K<54 Then I=246 : J=K*7-123
  156.       If K>53 and K<89 Then I=617-K*7 : J=248
  157.       If K>88 and K<124 Then I=1 : J=864-K*7
  158.       If K>123 Then I=K*7-860 : J=3
  159.       Paste Icon I,J,LIGHT
  160.    Next K
  161.    TIME=0
  162.    If LEVEL=1
  163.       Screen Copy 0 To Physic
  164.    Else 
  165.       Appear 0 To Physic,43
  166.    End If 
  167.    For I=0 To PL
  168.       SHIELDT(I)=100 : WEAPON(I)=0 : WEAPON_DRAW[0,I]
  169.       X(I)=2+PL*8 : Y(I)=10 : B(I)=1+PL*2
  170.       AM$(I)="LA=R2+1 ; M R0*21,R1*21,15"
  171.       Bob I,X(I)*21+1,Y(I)*21+2,B(I)+1
  172.       Channel I To Bob I
  173.    Next I
  174.    N_BUGS=2
  175.    For I=2 To 13
  176.       AM$(I)="A 1,(R2,4)(R2+1,4)(R2+2,4)(R2+1,4) ; M R0*21,R1*21,15"
  177.       X(I)=0 : Y(I)=0 : Bclr 3,N(X(I),Y(I)) : B(I)=0
  178.       Amal Off I
  179.    Next I
  180.    Auto View On 
  181.    Wait 10
  182.    Every On 
  183. End Proc
  184. Procedure VDOOR[I,J,U,V]
  185.    M=M(I,J+1)+1 : B=0
  186.    If M=2 or M=7 Then B=1
  187.    If M=5 or M=6 or M=9 or M=13 or M=14 Then B=2
  188.    Paste Icon U,V-16,B+90
  189.    If O(I,J) Then Paste Icon I*21-8,J*21-6,O(I,J)
  190. End Proc
  191. Procedure HDOOR[I,J,U,V]
  192.    M=M(I+1,J)+1 : B=0
  193.    If M=3 or M=5 Then B=1
  194.    If M=7 or M=8 or M=9 or M=12 or M=14 Then B=2
  195.    Paste Icon U-16,V,B+93
  196.    If O(I,J) Then Paste Icon I*21-8,J*21-6,O(I,J)
  197. End Proc
  198. Procedure DISPLAY_SCREEN
  199.    For I=0 To 1
  200.       Screen Swap : Wait Vbl 
  201.       Bob Clear 
  202.       '
  203.       If TY
  204.          Paste Icon TX,TY,LIGHT
  205.       End If 
  206.       '
  207.       If SPT=-200
  208.          If I=0
  209.             R=Rnd(N_WEAPON_POS)
  210.             If O(WPX(R),WPY(R))=0 and Rnd(3)=0
  211.                SPX=WPX(R) : SPY=WPY(R)
  212.                SPO=65+Rnd(8)
  213.                'SPO=48
  214.                SPT=300
  215.             Else 
  216.                SPT=-1
  217.             End If 
  218.          End If 
  219.       End If 
  220.       If SPT=300
  221.          Bell 60
  222.          Paste Icon SPX*21-8,SPY*21-6,SPO
  223.       End If 
  224.       If SPT=0
  225.          If I=0
  226.             COVER[SPX,SPY,48]
  227.          End If 
  228.          Put Block 49,SPX*21-8,SPY*21-6
  229.       End If 
  230.       '
  231.       For K=0 To N_BUGS
  232.          If STAND(K)
  233.             Put Block K+1,OX(K)*21-8,OY(K)*21-6
  234.             If I=1 : STAND(K)=0 : Del Block K+1 : End If 
  235.          End If 
  236.          If U(K)
  237.             Put Block(K*2)+18,U(K)*21-13,V(K)*21-27
  238.             Put Block(K*2)+19,U(K)*21-29,V(K)*21-11
  239.             If I=1
  240.                Bell 55 : U(K)=0 : V(K)=0
  241.                Del Block(K*2)+18 : Del Block(K*2)+19
  242.             End If 
  243.          End If 
  244.          If O(0,K)=True
  245.             Paste Icon X(14+K)*21-8,Y(14+K)*21-6,64
  246.             If I=1 : O(O,K)=False : End If 
  247.          End If 
  248.       Next K
  249.       '
  250.       Bob Draw 
  251.    Next I
  252.    Dec SPT
  253. End Proc
  254. Procedure DEAD[K]
  255.    If SHIELDT(K) Then Pop Proc
  256.    DEAD(K)=True
  257.    SHIELDT(K)=100
  258.    Amal K,AM$(17)
  259.    Amal On K
  260.    LIVES[K,0] : Boom 
  261. End Proc
  262. Procedure MOVE_LADYBUG
  263.    For K=0 To PL
  264.       If DEAD(K)=0
  265.          If SHIELDT(K)
  266.             Dec SHIELDT(K)
  267.             'Bob 14+K,X Bob(K),Y Bob(K),23 
  268.             If SHIELDT(K)=0 : Bob Off 14+K : End If 
  269.          End If 
  270.          If Bob Col(K,3 To N_BUGS+1)
  271.             DEAD[K]
  272.          End If 
  273.          If Chanmv(K)=0
  274.             O=O(X(K),Y(K))
  275.             If O
  276.                If O=74
  277.                   If SHIELDT(K)=0
  278.                      OX(K)=X(K) : OY(K)=Y(K) : O(X(K),Y(K))=0
  279.                      STAND(K)=O : COVER[OX(K),OY(K),K]
  280.                      DEAD[K]
  281.                   End If 
  282.                Else 
  283.                   If O=64
  284.                      If WEAPON(K)=0
  285.                         WEAPON(K)=64 : WEAPON_DRAW[64,K]
  286.                         Bell 60 : O(X(K),Y(K))=0
  287.                         OX(K)=X(K) : OY(K)=Y(K)
  288.                         STAND(K)=O : COVER[OX(K),OY(K),K]
  289.                      End If 
  290.                   Else 
  291.                      If O<>75
  292.                         Bell 63 : O(X(K),Y(K))=0 : Add SCORE(K),WORTH(O-S_TAKE)
  293.                         OX(K)=X(K) : OY(K)=Y(K) : CHG_SCORE[K]
  294.                         STAND(K)=O : COVER[OX(K),OY(K),K]
  295.                      End If 
  296.                   End If 
  297.                   If O>19 and O<29
  298.                      C=Colour(15)
  299.                      If C=$F00 : EXTRA[K,O] : End If 
  300.                      If C=$ABF : FINISH[O] : End If 
  301.                      If C=$4F4 : HARVEST[O] : End If 
  302.                   End If 
  303.                End If 
  304.             End If 
  305.             If SPT>0 and X(K)=SPX and Y(K)=SPY
  306.                SPECIAL_OBJECT[K]
  307.             End If 
  308.             ''U(K)=0 : V(K)=0
  309.             '         If K=1 
  310.             '            J=2^Rnd(3)
  311.             '         Else 
  312.             J=Joy(1-K)
  313.             If J>15
  314.                Add J,-16
  315.                USE_WEAPON[K]
  316.             End If 
  317.             '         End If 
  318.             JX=(J=4)-(J=8) : JY=(J=1)-(J=2)
  319.             B=(JY<0)*2-JX+2
  320.             '
  321.             If JX=-1
  322.                If Btst(5,N(X(K),Y(K))) : U(K)=X(K) : V(K)=Y(K) : End If 
  323.                If Btst(5,N(X(K),Y(K)+1)) : U(K)=X(K) : V(K)=Y(K)+1 : End If 
  324.             End If 
  325.             If JX=1
  326.                If Btst(5,N(X(K)+1,Y(K))) : U(K)=X(K)+1 : V(K)=Y(K) : End If 
  327.                If Btst(5,N(X(K)+1,Y(K)+1)) : U(K)=X(K)+1 : V(K)=Y(K)+1 : End If 
  328.             End If 
  329.             If JY=-1
  330.                If Btst(6,N(X(K),Y(K))) : U(K)=X(K) : V(K)=Y(K) : End If 
  331.                If Btst(6,N(X(K)+1,Y(K))) : U(K)=X(K)+1 : V(K)=Y(K) : End If 
  332.             End If 
  333.             If JY=1
  334.                If Btst(6,N(X(K),Y(K)+1)) : U(K)=X(K) : V(K)=Y(K)+1 : End If 
  335.                If Btst(6,N(X(K)+1,Y(K)+1)) : U(K)=X(K)+1 : V(K)=Y(K)+1 : End If 
  336.             End If 
  337.             '
  338.             If(JX or JY)
  339.                B(K)=B
  340.                If(Btst(2+(JX<>0),N(X(K)+(JX=-1),Y(K)+(JY=-1))) or U(K))
  341.                   Add X(K),JX : Add Y(K),JY
  342.                   Amal K,AM$(K)
  343.                   Amreg(K,0)=JX : Amreg(K,1)=JY : Amreg(K,2)=B
  344.                   Amal On K
  345.                Else 
  346.                   Bob K,,,B+1
  347.                End If 
  348.             End If 
  349.             '
  350.             A: If U(K)
  351.                Bchg 5,N(U(K),V(K)) : Bchg 6,N(U(K),V(K))
  352.                Bchg 1,N(U(K)-1,V(K)-1) : Bchg 2,N(U(K)-1,V(K)-1)
  353.                Bchg 1,N(U(K)-1,V(K)) : Bchg 2,N(U(K),V(K)-1)
  354.                SWING_DOOR[U(K),V(K),B(K),K]
  355.             End If 
  356.          End If 
  357.          On WEAPON(K)-163 Proc STONE,BOW_ARROW,LIGHTNING,DYNAMITE
  358.       Else 
  359.          If Chanan(K)=0
  360.             DEAD(K)=0
  361.             X(K)=2+K*8 : Y(K)=10
  362.             Bob K,X(K)*21+1,Y(K)*21+2,B(K)+1
  363.          End If 
  364.       End If 
  365.    Next K
  366. End Proc
  367. Procedure MOVE_BADDIES
  368.    For I=2 To N_BUGS
  369.       If Chanmv(I)=0 and X(I)
  370.          '
  371.          O=O(X(I),Y(I))
  372.          '         If O and O<>79 
  373.          '            Bell 40 : O(X(I),Y(I))=0
  374.          '            OX(I)=X(I) : OY(I)=Y(I) : STAND(I)=O
  375.          '         End If 
  376.          If O=74
  377.             OX(I)=X(I) : OY(I)=Y(I) : O(X(I),Y(I))=0
  378.             STAND(I)=O : COVER[OX(I),OY(I),I]
  379.             Boom : Bclr 3,N(X(I),Y(I)) : X(I)=0 : Y(I)=0
  380.             Amal Off I : Bob Off I
  381.             Goto S
  382.          End If 
  383.          '
  384.          DX=X(0)-X(I) : DY=Y(0)-Y(I)
  385.          If Abs(DX)<Abs(DY)
  386.             CX=0 : CY=Sgn(DY)
  387.          Else 
  388.             CY=0 : CX=Sgn(DX)
  389.          End If 
  390.          D=(CY<0)*2-CX+2 : B=D
  391.          Gosub TEST
  392.          If T1 or T2 or T3
  393.             If D=1 or D=3
  394.             If DY<>0 : B=1+Sgn(DY) : Else B=0 : End If 
  395.             End If 
  396.             If D=0 or D=2
  397.             If DX<>0 : B=2-Sgn(DX) : Else B=1 : End If 
  398.             End If 
  399.             Gosub TEST
  400.             If T1 or T2 or T3
  401.                If D=1 or D=3
  402.                If DY<>0 : B=1-Sgn(DY) : Else B=2 : End If 
  403.                End If 
  404.                If D=0 or D=2
  405.                If DX<>0 : B=2+Sgn(DX) : Else B=3 : End If 
  406.                End If 
  407.                Gosub TEST
  408.                If T1 or T2 or T3
  409.                   B=(D+2) mod 4
  410.                   Gosub TEST
  411.                   If T1 or T2 or T3
  412.                      B=(B(I)+2) mod 4
  413.                      Gosub TEST
  414.                      If T3
  415.                         CX=0 : CY=0
  416.                      End If 
  417.                   End If 
  418.                End If 
  419.             End If 
  420.          End If 
  421.          Bclr 3,N(X(I),Y(I))
  422.          B(I)=B : Add X(I),CX : Add Y(I),CY
  423.          Bset 3,N(X(I),Y(I))
  424.          Amal I,AM$(I) : Amreg(I,0)=CX : Amreg(I,1)=CY : Amreg(I,2)=B*3+24
  425.          Amal On I
  426.       End If 
  427.       If Bob Col(I,14 To 14+PL)
  428.          OX(I)=X(I) : OY(I)=Y(I) : O(X(I),Y(I))=0
  429.          STAND(I)=O : COVER[OX(I),OY(I),I]
  430.          Boom : Bclr 3,N(X(I),Y(I)) : X(I)=0 : Y(I)=0
  431.          Amal Off I : Bob Off I : K=Col(14)
  432.          Add SCORE(1+K),1000 : CHG_SCORE[1+K]
  433.       End If 
  434.    S: Next I
  435.    Pop Proc
  436.    TEST:
  437.    CX=(B=3)-(B=1) : CY=(B=0)-(B=2)
  438.    T1= Not Btst(2+(CX<>0),N(X(I)+(CX=-1),Y(I)+(CY=-1)))
  439.    T2=(B(I)=(B+2) mod 4)
  440.    T3=Btst(3,N(X(I)+CX,Y(I)+CY))
  441.    Return 
  442. End Proc
  443. Procedure COVER[I,J,K]
  444.    Screen 1
  445.       Paste Icon -5,-5,M(I,J)+76
  446.       If Btst(5,N(I,J)) : VDOOR[I,J,-5,-5] : End If 
  447.       If Btst(5,N(I,J+1)) : VDOOR[I,J+1,-5,16] : End If 
  448.       If Btst(6,N(I,J)) : HDOOR[I,J,-5,-5] : End If 
  449.       If Btst(6,N(I+1,J)) : HDOOR[I+1,J,16,-5] : End If 
  450.       Get Block K+1,0,0,16,16 : Rem ... add ,1 for mask
  451.    Screen 0
  452. End Proc
  453. Procedure SWING_DOOR[U,V,B,K]
  454.    Screen 1
  455.       Paste Icon 16,-5,M(U,V-1)+76
  456.       For I=-1 To 1 : Paste Icon(I+1)*21-5,16,M(U+I,V)+76 : Next I
  457.       Paste Icon 16,37,M(U,V+1)+76
  458.       If Btst(6,N(U-1,V-1)) : HDOOR[U-1,V-1,-5,-5] : End If 
  459.       If Btst(5,N(U-1,V-1)) : VDOOR[U-1,V-1,-5,-5] : End If 
  460.       If Btst(6,N(U+1,V-1)) : HDOOR[U+1,V-1,37,-5] : End If 
  461.       If Btst(5,N(U+1,V-1)) : VDOOR[U+1,V-1,37,-5] : End If 
  462.       If Btst(6,N(U-1,V+1)) : HDOOR[U-1,V+1,-5,37] : End If 
  463.       If Btst(5,N(U-1,V+1)) : VDOOR[U-1,V+1,-5,37] : End If 
  464.       If(B=3)-(B=1) : HDOOR[U,V,16,16] : End If 
  465.       If(B=0)-(B=2) : VDOOR[U,V,16,16] : End If 
  466.       If Btst(6,N(U+1,V+1)) : HDOOR[U+1,V+1,37,37] : End If 
  467.       If Btst(5,N(U+1,V+1)) : VDOOR[U+1,V+1,37,37] : End If 
  468.       If O(I,J) : Paste Icon I*21-8,J*21-6,O(I,J) : End If 
  469.       If O(U,V-1) : Paste Icon 21,0,O(U,V-1) : End If 
  470.       For I=-1 To 1
  471.          If O(U+I,V) : Paste Icon(I+1)*21,21,O(U+I,V) : End If 
  472.       Next I
  473.       If O(U,V+1) : Paste Icon 21,42,O(U,V+1) : End If 
  474.       If SPT>0 : Paste Icon(SPX-U)*21+21,(SPY-V)*21+21,SPO : End If 
  475.       Get Block(K*2)+18,16,0,8,40,1 : Get Block(K*2)+19,0,16,40,8,1
  476.    Screen 0
  477. End Proc
  478. Procedure COUNTER
  479.    TX=0 : TY=0 : Add TIME,1,1 To 140
  480.    If TIME=1
  481.       Add LIGHT,1,18 To 19
  482.       For I=2 To N_BUGS
  483.          If X(I)=0 : J=I : I=N_BUGS : End If 
  484.       Next I
  485.       If J=0 : Inc N_BUGS : J=N_BUGS : End If 
  486.       R=Rnd(N_NESTS) : X(J)=NPX(R) : Y(J)=NPY(R) : B(J)=Rnd(3)
  487.       Bob J,X(J)*21+1,Y(J)*21+2,B(J)*3+24
  488.       Channel J To Bob J
  489.       Bell 40
  490.    End If 
  491.    If TIME<19 Then TX=120+TIME*7 : TY=3
  492.    If TIME>17 and TIME<54 Then TX=246 : TY=TIME*7-123
  493.    If TIME>53 and TIME<89 Then TX=617-TIME*7 : TY=248
  494.    If TIME>88 and TIME<124 Then TX=1 : TY=864-TIME*7
  495.    If TIME>123 Then TX=TIME*7-860 : TY=3
  496.    Every On 
  497. End Proc
  498. Procedure EXTRA[K,O]
  499.    If O=21 : Paste Icon 263,98+61*K,1 : Bset 0,EXTRA(K) : End If 
  500.    If O=28 : Paste Icon 272,98+61*K,2 : Bset 1,EXTRA(K) : End If 
  501.    If O=26 : Paste Icon 281,98+61*K,3 : Bset 2,EXTRA(K) : End If 
  502.    If O=24 : Paste Icon 290,98+61*K,4 : Bset 3,EXTRA(K) : End If 
  503.    If O=20 : Paste Icon 299,98+61*K,5 : Bset 4,EXTRA(K) : End If 
  504.    Screen Copy 0,263,98+61*K,308,107+61*K To Physic,263,98+61*K
  505.    If EXTRA(K)=31 : ANOTHER_LIFE[K] : End If 
  506. End Proc
  507. Procedure FINISH[O]
  508.    If O=23 : Paste Icon 268,181,6 : Bset 0,FINISH : End If 
  509.    If O=21 : Paste Icon 277,181,7 : Bset 1,FINISH : End If 
  510.    If O=28 : Paste Icon 286,181,8 : Bset 2,FINISH : End If 
  511.    If O=26 : Paste Icon 295,181,9 : Bset 3,FINISH : End If 
  512.    Screen Copy 0,268,181,305,190 To Physic,268,181
  513.    If FINISH=15 : FINISH_LEVEL : End If 
  514. End Proc
  515. Procedure HARVEST[O]
  516.    If O=22 : Paste Icon 255,195,10 : Bset 0,HARVEST : End If 
  517.    If O=20 : Paste Icon 264,195,11 : Bset 1,HARVEST : End If 
  518.    If O=24 : Paste Icon 273,195,12 : Bset 2,HARVEST : End If 
  519.    If O=27 : Paste Icon 282,195,13 : Bset 3,HARVEST : End If 
  520.    If O=21 : Paste Icon 291,195,14 : Bset 4,HARVEST : End If 
  521.    If O=25 : Paste Icon 300,195,15 : Bset 5,HARVEST : End If 
  522.    If O=26 : Paste Icon 309,195,16 : Bset 6,HARVEST : End If 
  523.    If HARVEST=127 : HARVEST_LEVEL : End If 
  524.    Screen Copy 0,255,195,318,204 To Physic,255,195
  525. End Proc
  526. Procedure FLICKER[X,Y,W,H]
  527.    Amal Freeze 
  528.    Every Off 
  529.    Get Block 40,X,Y,W,H
  530.    Bell 
  531.    For I=1 To 15
  532.       Put Block 40
  533.       Screen Copy 0,X,Y,X+W,Y+H To Physic,X,Y
  534.       Wait 4
  535.       Cls 0,X,Y To X+W-2,Y+H
  536.       Screen Copy 0,X,Y,X+W,Y+H To Physic,X,Y
  537.       Wait 3
  538.    Next I
  539.    Del Block 40
  540.    Every On : Amal On 
  541. End Proc
  542. Procedure ANOTHER_LIFE[K]
  543.    FLICKER[263,98+61*K,47,9]
  544.    EXTRA(K)=0
  545.    LIVES[K,1]
  546. End Proc
  547. Procedure FINISH_LEVEL
  548.    FLICKER[268,181,39,9]
  549.    FINISH=0
  550.    LEVEL_LOAD
  551. End Proc
  552. Procedure HARVEST_LEVEL
  553.    FLICKER[255,195,65,9]
  554.    HARVEST=0
  555. End Proc
  556. Procedure CHG_SCORE[K]
  557.    S$=Str$(SCORE(K))-" "
  558.    Text 314-Text Length(S$),80+61*K,S$
  559.    Screen Copy 0,259,74+61*K,314,81+61*K To Physic,259,74+61*K
  560.    If SCORE(K)>HISCORE
  561.       HISCORE=SCORE(K)
  562. '      Text 315-Text Length(S$),225,S$ 
  563.       Screen Copy 0,259,74+61*K,314,81+61*K To 0,260,226
  564.       Screen Copy 0,260,226,314,234 To Physic,260,226
  565.    End If 
  566. End Proc
  567. Procedure LIVES[K,D]
  568.    If D
  569.       Inc LIVES(K)
  570.       Paste Icon 314-LIVES(K)*12,86+K*61,17
  571.    Else 
  572.       Dec LIVES(K)
  573.       Cls 0,302-LIVES(K)*12,86+K*61 To 313-LIVES(K)*12,94+K*61
  574.    End If 
  575.    Screen Copy 0,257,85+K*61,313,94+K*61 To Physic,257,85+K*61
  576. End Proc
  577. Procedure WEAPON_DRAW[I,K]
  578.    If I=0
  579.       Cls 0,298,55+K*61 To 311,69+K*61
  580.    Else 
  581.       Paste Icon 296,54+K*61,I
  582.    End If 
  583.    Screen Copy 0,298,55+K*61,311,69+K*61 To Physic,298,55+K*61
  584. End Proc
  585. Procedure SPECIAL_OBJECT[K]
  586.    If WEAPON(K)=0
  587.       If SPO=65
  588.          'Bow and Arrow 
  589.          WEAPON(K)=65 : T=True
  590.          WEAPON_DRAW[65,K]
  591.       End If 
  592.       If SPO=66
  593.          'Lightning 
  594.          WEAPON(K)=66 : T=True
  595.          WEAPON_DRAW[66,K]
  596.       End If 
  597.       If SPO=67
  598.          'Dynamite
  599.          WEAPON(K)=67 : T=True
  600.          WEAPON_DRAW[67,K]
  601.       End If 
  602.    End If 
  603.    If SPO=68
  604.       'Shield
  605.       SHIELDT(K)=1000
  606.       T=True
  607.    End If 
  608.    If SPO=69
  609.       'Alphabet Block
  610.       C=Colour(15)
  611.       If C=$F00
  612.          For I=1 To 5
  613.             Paste Icon 263+(I-1)*9,98+61*K,I
  614.          Next I
  615.          EXTRA(K)=31
  616.          Screen Copy 0,263,98+61*K,308,107+61*K To Physic,263,98+61*K
  617.          ANOTHER_LIFE[K]
  618.       End If 
  619.       If C=$ABF
  620.          For I=6 To 9
  621.             Paste Icon 268+(I-6)*9,181,I
  622.          Next I
  623.          FINISH=15
  624.          Screen Copy 0,268,181,305,190 To Physic,268,181
  625.          FINISH_LEVEL
  626.       End If 
  627.       If C=$4F4
  628.          For I=10 To 16
  629.             Paste Icon 255+(I-10)*9,195,I
  630.          Next I
  631.          HARVEST=127
  632.          Screen Copy 0,255,195,318,204 To Physic,255,195
  633.          HARVEST_LEVEL
  634.       End If 
  635.       T=True
  636.    End If 
  637.    If SPO=70
  638.       'Crucifix
  639.       Boom 
  640.       Cls 1 : Screen Swap : Wait Vbl 
  641.       Boom 
  642.       For L=2 To N_BUGS
  643.          If X(L)
  644.             Bclr 3,N(X(L),Y(L)) : X(L)=0 : Y(L)=0
  645.             Amal Off L : Bob Off L
  646.             Add SCORE(K),1000
  647.          End If 
  648.       Next L
  649.       Screen Copy 0 To Physic
  650.       CHG_SCORE[K]
  651.       T=True
  652.    End If 
  653.    If SPO=71
  654.       'Clock 
  655.       T=True
  656.    End If 
  657.    If SPO=72
  658.       'Hourglass 
  659.       T=True
  660.    End If 
  661.    If SPO=73
  662.       'Shoe
  663.       AM$(K)=Left$(AM$(K),Len(AM$(K))-2)+"12"
  664.       T=True
  665.    End If 
  666.    If T
  667.       SPT=0 : Bell 60
  668.    End If 
  669. End Proc
  670. Procedure USE_WEAPON[K]
  671.    W=WEAPON(K)
  672.    If W<64 or W>67
  673.       Pop Proc
  674.    End If 
  675.    Add WEAPON(K),100
  676.    If W=64
  677.       'Stone 
  678.       X(14+K)=X(K) : Y(14+K)=Y(K) : B(14+K)=B(K)
  679.       Bob 14+K,X(K)*21+5,Y(K)*21+2,19
  680.       Channel 14+K To Bob 14+K
  681.       AM$(14+K)="M"+Str$(((B(K)=3)-(B(K)=1))*21)+","+Str$(((B(K)=0)-(B(K)=2))*21)+",7"
  682.    End If 
  683.    If W=65
  684.       'Bow&Arrow 
  685.       X(14+K)=X(K) : Y(14+K)=Y(K) : B(14+K)=B(K)
  686.       Bob 14+K,X(K)*21+5,Y(K)*21+2,9+B(K)
  687.       Channel 14+K To Bob 14+K
  688.       AM$(14+K)="M"+Str$(((B(K)=3)-(B(K)=1))*21)+","+Str$(((B(K)=0)-(B(K)=2))*21)+",7"
  689.    End If 
  690.    If W=66
  691.       'Lightning 
  692.       X(14+K)=X(K) : Y(14+K)=Y(K) : B(14+K)=B(K)
  693.       Bob 14+K,X(K)*21+5,Y(K)*21+2,13+B(K)
  694.       Channel 14+K To Bob 14+K
  695.       AM$(14+K)="M"+Str$(((B(K)=3)-(B(K)=1))*21)+","+Str$(((B(K)=0)-(B(K)=2))*21)+",7"
  696.    End If 
  697.    If W=67
  698.       'Dynamite
  699.       Bob 14+K,X(K)*21+5,Y(K)*21+2,17
  700.       Channel 14+K To Bob 14+K
  701.       Amal 14+K,"A 20,(18,4)(17,4)"
  702.       Amal On 14+K
  703.    End If 
  704.    WEAPON_DRAW[0,K]
  705. End Proc
  706. Procedure LIGHTNING
  707.    Shared K
  708.    If Chanmv(14+K)=0
  709.       CX=(B(14+K)=3)-(B(14+K)=1) : CY=(B(14+K)=0)-(B(14+K)=2)
  710.       If X(14+K)+CX>0 and X(14+K)+CX<12 and Y(14+K)+CY>0 and Y(14+K)+CY<12
  711.          Add X(14+K),CX : Add Y(14+K),CY
  712.          Amal 14+K,AM$(14+K)
  713.          Amal On 14+K
  714.       Else 
  715.          Bob Off 14+K
  716.          WEAPON(K)=0
  717.       End If 
  718.    End If 
  719. End Proc
  720. Procedure DYNAMITE
  721.    Shared K
  722.    If Chanan(14+K)=0
  723.       Bob Off 14+K
  724.       WEAPON(K)=0
  725.    End If 
  726. End Proc
  727. Procedure BOW_ARROW
  728.    Shared K
  729.    If Chanmv(14+K)=0
  730.       CX=(B(14+K)=3)-(B(14+K)=1) : CY=(B(14+K)=0)-(B(14+K)=2)
  731.       If Btst(2+(CX<>0),N(X(14+K)+(CX=-1),Y(14+K)+(CY=-1)))
  732.          Add X(14+K),CX : Add Y(14+K),CY
  733.          Amal 14+K,AM$(14+K)
  734.          Amal On 14+K
  735.       Else 
  736.          Bob Off 14+K
  737.          WEAPON(K)=0
  738.       End If 
  739.    End If 
  740. End Proc
  741. Procedure STONE
  742.    Shared K
  743.    If Chanmv(14+K)=0
  744.       CX=(B(14+K)=3)-(B(14+K)=1) : CY=(B(14+K)=0)-(B(14+K)=2)
  745.       If Btst(2+(CX<>0),N(X(14+K)+(CX=-1),Y(14+K)+(CY=-1)))
  746.          Add X(14+K),CX : Add Y(14+K),CY
  747.          Amal 14+K,AM$(14+K)
  748.          Amal On 14+K
  749.       Else 
  750.          Bob Off 14+K
  751.          WEAPON(K)=0
  752.          O(X(14+K),Y(14+K))=64
  753.          O(0,K)=True
  754.       End If 
  755.    End If 
  756. End Proc
  757. Procedure TITLE_SCREEN
  758.    A=1 : B=0
  759.    Ink 1 : Box 96,190+B*18 To 217,207+B*18
  760.    Timer=0
  761.    Repeat 
  762.       J=Joy(1)
  763.       If J=1 or J=2
  764.          Ink 0 : Box 96,190+B*18 To 217,207+B*18
  765.          Swap A,B
  766.          Ink 1 : Box 96,190+B*18 To 217,207+B*18
  767.          Wait 10
  768.          Timer=0
  769.       End If 
  770.       If Timer>300
  771.          Timer=0
  772.          Get Block 1,0,0,320,256,0
  773.          Cls 0,10,10 To 310,246
  774.          Pen 5 : Paper 0
  775.          Locate 0,3 : Centre "T O P   T E N   S C O R E S   ! ! !"
  776.          Pen 3
  777.          Locate 0,7 : Centre "PLACE  NAME   SCORE    LEVEL"
  778.          NAME$="GLENN" : SCORE=1000000 : LVL=35
  779.          Pen 10
  780.          For I=0 To 9
  781.             Print At(7,10+I*2);I+1
  782.             Print At(13,10+I*2);NAME$
  783.             Print At(19,10+I*2);SCORE
  784.             Print At(28,10+I*2);LVL
  785.          Next I
  786.          Repeat 
  787.             If Fire(1) : Timer=401 : Wait 15 : End If 
  788.          Until Timer>400
  789.          Put Block 1
  790.          Del Block 1
  791.          Timer=0
  792.       End If 
  793.    Until J>15
  794.    PL=B
  795. End Proc