home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 025.lha / Lander < prev    next >
Text File  |  1987-04-02  |  15KB  |  447 lines

  1. mode%=1     'mode%=1 production, mode%=0 for debug
  2. 'Lunar Lander Game Program
  3. 'By: Brian Allston 3/20/86
  4. '
  5. start:
  6.    PRINT "Lunar Lander Game"
  7.    PRINT "Amiga BASIC version by:"
  8.    PRINT "Brian Allston      3/20/86"
  9.    PRINT " "
  10.    PRINT " "
  11.    PRINT " "
  12.    PRINT "          Attach amplifier and speakers for voice"
  13.    DIM moonscape.h%(641)
  14.    SAY(TRANSLATE$(""))
  15.    RANDOMIZE TIMER
  16.    GOSUB initscreen 
  17.    WIDTH 80
  18.    CLS
  19.    FOR i=1 TO 20
  20.       LOCATE i,i*2+10:PRINT"Lunar Lander"
  21.    NEXT i
  22.    IF mode%=0 THEN mode%=5
  23.    MENU mode%,0,1,"Options"
  24.    MENU mode%,1,1,"Start Mission"
  25.    MENU mode%,2,1,"Quit         "
  26.    MENU mode%,3,1,"Help         "
  27.    IF mode%<>1 THEN GOTO dmsave   
  28.    MENU 2,0,0,""         'disable default menus
  29.    MENU 3,0,0,""
  30.    MENU 4,0,0,""
  31.    dmsave:
  32.    RESTORE moonscape
  33.    FOR i=1 TO 640
  34.       READ moonscape.h%(i)          'Input horizon definition
  35.    NEXT i
  36.    CLS  
  37.    speech$="Welcome to Lunar Lander."
  38.    LOCATE 6,40-CINT(LEN(speech$)/2):PRINT speech$
  39.    SAY TRANSLATE$(speech$)    
  40.    speech$="The object of your mission is to make a perfect landing on your base." 
  41.    LOCATE 12,40-CINT(LEN(speech$)/2):PRINT speech$
  42.    SAY TRANSLATE$(speech$)  
  43.    RESTORE lander
  44.    ship$=""
  45.    FOR i=1 TO 62
  46.       READ ship.data%
  47.       ship$=ship$+CHR$(ship.data%)
  48.    NEXT i
  49.    speech$="Land quickly, softly, and use as little fuel as possible."
  50.    LOCATE 18,40-CINT(LEN(speech$)/2):PRINT speech$
  51.    SAY TRANSLATE$(speech$)
  52.    speech$="Use Options Menu to start mission."
  53.    COLOR 1,2:LOCATE 22,40-CINT(LEN(speech$)/2):PRINT speech$;:COLOR 1,0
  54.    SAY TRANSLATE$(speech$)
  55.    menucheck:
  56.       MENU ON
  57.       ON MENU GOSUB getoption
  58.       SLEEP      
  59.       GOTO menucheck
  60.    getoption:
  61.       OBJECT.OFF
  62.       IF MENU(0) <> mode% THEN GOTO nomenu     
  63.       moption%=MENU(1)
  64.       MENU OFF
  65.       IF moption%=0 THEN GOTO getoption
  66.       ON MENU GOSUB 0
  67.       ON moption%+1 GOTO nomenu,main,exit1,showhelp
  68.       nomenu:
  69.       RETURN
  70.    showhelp:
  71.       CLS
  72.       WINDOW 3,"Mission Objective",(20,20)-(600,130),0,1
  73.       WINDOW OUTPUT 3
  74.       LOCATE 1,1:COLOR 1,0
  75.       PRINT "   Your mission is to pilot your landing craft to a 'soft' landing"
  76.       PRINT "   on the lunar base.  Use your thrusters (use the left mouse"
  77.       PRINT "   button and cursor) on the control panel to accelerate the lander"
  78.       PRINT "   in the desired direction.  Your score is determined by combined"
  79.       PRINT "   speed, landing distance from base, fuel used, elapsed time."
  80.       PRINT ""
  81.       PRINT "   Hint: You always accelerate downward due to gravity and will "
  82.       PRINT "         only drift horizontally. Also, the lander will 'wrap-around'"
  83.       PRINT "         the side edges. So don't waste fuel on side thrust."
  84.       PRINT ""
  85.       PRINT "   Good luck!                Brian Allston (76515,1506)"
  86.       PRINT ""
  87.       COLOR 1,2:LOCATE 13,22:PRINT "Press left mouse button to continue.";:COLOR 1,0
  88.       keepopen:
  89.          IF MOUSE(0)=0 THEN GOTO keepopen
  90.       WINDOW OUTPUT 2   
  91.       WINDOW CLOSE 3
  92.       RETURN   
  93.    main:
  94.       GOSUB drawscreen        
  95.       GOSUB initlander
  96.       GOSUB updatedisplay
  97.       ON TIMER(.25) GOSUB updatevalues:TIMER ON
  98.       '
  99.       'Loop until lander touches the horizon
  100.       WHILE y&<horizon%
  101.          x&=OBJECT.X(1)
  102.          IF x&<6 OR x&>620 THEN
  103.             IF edgecheck<6 THEN 
  104.             border=-2
  105.             ELSE
  106.                border=-4
  107.             END IF
  108.             GOSUB edge
  109.          x&=OBJECT.X(1)
  110.          END IF
  111.          horizon%=moonscape.h%(x&)
  112.          y&=OBJECT.Y(1)+8
  113.          GOSUB updatedisplay
  114.      WEND
  115. '
  116. '   
  117. TIMER OFF
  118. 'Check for crash and compute score
  119. OBJECT.STOP 1
  120. computescore:
  121.    vterm=SQR(vx*vx+vy*vy)
  122.    xterm=ABS(basex-x&):IF xterm>305 THEN xterm=xterm-305
  123.    yterm=y-8
  124.    IF vterm>vcrash THEN 
  125.       IF OBJECT.Y(1)>150 THEN OBJECT.Y 1,140
  126.       SOUND WAIT
  127.       SOUND 180,40,180,0
  128.       SOUND 220,40,180,1
  129.       SOUND 260,40,180,2
  130.       SOUND 300,40,180,3
  131.       SOUND RESUME
  132.       yterm=OBJECT.Y(1)+8
  133.       xterm=OBJECT.X(1)+5
  134.       LINE (xterm,yterm)-(xterm-50,yterm-45),3
  135.       LINE (xterm,yterm)-(xterm+50,yterm-50),6
  136.       LINE (xterm,yterm)-(xterm-25,yterm-10),6
  137.       LINE (xterm,yterm)-(xterm+50,yterm-35),7
  138.       LINE (xterm,yterm)-(xterm-10,yterm-60),7
  139.       LINE (xterm,yterm)-(xterm+60,yterm-10),3
  140.       LINE (xterm,yterm)-(xterm-40,yterm-5),3
  141.       LINE (xterm,yterm)-(xterm+20,yterm-30),6
  142.       score&=0
  143.       landing$="You crashed!  There were no survivors."
  144.       landing1$="You crashed!  There were no survive ors."
  145.       GOTO displayscore
  146.    END IF
  147.    landing$="You made a "
  148.    landing1$=landing$
  149.    IF vterm>vcrash/2 THEN
  150.       landing$=landing$+"hard "
  151.       landing1$=landing1$+"hard "
  152.    ELSEIF vterm>vcrash/4 THEN
  153.       landing$=landing$+"soft "
  154.       landing1$=landing1$+"soft "
  155.    ELSE
  156.       landing$=landing$+"perfect "
  157.       landing1$=landing1$+"perfect "    
  158.    END IF
  159.    score1=score&   
  160.    landing$=landing$+"landing, "
  161.    landing1$=landing1$+"landing, "
  162.    IF xterm>100 THEN
  163.       landing$=landing$+"far from the base."
  164.       landing1$=landing1$+"far from the base."
  165.    ELSEIF xterm>20 THEN
  166.       landing$=landing$+"near to the base."
  167.       landing1$=landing1$+"near to the base."
  168.    ELSE
  169.       landing$=landing$+"right on the base.  Congratulations!"
  170.       landing1$=landing1$+"right on the base.  Congratulations"
  171.    END IF
  172.    score1%=CINT(10*(1-vterm/vcrash))+1
  173.    score2%=CINT(15*(1-xterm/310))+1
  174.    score3%=CINT(5*fuel/ifuel)+1
  175.    score4%=CINT(5/etime)+1
  176.    score&=score1%*score2%*score3%*score4%
  177.    displayscore:
  178.       COLOR 1,0       
  179.       LOCATE 8,40-CINT(LEN(landing$)/2):PRINT landing$                  
  180.       SAY TRANSLATE$(landing1$)
  181.       LOCATE 11,30:PRINT USING "Your score is: #####";score&
  182.    RETURN      
  183. '
  184. 'Update lander velocity based upon "thrusters"    
  185. updatevalues:
  186.    etime=etime+(1/120)
  187.    vy=vy+gravity
  188.    IF fuel=0 THEN GOTO noaccel
  189.    mousestat%=MOUSE(0)
  190.       mx=MOUSE(1):my=MOUSE(2)
  191.       IF mousestat%=0 THEN
  192.       IF oldthrust%<>0 THEN GOSUB clearthrust
  193.       GOTO noaccel
  194.       END IF
  195.    mousecheck:
  196.       IF mx>=296 AND mx<=325 THEN
  197.          IF my>=157 AND my<=170 THEN thrust%=1:vy=vy-2
  198.          IF my>=173 AND my<=186 THEN thrust%=2:vy=vy+2
  199.       ELSEIF my>=164 AND my<=177 THEN
  200.          IF mx>=260 AND mx<=290 THEN thrust%=3:vx=vx-6
  201.          IF mx>=331 AND mx<=361 THEN thrust%=4:vx=vx+6
  202.       END IF
  203.       IF oldthrust%<>thrust% THEN GOSUB clearthrust
  204.       IF thrust%=0 THEN GOTO noaccel
  205.    showthrust:     
  206.       COLOR 1,6
  207.       IF thrust%=1 THEN LINE (297,158)-(324,169),6,bf:LOCATE 21,39:PRINT "UP";
  208.       IF thrust%=2 THEN LINE (297,174)-(324,185),6,bf:LOCATE 23,39:PRINT "DN";
  209.       IF thrust%=3 THEN LINE (261,165)-(289,176),6,bf:LOCATE 22,34:PRINT "<-";
  210.       IF thrust%=4 THEN LINE (332,165)-(360,176),6,bf:LOCATE 22,43:PRINT "->";
  211.       oldthrust%=thrust%
  212.       COLOR 1,0          
  213.    updatefuel:
  214.       fuel=fuel-8.3
  215.       IF fuel<0 THEN fuel=0
  216.       GOTO noaccel
  217.    clearthrust:
  218.       IF oldthrust%=0 THEN RETURN
  219.       COLOR 1,0
  220.       IF oldthrust%=1 THEN LINE (297,158)-(324,169),0,bf:LOCATE 21,39:PRINT "UP";
  221.       IF oldthrust%=2 THEN LINE (297,174)-(324,185),0,bf:LOCATE 23,39:PRINT "DN";
  222.       IF oldthrust%=3 THEN LINE (261,165)-(289,176),0,bf:LOCATE 22,34:PRINT "<-";
  223.       IF oldthrust%=4 THEN LINE (332,165)-(360,176),0,bf:LOCATE 22,43:PRINT "->";
  224.       oldthrust%=thrust%
  225.       RETURN
  226.    noaccel:
  227.       OBJECT.VX 1,vx
  228.       OBJECT.VY 1,vy
  229.       OBJECT.START 1
  230.       thrust%=0:mousestat%=0  
  231.    RETURN    
  232. '
  233. 'Let lander "wrap-around" the left and right borders
  234. wraparound:
  235.    border=COLLISION(1)
  236. edge:   
  237.    IF border=-1 THEN OBJECT.Y 1,1:GOTO restart
  238.    IF border=-3 THEN OBJECT.STOP 1:RETURN
  239.    IF border=-2 THEN OBJECT.X 1,619:GOTO restart
  240.    IF border=-4 THEN OBJECT.X 1,6
  241.    restart:
  242.       OBJECT.START 1
  243.    RETURN
  244. '
  245. 'Update Display Values
  246. updatedisplay:
  247.    TIMER STOP
  248.    COLOR 1,2
  249.    LOCATE 21,3:PRINT USING " ####.#";vy*(-17.6);
  250.    LOCATE 23,3:PRINT USING " ####.#";vx*5.5;
  251.    LOCATE 21,69:PRINT USING " ####.#";(horizon%-y&)*17.6;
  252.    LOCATE 23,69:PRINT USING " ####.#";fuel;
  253.    COLOR 1,0
  254.    TIMER ON
  255.    RETURN
  256. '
  257. 'Initialize lander position, velocity, and fuel terms
  258. initlander:
  259.    gravity=.5
  260.    ifuel=400:fuel=ifuel
  261.    x&=CINT(RND*610)+5
  262.    y&=1
  263.    vx=12
  264.    IF RND<.5 THEN vx=vx*(-1)
  265.    vy=2
  266.    vcrash=20
  267.    OBJECT.SHAPE 1,ship$
  268.    OBJECT.X 1,x&   
  269.    OBJECT.Y 1,y&             
  270.    OBJECT.VX 1,vx
  271.    OBJECT.VY 1,vy
  272.    OBJECT.ON 1
  273.    OBJECT.START 1
  274.    ON COLLISION GOSUB wraparound
  275.    horizon%=moonscape.h%(x&)
  276.    COLLISION ON
  277.    RETURN
  278. '
  279. 'Initialize window and game display
  280. initscreen:
  281.    SCREEN 1,640,200,3,2          'Define window parameters
  282.    WINDOW 2,"Lunar Lander",,8,1
  283.    PALETTE 4,.8,.6,.53           'tan     --
  284.    PALETTE 5,.33,.87,0           'green     | _Additional
  285.    PALETTE 6,1,0,0               'red       |  Colors
  286.    PALETTE 7 ,1,1,.13            'yellow  --
  287.    RETURN
  288. '
  289. drawscreen:
  290.    COLOR 1,3                     'Draw flight display window
  291.    LINE (0,0)-(640,200),3,bf
  292.    LINE (5,0)-(625,150),2,bf     
  293.    FOR i=1 TO 50                 'Draw stars
  294.       x=INT(RND*620)+5
  295.       y=INT(RND*150)
  296.       PSET(x,y),1
  297.    NEXT i
  298.    CIRCLE (580,50),75,0        'draw ringed planet
  299.    LINE (5,0)-(625,150),0,b     
  300.    CIRCLE (580,50),85,0,2.6,6,1/12              
  301.    CIRCLE (580,50),110,0,2.25,6,1/12
  302.    CIRCLE (580,50),150,0,2.05,6,1/12
  303.    PAINT (494,50),7,0
  304.    PAINT (580,58),7,0
  305.    PAINT (465,50),6,0
  306.    PAINT (580,60),6,0
  307.    PAINT (580,50),0
  308.    PAINT (580,70),0
  309.    CIRCLE (580,50),85,2,2.65,6,1/12              
  310.    CIRCLE (580,50),110,2,2.3,6,1/12
  311.    CIRCLE (580,50),150,2,2.08,6,1/12
  312.    '
  313.    LINE (625,0)-(640,150),3,bf  'draw horizon
  314.    LINE (625,150)-(5,150),4
  315.    LINE (5,150)-(5,126),4
  316.    LINE (5,126)-(25,138),4
  317.    LINE (25,138)-(60,138),4
  318.    LINE (60,138)-(70,144),4
  319.    LINE (70,144)-(80,144),4
  320.    LINE (80,144)-(120,120),4
  321.    LINE (120,120)-(140,100),4
  322.    LINE (140,100)-(360,130),4
  323.    LINE (360,130)-(500,130),4
  324.    LINE (500,130)-(550,145),4
  325.    LINE (550,145)-(625,136),4
  326.    LINE (625,136)-(625,150),4
  327.    PAINT (6,148),4                'paint moonscape
  328.    'CIRCLE (20,140),7,2,1/25
  329.    'CIRCLE (130,130),15,2,1/25
  330.    LINE (5,0)-(625,150),2,b       'cover planet edge
  331.    '
  332.    basex=CINT(RND*600)+5               'randomly position base
  333.    basey=moonscape.h%(basex)
  334.    LINE (basex,basey)-STEP(15,6),6,bf
  335.    LINE (basex+1,basey-20)-STEP(13,22),2,bf
  336.    ' 
  337.    COLOR 1,3:           'Draw Instrument Panel
  338.    LOCATE 20,3:PRINT "V-SPEED";
  339.    LOCATE 22,3:PRINT "H-SPEED";
  340.    LOCATE 20,69:PRINT "Altitude";
  341.    LOCATE 22,69:PRINT "  Fuel ";
  342.    LINE (10,160)-(80,167),2,bf
  343.    LINE (10,176)-(80,184),2,bf
  344.    LINE (540,160)-(610,167),2,bf
  345.    LINE (540,176)-(610,184),2,bf
  346.    LINE (296,157)-(325,170),0,bf
  347.    LINE (296,173)-(325,186),0,bf
  348.    LINE (260,164)-(290,177),0,bf
  349.    LINE (331,164)-(361,177),0,bf
  350.    COLOR 1,0
  351.    LOCATE 21,39:PRINT "UP";
  352.    LOCATE 22,34:PRINT "<-";
  353.    LOCATE 22,43:PRINT "->";
  354.    LOCATE 23,39:PRINT "DN";
  355.    LINE (296,157)-(325,170),2,b
  356.    LINE (296,173)-(325,186),2,b
  357.    LINE (260,164)-(290,177),2,b
  358.    LINE (331,164)-(361,177),2,b
  359.    RETURN
  360. '
  361. 'End of program clean-up
  362. exit1:
  363.    TIMER OFF
  364.    COLLISION OFF
  365.    WINDOW CLOSE 1
  366.    MENU OFF
  367.    MENU RESET
  368.    OBJECT.OFF
  369.    SYSTEM
  370. '
  371. moonscape:                
  372. DATA 126, 126, 126, 126, 126, 127, 127, 128, 128, 129
  373. DATA 130, 130, 131, 131, 132, 133, 133, 134, 134, 135
  374. DATA 136, 136, 137, 137, 138, 138, 138, 138, 138, 138
  375. DATA 138, 138, 138, 138, 138, 138, 138, 138, 138, 138
  376. DATA 138, 138, 138, 138, 138, 138, 138, 138, 138, 138
  377. DATA 138, 138, 138, 138, 138, 138, 138, 138, 138, 138
  378. DATA 139, 139, 140, 140, 141, 142, 142, 143, 143, 144
  379. DATA 144, 144, 144, 144, 144, 144, 144, 144, 144, 144
  380. DATA 143, 143, 142, 142, 141, 140, 140, 139, 139, 138
  381. DATA 137, 137, 136, 136, 135, 134, 134, 133, 133, 132
  382. DATA 131, 131, 130, 130, 129, 128, 128, 127, 127, 126
  383. DATA 125, 125, 124, 124, 123, 122, 122, 121, 121, 120
  384. DATA 119, 118, 117, 116, 115, 114, 113, 112, 111, 110
  385. DATA 109, 108, 107, 106, 105, 104, 103, 102, 101, 100
  386. DATA 100, 100, 100, 101, 101, 101, 101, 101, 101, 101
  387. DATA 102, 102, 102, 102, 102, 102, 102, 102, 103, 103
  388. DATA 103, 103, 103, 103, 103, 104, 104, 104, 104, 104
  389. DATA 104, 104, 105, 105, 105, 105, 105, 105, 105, 105
  390. DATA 106, 106, 106, 106, 106, 106, 106, 107, 107, 107
  391. DATA 107, 107, 107, 107, 108, 108, 108, 108, 108, 108
  392. DATA 108, 108, 109, 109, 109, 109, 109, 109, 109, 110
  393. DATA 110, 110, 110, 110, 110, 110, 111, 111, 111, 111
  394. DATA 111, 111, 111, 111, 112, 112, 112, 112, 112, 112
  395. DATA 112, 113, 113, 113, 113, 113, 113, 113, 114, 114
  396. DATA 114, 114, 114, 114, 114, 114, 115, 115, 115, 115
  397. DATA 115, 115, 115, 116, 116, 116, 116, 116, 116, 116
  398. DATA 116, 117, 117, 117, 117, 117, 117, 117, 118, 118
  399. DATA 118, 118, 118, 118, 118, 119, 119, 119, 119, 119
  400. DATA 119, 119, 119, 120, 120, 120, 120, 120, 120, 120
  401. DATA 121, 121, 121, 121, 121, 121, 121, 122, 122, 122
  402. DATA 122, 122, 122, 122, 122, 123, 123, 123, 123, 123
  403. DATA 123, 123, 124, 124, 124, 124, 124, 124, 124, 125
  404. DATA 125, 125, 125, 125, 125, 125, 125, 126, 126, 126
  405. DATA 126, 126, 126, 126, 127, 127, 127, 127, 127, 127
  406. DATA 127, 128, 128, 128, 128, 128, 128, 128, 128, 129
  407. DATA 129, 129, 129, 129, 129, 129, 130, 130, 130, 130
  408. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  409. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  410. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  411. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  412. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  413. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  414. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  415. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  416. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  417. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  418. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  419. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  420. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  421. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  422. DATA 130, 131, 131, 131, 132, 132, 132, 132, 133, 133
  423. DATA 133, 134, 134, 134, 134, 135, 135, 135, 136, 136
  424. DATA 136, 137, 137, 137, 138, 138, 138, 138, 139, 139
  425. DATA 139, 140, 140, 140, 140, 141, 141, 141, 142, 142
  426. DATA 142, 143, 143, 143, 144, 144, 144, 144, 145, 145
  427. DATA 145, 145, 144, 144, 144, 143, 143, 143, 143, 142
  428. DATA 142, 142, 142, 141, 141, 141, 141, 140, 140, 140
  429. DATA 140, 139, 139, 139, 139, 138, 138, 138, 138, 137
  430. DATA 137, 137, 137, 136, 136, 136, 136, 135, 135, 135
  431. DATA 135, 134, 134, 134, 134, 133, 133, 133, 133, 132
  432. DATA 132, 132, 132, 131, 131, 131, 131, 130, 130, 130
  433. DATA 130, 129, 129, 129, 129, 128, 128, 128, 128, 127
  434. DATA 127, 127, 127, 126, 126, 126, 126, 126, 126, 126
  435. DATA 126, 126, 126, 126, 126, 126, 126, 126, 126, 126
  436. '
  437. lander:
  438. DATA   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
  439. DATA   0,   2,   0,   0,   0,  11,   0,   0,   0,   9
  440. DATA   0,  24,   0,   3,   0,   0,   4,   0,  14,   0
  441. DATA  10,   0,  10,   0,  10,   0,  31,   0,  31,   0
  442. DATA  63, 128,  64,  64,   0,   0,   0,   0,   4,   0
  443. DATA   4,   0,   4,   0,  14,   0,  14,   0,   0,   0
  444. DATA   0,   0
  445. '
  446. END
  447.