home *** CD-ROM | disk | FTP | other *** search
/ AMOS PD CD / amospdcd.iso / sourcecode / games / dick.amos / dick.amosSourceCode < prev    next >
AMOS Source Code  |  1990-11-16  |  25KB  |  927 lines

  1. Close Workbench 
  2. Close Editor 
  3. Dim HINAME$(5),HISCORE(5)
  4. Dir$="Apd97:Dynamite_dick"
  5. Open In 1,"Hi_score"
  6. For N=1 To 5
  7.    Input #1,HINAME$(N),HISCORE(N)
  8. Next N
  9. Close 1
  10. Global XSIZE,YSIZE,LEVEL,X_DD,Y_DD,DYN_ACTIVE,DD_AMAL$,DD_DIRECTION,DD_FRAME,DD_WRAP,X_DYN,Y_DYN,X_MOLE,Y_MOLE
  11. Global MOLE_DIRECTION,BAT_DIRECTION,MOLE_TIMER,BAT_TIMER,BONUS_TIMER,DIGS,DYNAMITE,DYN_FLAG,DIGS_FLAG,BONUS,LIVES,SCORE,TITLE$
  12. Load "Samples.ABK"
  13. Hide 
  14. Randomize Timer
  15. Get Disc Fonts 
  16. '
  17. Do 
  18.    TITLE_PAGE
  19.    Exit If QUIT=True
  20.    SP=2 : XSIZE=32 : YSIZE=32 : LEVEL=1 : SCORE=0 : LIVES=3 : DIGS=3+Rnd(4) : DYNAMITE=4
  21.    Repeat 
  22.       SETUP_PLAYING_AREA
  23.       DISPLAY_LEVEL
  24.       SETUP_BOBS
  25.       Repeat 
  26.          KY$=Inkey$
  27.          PITS
  28.          T1MER
  29.          MOVE_MOLE
  30.          MOVE_BAT
  31.          BONUS
  32.          If Chanan(5)=0 and PIT_ACTIVE=1 Then PIT_ACTIVE=0 : Bob Off 4
  33.          J0YSTICK
  34.          F1RE_BUTTON
  35.          If Joy(1)=%10000 and Chanan(3)=0 and DYNAMITE>0 Then SPACE_BAR
  36.          If Chanan(3)=0 and DYN_ACTIVE=0 Then Bob Off 2
  37.          X_PLOSION
  38.          PICK_UP
  39.          C0LLISIONS
  40.          OUT_OF_DYNAMITE
  41.          OUT_OF_DIGS
  42.          If KY$=Chr$(13) Then GRAVE_STONE
  43.       Until LIVES<1 or LEVEL_NEXT=True
  44.       If LEVEL_NEXT=True
  45.          LEVEL_NEXT=False
  46.          If BONUS>0
  47.             SCORE=SCORE+BONUS
  48.          End If 
  49.          Get Sprite Palette 
  50.          Wait 100
  51.          Screen Close 0
  52.          Screen Hide 1
  53.       End If 
  54.    Until LIVES<1
  55. Loop 
  56. Open Out 1,"Hi_score"
  57. For N=1 To 5
  58.    Print #1,HINAME$(N)
  59.    Print #1,HISCORE(N)
  60. Next N
  61. Close 1
  62. Edit 
  63. '
  64. Procedure TITLE_PAGE
  65.    Shared HINAME$(),HISCORE(),QUIT
  66.    QUIT=False
  67.    MES$=String$(" ",40)+"Instructions:-  While cave exploring on his holiday, in 'sunny' Cornwall, Dick "
  68.    MES$=MES$+"hits upon an abandoned smugglers cave filled with loads of dosh! Jumping with joy of being able to buy his "
  69.    MES$=MES$+"dream car, a GT Skoda, he suddenly relieses he's forgotten the way out!   Yep! You've guessed it...you've gotta "
  70.    MES$=MES$+"help him get out.  Plug your joystick in port 2, usual left, right, up & down movements apply. To complete a level "
  71.    MES$=MES$+"you must pick up the key (by walking over it) & taking it to the door. You can also collect bags of gold which "
  72.    MES$=MES$+"adds to your score. Each level consist of granite (indistructable), rock (blown away using dynamite) & dirt "
  73.    MES$=MES$+"(which can be dug away with a spade). You start off with 4 sticks of dynamite, pressing the fire button, while not moving, drops a "
  74.    MES$=MES$+"stick where you are standing so move quickly unless you want to be a fried Dick! When Dick is down to his last "
  75.    MES$=MES$+"stick, another load of dynamite will appear on the screen for him to pick up. Dick can only hold 4 sticks! When "
  76.    MES$=MES$+"the dynamite goes off Dick, The Bat, The Mole, gold & rocks in the area around the dynamite are destroyed! You start "
  77.    MES$=MES$+"with a spade (which is used by holding down the fire button & moving in one of the 4 directions) after a while the spade "
  78.    MES$=MES$+"will break and you will have to pick up another one.  So wots stopping Dick from getting out alive?...The Mole for starters, "
  79.    MES$=MES$+"who wonders around walking into walls (he can't see, ya see??). The Bat moves in a similar manner as The Mole but starts "
  80.    MES$=MES$+"to hunt you down when he detects Dicks movements with his 'sonar'! Every now & again a pit will appear & as we all "
  81.    MES$=MES$+"know 100 foot pits are not healthy to walk on! Also on some levels there's a rail cart...& they hurt!  As you are "
  82.    MES$=MES$+"trying to complete your task a bonus is ticking away. Complete the level and the bonus is yours but if the bonus "
  83.    MES$=MES$+"falls to zero the batteries in Dicks helmet-mounted-lamp die & the hunt is on for another battery, in the dark!!  Pressing "
  84.    MES$=MES$+"the 'ENTER' button while playing the game is the suicide button for when Dick gets stuck. Pressing 'ENTER' on this screen quits "
  85.    MES$=MES$+"the game & saves the Hi-score table.    Credits:-  This game was written by Adam Leech using AMOS 1.1. Graphics by A. Leech & borrowed from "
  86.    MES$=MES$+"'Magic Forest'. Music borrowed from 'Pukadu'. Game concept & play testing by Graham White who first wrote it on a Spectrum+ in BASIC. Thanx Whitie. "
  87.    Load Iff "title.iff",1
  88.    Load "Music.ABK"
  89.    Screen Hide 
  90.    Shift Down 2,2,30,1
  91.    Screen Open 0,320,256,4,Lowres
  92.    Screen Hide 
  93.    Curs Off 
  94.    Cls 0
  95.    Set Font 1
  96.    Music 1
  97.    Ink 1,0
  98.    For N=1 To 5
  99.       Text 50,24*N+97,Mid$(Str$(N),1)+"    "+Str$(HISCORE(N))
  100.       Text 180,24*N+99,HINAME$(N)
  101.    Next N
  102.    Set Rainbow 0,1,120,"(1,-1,12)(1,1,12)","(1,1,12)(1,-1,12)","(1,-1,12)(1,1,12)"
  103.    Rainbow 0,0,151,120
  104.    Screen Show 
  105.    Screen Show 1
  106.    Screen To Back 
  107.    Paper 0
  108.    Set Rainbow 1,2,16,"","(1,1,8)(1,-1,8)",""
  109.    Rainbow 1,0,277,16
  110.    Def Scroll 1,1,240 To 320,256,-1,
  111.    Do 
  112.       For N=1 To Len(MES$)
  113.          Locate 38,30 : Print Mid$(MES$,N,1)
  114.          For M=1 To 8
  115.             Scroll 1
  116.             Wait Vbl 
  117.             Exit If Fire(1)<0,3
  118.          Next M
  119.          If Inkey$=Chr$(13) Then QUIT=True : Exit 2
  120.       Next N
  121.    Loop 
  122.    For N=63 To 0 Step -1
  123.       Wait 2
  124.       Volume N
  125.    Next N
  126.    Erase 3
  127.    Volume 63
  128.    Screen Close 0
  129.    Screen Close 1
  130.    MES$=""
  131. End Proc
  132. Procedure SETUP_PLAYING_AREA
  133.    DD_DIRECTION=1 : DD_FRAME=1 : X_DD=30 : Y_DD=30 : DD_WRAP=0 : DYN_ACTIVE=0
  134.    PIT_ACTIVE=0 : MOLE_TIMER=0 : BAT_TIMER=0 : GOT_KEY=0 : LEVEL_NEXT=False
  135.    DYN_FLAG=0 : DIGS_FLAG=0
  136.    Update Every 2
  137.    Screen Open 0,640,400,16,Lowres
  138.    Flash Off : Screen Hide 
  139.    Load Iff "DDdirt"
  140.    Screen Offset 0,1,1
  141.    Load Iff "panel2",1
  142.    Set Font 2
  143.    Screen Display 1,127,252,352,50
  144.    Screen Hide 
  145.    Ink 2,0
  146.    Text 295,15,Str$(LIVES)
  147.    SCORE_UPDATE
  148.    Screen 0
  149.    Reserve Zone 222
  150.    '
  151.    ' -------- AMAL ROUTINES ------- 
  152.    '
  153.    Bob 10,X_DD,Y_DD,10
  154.    DD_AMAL$="S: L RA=X; L RB=Y; J S"
  155.    S_SCROLL$="L: If RA>303 J R; If X<1 J R; L X=X-1;"
  156.    S_SCROLL$=S_SCROLL$+"R: If RA<304 J U; If X>290 J U; L X=X+1;"
  157.    S_SCROLL$=S_SCROLL$+"U: If RB>178 J D; If Y<1 J D; L Y=Y-1;"
  158.    S_SCROLL$=S_SCROLL$+"D: If RB<179 J L; If Y>175 J L; L Y=Y+1; J L;"
  159.    Channel 1 To Bob 10 : Rem DD 
  160.    Channel 2 To Screen Offset 0 : Rem screen 
  161.    Channel 3 To Bob 2 : Rem dynamite 
  162.    Channel 4 To Bob 3 : Rem rail cart
  163.    Channel 5 To Bob 4 : Rem pit
  164.    Amal 1,DD_AMAL$
  165.    Amal 2,S_SCROLL$
  166.    Amal On 
  167. End Proc
  168. Procedure _INTERMITION
  169.    Screen 2
  170.    Screen Show 
  171.    Screen To Front 
  172.    Ink 1,0
  173.    Cls 0
  174.    Text 130,20,"LEVEL "+Mid$(Str$(LEVEL),2)
  175.    Text 80,52,TITLE$
  176.    Ink 2
  177.    Text 130,86,"Ready ?"
  178.    Set Rainbow 0,1,64,"(1,1,1)","(1,-1,1)",""
  179.    Rainbow 0,2,95,64
  180.    Set Rainbow 1,2,320,"(1,-1,1)","","(1,1,1)"
  181.    Rainbow 1,2,175,32
  182.    Channel 10 To Rainbow 1
  183.    Amal 10,"S: M 320,0,600; J S;"
  184.    Amal On 10
  185.    Wait 250
  186.    Rainbow 0,,300,1
  187.    Rainbow 1,,300,1
  188.    Screen Hide 
  189.    Amal Off 10
  190. End Proc
  191. Procedure OUT_OF_DYNAMITE
  192.    If DYNAMITE<2 and DYN_FLAG=0
  193.       DYN_FLAG=0 : FLAG=5
  194.       Repeat 
  195.          X=((Rnd(540)/32)*32)+96 : Y=((Rnd(200)/32)*32)+96
  196.          If Zone(X,Y)=0
  197.             Bob 1,X,Y,47
  198.             Inc DYN_FLAG
  199.             Play 1,20,0
  200.          Else 
  201.             Dec FLAG
  202.          End If 
  203.       Until DYN_FLAG>0 or FLAG<1
  204.    End If 
  205. End Proc
  206. Procedure OUT_OF_DIGS
  207.    If DIGS=0 and DIGS_FLAG=0
  208.       DIGS_FLAG=0 : FLAG=5
  209.       Repeat 
  210.          X=((Rnd(540)/32)*32)+96 : Y=((Rnd(200)/32)*32)+96
  211.          If Zone(X,Y)=0
  212.             Bob 7,X,Y,46
  213.             Inc DIGS_FLAG
  214.             Shoot 
  215.          Else 
  216.             Dec FLAG
  217.          End If 
  218.       Until DIGS_FLAG>0
  219.    End If 
  220. End Proc
  221. Procedure BONUS
  222.    If BONUS=0
  223.       Fade 4,0,0,$222,$222,$222,,$222,$222
  224.       Dec BONUS
  225.       FLAG=0
  226.       Repeat 
  227.          X=((Rnd(540)/32)*32)+96 : Y=((Rnd(200)/32)*32)+96
  228.          If Zone(X,Y)=0
  229.             Bob 8,X,Y,54
  230.             Inc FLAG
  231.             Play 1,1,0
  232.          End If 
  233.       Until FLAG>0
  234.    End If 
  235. End Proc
  236. Procedure PICK_UP
  237.    Shared GOT_KEY,LEVEL_NEXT
  238.    Z0N=Zone(X Bob(10)+15,Y Bob(10)+15)
  239.    If Z0N>19 and Z0N<42
  240.       ' Standing on key? 
  241.       If Z0N=20
  242.          Play 1,70,0
  243.          Inc GOT_KEY
  244.          SCORE=SCORE+100
  245.          SCORE_UPDATE
  246.       End If 
  247.       ' Standing on door?
  248.       If Z0N=21
  249.          If GOT_KEY=0
  250.             Pop Proc
  251.          End If 
  252.          Inc LEVEL
  253.          LEVEL_NEXT=True
  254.          GOT_KEY=0
  255.          For N=10 To 80 : Bell N : Wait 1 : Next N
  256.          Pop Proc
  257.       End If 
  258.       ' Standing on some gold? 
  259.       If Z0N>21 and Z0N<42
  260.          Play 1,60,0
  261.          SCORE=SCORE+10
  262.          SCORE_UPDATE
  263.       End If 
  264.       X=((X Bob(10)+15)/32)*32 : Y=((Y Bob(10)+15)/32)*32
  265.       Bar X,Y To X+31,Y+31
  266.       Paste Icon X,Y,10
  267.       Reset Zone Z0N
  268.    End If 
  269. End Proc
  270. Procedure SCORE_UPDATE
  271.    Screen 1
  272.    Text 293,25,Str$(SCORE)+" "
  273.    Screen 0
  274. End Proc
  275. Procedure C0LLISIONS
  276.    C0L=Bob Col(2,3 To 10)
  277.    If C0L<0 and Amreg(2)>148
  278.       If Col(5)<0
  279.          X=X Bob(5) : Y=Y Bob(5)
  280.          Bob Off 5
  281.          Paste Bob X,Y,74
  282.          MOLE_TIMER=Timer/100+7
  283.          Sam Play 2,1,10000
  284.          SCORE=SCORE+50
  285.          SCORE_UPDATE
  286.       End If 
  287.       If Col(6)<0
  288.          X=X Bob(6) : Y=Y Bob(6)
  289.          Bob Off 6
  290.          Paste Bob X,Y,74
  291.          BAT_TIMER=Timer/100+7
  292.          Sam Play 2,1,30000
  293.          SCORE=SCORE+50
  294.          SCORE_UPDATE
  295.       End If 
  296.       If Col(10)<0
  297.          Get Sprite Palette 
  298.          Move Freeze 
  299.          Amal 1,"L X=X+16; L Y=Y+16; A 1,(74,50)(74,50)"
  300.          Amal On 1
  301.          Paste Bob X_DD,Y_DD,74
  302.          Sam Loop Off 
  303.          Sam Play 2,1,6000
  304.          AFTER_DEATH
  305.       End If 
  306.    End If 
  307.    C0L=Bob Col(10,3 To 6)
  308.    If C0L<0
  309.       GRAVE_STONE
  310.    End If 
  311.    C0L=Bob Col(1)
  312.    If Col(10)<0
  313.       Bob Off 1
  314.       Dec DYN_FLAG
  315.       DYNAMITE=4
  316.       Play 1,50,0
  317.    End If 
  318.    C0L=Bob Col(7)
  319.    If Col(10)<0
  320.       Bob Off 7
  321.       Dec DIGS_FLAG
  322.       DIGS=3+Rnd(4)
  323.       Play 1,50,0
  324.    End If 
  325.    C0L=Bob Col(8)
  326.    If Col(10)<0
  327.       Bob Off 8
  328.       Get Sprite Palette 
  329.       BONUS=200
  330.       Play 1,50,0
  331.    End If 
  332. End Proc
  333. Procedure GRAVE_STONE
  334.    Get Sprite Palette 
  335.    Move Freeze 
  336.    Amal 1,"A 1,(81,30)(80,10)(79,10)(78,10)(77,10)(76,10)(75,50); F R0=0 T 20; M 2,0,3; M -2,0,3; N R0;"
  337.    Amal On 1
  338.    Sam Loop Off 
  339.    Sam Play 2,1,6000
  340.    Noise To 4
  341.    For N=1 To 17
  342.       Play 4,1,2 : Play 4,10,2 : Play 4,5,2 : Play 4,10,2
  343.    Next N
  344.    Wait 150
  345.    Paste Bob X_DD,Y_DD,75
  346.    AFTER_DEATH
  347. End Proc
  348. Procedure AFTER_DEATH
  349.    Shared DD_AMAL$
  350.    Dec LIVES
  351.    Screen 1
  352.    Text 293,15,Str$(LIVES)+" "
  353.    Wait 150
  354.    Bob Off 2
  355.    DYN_ACTIVE=0
  356.    If LIVES>0
  357.       Screen Hide 0
  358.       Screen Hide 1
  359.       _INTERMITION
  360.       X_DD=30 : Y_DD=30
  361.       Bob 10,X_DD,Y_DD,10
  362.       Amal 1,DD_AMAL$
  363.       Amal On 1
  364.       Wait 100
  365.       SETUP_BOBS
  366.       DYN_FLAG=0
  367.       DIGS_FLAG=0
  368.       DYNAMITE=4
  369.       DIGS=3+Rnd(4)
  370.       Bob Off 1
  371.       Bob Off 7
  372.       Bob Off 8
  373.       Screen Show 0
  374.       Screen Show 1
  375.    Else 
  376.       GAME_OVER
  377.       HISCORE
  378.    End If 
  379. End Proc
  380. Procedure HISCORE
  381.    Shared HINAME$(),HISCORE(),SCORE,NAME$
  382.    POS=0
  383.    Repeat 
  384.       Inc POS
  385.       Exit If POS>5
  386.    Until SCORE>=HISCORE(POS)
  387.    If POS<6
  388.       Screen Open 0,320,50,2,Lowres
  389.       Screen Display 0,,100,,
  390.       Curs Off 
  391.       Set Font 2
  392.       Cls 0
  393.       Text 60,10,"Please Enter Your Name"
  394.       Locate ,3
  395.       Print String$(" ",11)+Mid$(Str$(POS),1)+"   "+String$(".",10)
  396.       LETTER$="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 "
  397.       X=0 : NAME$=""
  398.       Set Rainbow 0,1,40,"(1,1,10)(1,-1,10)","(1,2,4)(1,-2,4)",""
  399.       Rainbow 0,0,97,40
  400.       Repeat 
  401.          KY$=Inkey$
  402.          If KY$=Chr$(8) and X>0
  403.             Dec X
  404.             NAME$=Left$(NAME$,X)
  405.             Locate 16+X,3 : Print "."
  406.          End If 
  407.          If Instr(LETTER$,Upper$(KY$))>0 and X<10
  408.             NAME$=NAME$+Upper$(KY$)
  409.             Locate 16+X,3 : Print Upper$(KY$)
  410.             Inc X
  411.          End If 
  412.       Until KY$=Chr$(13)
  413.       If NAME$=""
  414.          RAND_NAME
  415.       Else 
  416.          NAME$=Left$(NAME$,1)+Lower$(Right$(NAME$,Len(NAME$)-1))
  417.       End If 
  418.       Screen Close 0
  419.       For N=4 To POS Step -1
  420.          HISCORE(N+1)=HISCORE(N)
  421.          HINAME$(N+1)=HINAME$(N)
  422.       Next N
  423.       HISCORE(POS)=SCORE
  424.       HINAME$(POS)=NAME$
  425.    End If 
  426. End Proc
  427. Procedure RAND_NAME
  428.    Shared NAME$
  429.    N=Rnd(11)+1
  430.    Restore NAME
  431.    For M=1 To N
  432.       Read NAME$
  433.    Next M
  434.    Print At(16,3);NAME$
  435.    Wait 150
  436.    NAME:
  437.    Data "Her","Him","You","Me","007","Q","M","A.N.Other","A. Glump","Somebody","Nameless","D. Dick"
  438. End Proc
  439. Procedure GAME_OVER
  440.    Screen Hide 0
  441.    Screen Hide 1
  442.    Screen Open 0,400,20,2,Lowres
  443.    Screen Display 0,100,150,,
  444.    Def Scroll 1,0,0 To 199,19,1,
  445.    Def Scroll 2,200,0 To 400,19,-1,
  446.    Set Rainbow 0,1,20,"(1,2,5)(1,-2,5)","(1,2,5)(1,-2,5)","(1,1,18)(1,-1,18)"
  447.    Rainbow 0,0,150,20
  448.    Set Font 1
  449.    Cls 0
  450.    Ink 1
  451.    Text 1,14,"GAME"
  452.    Text 345,14,"OVER"
  453.    For N=0 To 130
  454.       Scroll 1
  455.       Scroll 2
  456.       Wait Vbl 
  457.    Next N
  458.    Wait 200
  459. End Proc
  460. Procedure T1MER
  461.    If MOLE_TIMER>0
  462.       If Timer>MOLE_TIMER*100
  463.          POS_MOLE
  464.          MOLE_TIMER=0
  465.       End If 
  466.    End If 
  467.    If BAT_TIMER>0
  468.       If Timer>BAT_TIMER*100
  469.          POS_BAT
  470.          BAT_TIMER=0
  471.       End If 
  472.    End If 
  473.    If BONUS>0
  474.       If Timer>BONUS_TIMER
  475.          BONUS=BONUS-10
  476.          BONUS_TIMER=((Timer/100)+2)*100
  477.          Timer=(Timer/100)*100
  478.          Screen 1
  479.          Text 292,37,Str$(BONUS)+" "
  480.          Screen 0
  481.       End If 
  482.    End If 
  483. End Proc
  484. Procedure SETUP_BOBS
  485.    Screen 0
  486.    RAND_MOLE_DIRECTION
  487.    POS_MOLE
  488.    RAND_BAT_DIRECTION
  489.    POS_BAT
  490. End Proc
  491. Procedure PITS
  492.    Shared PIT_ACTIVE
  493.    If PIT_ACTIVE=0
  494.       A=Rnd(1000)
  495.       While A>990
  496.          Inc PIT_ACTIVE
  497.          X=(Rnd(640)/32)*32 : Y=(Rnd(400)/32)*32
  498.          If Zone(X+3,Y+3)=0
  499.             Bob 4,X,Y,
  500.             A$="L R2=5; A Z(5)+1,(55,100)(56,R2)(57,R2)(58,100)(57,R2)(56,R2)(55,R2)"
  501.             Amal 5,A$
  502.             Amal On 5
  503.          End If 
  504.          A=0
  505.       Wend 
  506.    End If 
  507. End Proc
  508. Procedure POS_BAT
  509.    FLAG=0
  510.    Repeat 
  511.       X_BAT=((Rnd(540)/32)*32)+96 : Y_BAT=((Rnd(200)/32)*32)+96
  512.       If Zone(X_BAT+3,Y_BAT+3)=0
  513.          Bob 6,X_BAT,Y_BAT,
  514.          Inc FLAG
  515.       End If 
  516.    Until FLAG>0
  517.    Channel 8 To Bob 6 : Rem bat anim 
  518.    Channel 9 To Bob 6 : Rem bat movement 
  519.    Amal 8,"A 0,(43,6)(44,6)(45,6)(44,6)"
  520.    Amal On 8
  521. End Proc
  522. Procedure MOVE_BAT
  523.    If BAT_TIMER<1
  524.       If Chanmv(9)=0
  525.          If Joy(1)>0
  526.             X=X Bob(10)-X Bob(6)
  527.             Y=Y Bob(10)-Y Bob(6)
  528.             X=Sgn(X)*X
  529.             Y=Sgn(Y)*Y
  530.             If Max(X,Y)=Y
  531.                If Y Bob(10)<Y Bob(6)
  532.                   BAT_DIRECTION=0
  533.                Else 
  534.                   BAT_DIRECTION=1
  535.                End If 
  536.             Else 
  537.                If X Bob(10)<X Bob(6)
  538.                   BAT_DIRECTION=2
  539.                Else 
  540.                   BAT_DIRECTION=3
  541.                End If 
  542.             End If 
  543.          End If 
  544.          If BAT_DIRECTION=0
  545.             If Zone(X Bob(6)+16,Y Bob(6)-16)>19 or Y Bob(6)<32
  546.                RAND_BAT_DIRECTION
  547.                Pop Proc
  548.             End If 
  549.             Amal 9,"M 0,-32,40"
  550.             Amal On 9
  551.          End If 
  552.          If BAT_DIRECTION=1
  553.             If Zone(X Bob(6)+16,Y Bob(6)+48)>19 or Y Bob(6)>323
  554.                RAND_BAT_DIRECTION
  555.                Pop Proc
  556.             End If 
  557.             Amal 9,"M 0,32,40"
  558.             Amal On 9
  559.          End If 
  560.          If BAT_DIRECTION=2
  561.             If Zone(X Bob(6)-16,Y Bob(6)+16)>19 or X Bob(6)<32
  562.                RAND_BAT_DIRECTION
  563.                Pop Proc
  564.             End If 
  565.             Amal 9,"M -32,0,40"
  566.             Amal On 9
  567.          End If 
  568.          If BAT_DIRECTION=3
  569.             If Zone(X Bob(6)+48,Y Bob(6)+16)>19 or X Bob(6)>600
  570.                RAND_BAT_DIRECTION
  571.                Pop Proc
  572.             End If 
  573.             Amal 9,"M 32,0,40"
  574.             Amal On 9
  575.          End If 
  576.       End If 
  577.    End If 
  578. End Proc
  579. Procedure RAND_BAT_DIRECTION
  580.    BAT_DIRECTION=Rnd(3)
  581. End Proc
  582. Procedure POS_MOLE
  583.    FLAG=0
  584.    Repeat 
  585.       X_MOLE=((Rnd(540)/32)*32)+96 : Y_MOLE=((Rnd(200)/32)*32)+96
  586.       If Zone(X_MOLE+3,Y_MOLE+3)=0
  587.          Bob 5,X_MOLE,Y_MOLE,
  588.          Inc FLAG
  589.       End If 
  590.    Until FLAG>0
  591.    Channel 6 To Bob 5 : Rem mole anim
  592.    Channel 7 To Bob 5 : Rem mole movement
  593.    Amal 6,"A 0,(39,10)(40,10)(41,10)(42,10)"
  594.    Amal On 6
  595. End Proc
  596. Procedure MOVE_MOLE
  597.    If MOLE_TIMER<1
  598.       If Chanmv(7)=0
  599.          If MOLE_DIRECTION=0
  600.             If Zone(X Bob(5)+16,Y Bob(5)-16)>19 or Y Bob(5)<32
  601.                RAND_MOLE_DIRECTION
  602.                Pop Proc
  603.             End If 
  604.             Amal 7,"M 0,-32,30"
  605.             Amal On 7
  606.          End If 
  607.          If MOLE_DIRECTION=1
  608.             If Zone(X Bob(5)+16,Y Bob(5)+48)>19 or Y Bob(5)>323
  609.                RAND_MOLE_DIRECTION
  610.                Pop Proc
  611.             End If 
  612.             Amal 7,"M 0,32,30"
  613.             Amal On 7
  614.          End If 
  615.          If MOLE_DIRECTION=2
  616.             If Zone(X Bob(5)-16,Y Bob(5)+16)>19 or X Bob(5)<32
  617.                RAND_MOLE_DIRECTION
  618.                Pop Proc
  619.             End If 
  620.             Amal 7,"M -32,0,30"
  621.             Amal On 7
  622.          End If 
  623.          If MOLE_DIRECTION=3
  624.             If Zone(X Bob(5)+48,Y Bob(5)+16)>19 or X Bob(5)>600
  625.                RAND_MOLE_DIRECTION
  626.                Pop Proc
  627.             End If 
  628.             Amal 7,"M 32,0,30"
  629.             Amal On 7
  630.          End If 
  631.       End If 
  632.    End If 
  633. End Proc
  634. Procedure RAND_MOLE_DIRECTION
  635.    MOLE_DIRECTION=Rnd(3)
  636. End Proc
  637. Procedure LEVEL_CONTROL
  638.    If LEVEL<5
  639.       Restore "LEVEL"+Mid$(Str$(LEVEL),2)
  640.    Else 
  641.       Restore LEVEL5
  642.    End If 
  643.    Read X_TRUCK,Y_TRUCK,TRUCK_IMAGE,TRUCK_AMAL$,BONUS,TITLE$
  644.    Bob 3,X_TRUCK,Y_TRUCK,TRUCK_IMAGE
  645.    Amal 4,TRUCK_AMAL$
  646.    Amal On 4
  647.    LEVEL1:
  648.    Data -32,-32,37,"",410,"Dig For That Gold"
  649.    LEVEL2:
  650.    Data 62,223,37,"S: M 480,0,160; M -480,0,160; J S;",510,"That Sodding BAT!!"
  651.    LEVEL3:
  652.    Data 62,0,37,"S: M 512,0,120; M -512,0,200; J S;",610,"Just a Bit Complex!"
  653.    LEVEL4:
  654.    Data 160,100,38,"S: M 0,155,50; M 0,-155,50; P; J S;",710,"  Gold or Bonus ?"
  655.    LEVEL5:
  656.    Data -32,-32,37,"",310," Randomised Level"
  657. End Proc
  658. Procedure J0YSTICK
  659.    Shared SP
  660.    If Jleft(1)<0 and X_DD>0
  661.       X1=X Bob(10)+3 : Y1=Y Bob(10)+5
  662.       X2=X Bob(10)+3 : Y2=Y Bob(10)+27
  663.       If Zone(X1,Y1)<42 and Zone(X2,Y2)<42
  664.          X_DD=X_DD-SP
  665.          DD_DIRECTION=2
  666.          DD_ANIM
  667.       End If 
  668.       Pop Proc
  669.    End If 
  670.    If Jright(1)<0 and X_DD<605
  671.       X1=X Bob(10)+29 : Y1=Y Bob(10)+5
  672.       X2=X Bob(10)+29 : Y2=Y Bob(10)+27
  673.       If Zone(X1,Y1)<42 and Zone(X2,Y2)<42
  674.          Add X_DD,SP
  675.          DD_DIRECTION=3
  676.          DD_ANIM
  677.       End If 
  678.       Pop Proc
  679.    End If 
  680.    If Jup(1)<0 and Y_DD>0
  681.       X1=X Bob(10)+6 : Y1=Y Bob(10)+3
  682.       X2=X Bob(10)+26 : Y2=Y Bob(10)+3
  683.       If Zone(X1,Y1)<42 and Zone(X2,Y2)<42
  684.          Y_DD=Y_DD-SP
  685.          DD_DIRECTION=0
  686.          DD_ANIM
  687.       End If 
  688.       Pop Proc
  689.    End If 
  690.    If Jdown(1)<0 and Y_DD<355
  691.       X1=X Bob(10)+6 : Y1=Y Bob(10)+29
  692.       X2=X Bob(10)+26 : Y2=Y Bob(10)+29
  693.       If Zone(X1,Y1)<42 and Zone(X2,Y2)<42
  694.          Add Y_DD,SP
  695.          DD_DIRECTION=1
  696.          DD_ANIM
  697.       End If 
  698.       Pop Proc
  699.    End If 
  700. End Proc
  701. Procedure F1RE_BUTTON
  702.    If DIGS>0
  703.       F1RE=Joy(1)
  704.       '  Fire & Up 
  705.       If F1RE=%10001
  706.          Z0NE=Zone(X Bob(10)+15,Y Bob(10))
  707.          If Z0NE>161
  708.             X=((X Bob(10)+15)/32)*32 : Y=((Y Bob(10)-15)/32)*32
  709.             Bar X,Y To X+31,Y+31
  710.             Paste Icon X,Y,10
  711.             Reset Zone Z0NE
  712.             Dec DIGS
  713.             Sam Play 1,2,5000
  714.          End If 
  715.       End If 
  716.       '  Fire & Down 
  717.       If F1RE=%10010
  718.          Z0NE=Zone(X Bob(10)+15,Y Bob(10)+31)
  719.          If Z0NE>161
  720.             X=((X Bob(10)+15)/32)*32 : Y=((Y Bob(10)+31)/32)*32
  721.             Bar X,Y To X+31,Y+31
  722.             Paste Icon X,Y,10
  723.             Reset Zone Z0NE
  724.             Dec DIGS
  725.             Sam Play 1,2,5000
  726.          End If 
  727.       End If 
  728.       '  Fire & Left   
  729.       If F1RE=%10100
  730.          Z0NE=Zone(X Bob(10),Y Bob(10)+15)
  731.          If Z0NE>161
  732.             X=((X Bob(10)-15)/32)*32 : Y=((Y Bob(10)+15)/32)*32
  733.             Bar X,Y To X+31,Y+31
  734.             Paste Icon X,Y,10
  735.             Reset Zone Z0NE
  736.             Dec DIGS
  737.             Sam Play 1,2,5000
  738.          End If 
  739.       End If 
  740.       '  Fire & Right
  741.       If F1RE=%11000
  742.          Z0NE=Zone(X Bob(10)+31,Y Bob(10)+15)
  743.          If Z0NE>161
  744.             X=((X Bob(10)+31)/32)*32 : Y=((Y Bob(10)+15)/32)*32
  745.             Bar X,Y To X+31,Y+31
  746.             Paste Icon X,Y,10
  747.             Reset Zone Z0NE
  748.             Dec DIGS
  749.             Sam Play 1,2,5000
  750.          End If 
  751.       End If 
  752.    End If 
  753. End Proc
  754. Procedure DD_ANIM
  755.    If DD_WRAP=0
  756.       If DD_FRAME=9
  757.          DD_WRAP=1
  758.          Dec DD_FRAME
  759.       End If 
  760.       Inc DD_FRAME
  761.    End If 
  762.    If DD_WRAP=1
  763.       If DD_FRAME=1
  764.          DD_WRAP=0
  765.          Inc DD_FRAME
  766.       End If 
  767.       Dec DD_FRAME
  768.    End If 
  769.    Bob 10,X_DD,Y_DD,DD_FRAME+DD_DIRECTION*9
  770. End Proc
  771. Procedure SPACE_BAR
  772.    If DYN_ACTIVE=0
  773.       DYN_ACTIVE=1
  774.       Dec DYNAMITE
  775.       X_DYN=X_DD+16 : Y_DYN=Y_DD+16
  776.       Bob 2,X_DYN,Y_DYN,48
  777.       DYN_ANIM$="L RC=0; A 1,(48,25)(49,25)(50,25)(51,25)(52,25)(53,25); F RC=0 T 150; N RC;"
  778.       DYN_ANIM$=DYN_ANIM$+"A 1,(59,3)(60,3)(61,3)(62,3)(63,3)(64,3)(65,3)(66,3)(67,3)(68,3)(69,3)(70,3)(71,3)(72,3)(73,3); F R3=1 T 46; N R3; L RC=0;"
  779.       Amal 3,DYN_ANIM$
  780.       Amal On 3
  781.       Sam Loop On 
  782.       Sam Play 2,2,6000
  783.    End If 
  784. End Proc
  785. Procedure X_PLOSION
  786.    If DYN_ACTIVE=1 and Amreg(2)>148
  787.       Sam Loop Off 
  788.       Boom 
  789.       DYN_ACTIVE=0
  790.       X1=((X_DYN/32)*32)-32 : Y1=((Y_DYN/32)*32)-32
  791.       For Y2=0 To 2
  792.          For X2=0 To 2
  793.             X=X1+X2*32 : Y=Y1+Y2*32
  794.             Z0NE=Zone(X+3,Y+3)
  795.             If Z0NE>101 and Z0NE<162 or Z0NE>21 and Z0NE<42
  796.                Bar X,Y To X+31,Y+31
  797.                Paste Icon X,Y,10
  798.                Reset Zone Z0NE
  799.             End If 
  800.          Next X2
  801.       Next Y2
  802.       Boom 
  803.    End If 
  804. End Proc
  805. Procedure DISPLAY_LEVEL
  806.    If LEVEL<5
  807.       GTMAP[LEVEL]
  808.    Else 
  809.       RAND_LEVEL
  810.    End If 
  811.    TAMEVIEW[0,0,20,12,XSIZE,YSIZE]
  812.    TAMEMAP[0,0,0]
  813.    Double Buffer 
  814.    LEVEL_CONTROL
  815.    Screen Open 2,320,100,4,Lowres
  816.    Screen Hide 
  817.    Screen Display 2,,100,,
  818.    Set Font 1
  819.    Set Text %110
  820.    Cls 0
  821.    _INTERMITION
  822.    Screen 0
  823.    Screen Show 
  824.    Screen Show 1
  825.    Screen To Front 1
  826.    Get Sprite Palette 
  827.    Ink 0
  828. End Proc
  829. Procedure RAND_LEVEL
  830.    Erase 6
  831.    Reserve As Work 6,260
  832.    Bload "DDlvl_1.MAP",6
  833.    For N=4 To 244
  834.       Poke(Start(6)+N),0
  835.    Next N
  836.    For N=1 To Rnd(10)+50
  837.       BLOCK[7]
  838.    Next N
  839.    For N=1 To Rnd(10)+50
  840.       BLOCK[8]
  841.    Next N
  842.    For N=1 To Rnd(20)+20
  843.       BLOCK[9]
  844.    Next N
  845.    For N=1 To Rnd(10)+5
  846.       BLOCK[11]
  847.    Next N
  848.    BLOCK[12]
  849.    BLOCK[13]
  850. End Proc
  851. Procedure BLOCK[T]
  852.    Repeat 
  853.       Z=Rnd(240)+4
  854.       FLAG=0
  855.       If Z<7 Then Inc FLAG
  856.       If Z>23 and Z<27 Then Inc FLAG
  857.       If Z>43 and Z<47 Then Inc FLAG
  858.    Until Peek(Start(6)+Z)=0 and FLAG=0
  859.    Poke(Start(6)+Z),T
  860. End Proc
  861. Rem _________________________________________________________________
  862. Rem
  863. Rem TAME Engine Routines 
  864. Rem use these in your own programs if you wish (see MAGIC FOREST)
  865. Rem
  866. Procedure GTMAP[M]
  867.    Rem  This loads in the levels map - M=level
  868.    Erase 6
  869.    Reserve As Work 6,260
  870.    Bload "DDlvl_"+Mid$(Str$(M),2)+".MAP",Start(6)
  871. End Proc
  872. Procedure TAMEVIEW[TX,TY,TW,TH,XS,YS]
  873.    Rem This routine sets up the window for TAME, and what size tiles you wish 
  874.    Rem to use 
  875.    Shared XSIZE,YSIZE,MAPX,MAPY,TAMEW,TAMEH,TLX,TLY,BRX,BRY
  876.    MAPX=Deek(Start(6)) : MAPY=Deek(Start(6)+2)
  877.    XSIZE=XS : YSIZE=YS
  878.    TLX=TX : TLY=TY
  879.    TAMEW=TW : TAMEH=TH
  880.    BRX=TLX+TW*XSIZE
  881.    BRY=TLY+TH*YSIZE
  882. End Proc
  883. Procedure TAMEMAP[S,X,Y]
  884.    Rem This routine draws the map in the window set by the TAMEVIEW procedure 
  885.    Rem on screen S, at map co-ordinates X,Y 
  886.    Shared T,XSIZE,YSIZE,MAPX,MAPY,TAMEW,TAMEH,TLX,TLY,BRX,BRY
  887.    A=0 : RAIL=0 : KEY=20 : D0OR=21 : GOLD=22 : GRANITE=42 : STONE=102 : MUD=162
  888.    Repeat 
  889.       B=0
  890.       Repeat 
  891.          T=1+Peek(Start(6)+4+((B+X) mod MAPX)+((A+Y) mod MAPY)*MAPX) mod 20
  892.          If T>1
  893.             Dec T
  894.             Paste Icon TLX+B*XSIZE,TLY+A*YSIZE,T
  895.             If T<3
  896.                Inc RAIL
  897.                TEMP_NO=RAIL
  898.             End If 
  899.             If T=11
  900.                TEMP_NO=GOLD
  901.                Inc GOLD
  902.             End If 
  903.             If T=12
  904.                TEMP_NO=KEY
  905.             End If 
  906.             If T=13
  907.                TEMP_NO=D0OR
  908.             End If 
  909.             If T>2 and T<7 or T=9
  910.                TEMP_NO=GRANITE
  911.                Inc GRANITE
  912.             End If 
  913.             If T=7
  914.                TEMP_NO=STONE
  915.                Inc STONE
  916.             End If 
  917.             If T=8
  918.                TEMP_NO=MUD
  919.                Inc MUD
  920.             End If 
  921.             Set Zone TEMP_NO,TLX+B*XSIZE,TLY+A*YSIZE To TLX+B*XSIZE+XSIZE,TLY+A*YSIZE+YSIZE
  922.          End If 
  923.          Inc B
  924.       Until B>=TAMEW
  925.       Inc A
  926.    Until A>=TAMEH
  927. End Proc