home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / game / moonrocks.lha / MoonRocks / game.c < prev    next >
C/C++ Source or Header  |  1994-04-14  |  34KB  |  1,270 lines

  1. /*
  2.  * MOON ROCKS by Alan Bland.  This is an example game using the
  3.  * GameSmith Development System.  You are free to use portions of
  4.  * this source code for any purpose whatsoever.  This isn't
  5.  * necessarily the best way to use GDS for this type of game,
  6.  * but it shows usage of many of the components of GDS (anims,
  7.  * anim complexes, sounds, scrolling background, multiple viewports,
  8.  * RastPort usage, background collision detection).
  9.  *
  10.  * This game won't work on an OCS Amiga because of the large
  11.  * scrolling superbitmap.  It may also require 1 meg of chip ram.
  12.  *
  13.  * The elvis animation is based on the "tiny elvis" public domain
  14.  * screen hack for Microsoft Windows.  I changed it around quite
  15.  * a bit to reduce the color palette and to make different dancing
  16.  * motions from the original.
  17.  *
  18.  * Call CYBERMIGA BBS at 1-303-939-9923.  Lots of Amiga files!
  19.  */
  20.  
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <string.h>
  24. #include <fcntl.h>
  25. #include <math.h>
  26. #include <intuition/intuition.h>
  27. #include <exec/memory.h>
  28. #include <exec/types.h>
  29. #include <graphics/gfx.h>
  30. #include <graphics/gfxbase.h>
  31.  
  32. #include <clib/exec_protos.h>
  33. #include <clib/graphics_protos.h>
  34. #include <clib/intuition_protos.h>
  35.  
  36. #include "GameSmith:GameSmith.h"
  37. #include "GameSmith:include/libraries/libptrs.h"
  38. #include "GameSmith:include/proto/all_regargs.h"
  39.  
  40. /* header file for anim complexes */
  41. #include "lc.h"
  42. #include "rs.h"
  43.  
  44. #define DDEPTH  3
  45. #define NUM_COLORS 8
  46.  
  47. #define VP2_HEIGHT 19
  48. #define VP2_DEPTH 3
  49. #define VP2_NUM_COLORS 8
  50.  
  51. #define DWIDTH 320
  52. #define DHEIGHT (200-VP2_HEIGHT-3)
  53. #define DISP_MODE 0
  54.  
  55. #define X_SCROLLPOS (DWIDTH/3)
  56. #define Y_SCROLLTOP (DHEIGHT/4)
  57. #define Y_SCROLLBOT (DHEIGHT/2)
  58.  
  59. /* this defines the vertical position below which the spacecraft
  60.  * can collide with background objects.  see main loop comments.
  61.  */
  62. #define GROUND_THRESHOLD (bmheight-52)
  63.  
  64. /* this is how close (pixels) we must land to the target to win the game */
  65. #define CLOSE_ENOUGH 250
  66.  
  67. #define MAX_FUEL 3000
  68. #define LOW_FUEL 300
  69.  
  70. /* physical constants */
  71. #define MAX_ALTITUDE 70000.0
  72. #define MAX_RANGE 50000.0
  73. #define GRAVITY 5.0
  74. #define THRUST 10.0
  75. #define SAFE_SPEED 200.0
  76.  
  77. /* To be strictly accurate, I think this should be 60 for NTSC, 50 for PAL */
  78. #define TICKS_PER_SEC 60
  79.  
  80. /* joystick responsiveness - set to 0 for fastest */
  81. #define JOY_INTERVAL 3
  82.  
  83. /* how often to animate the rock star */
  84. #define DANCE_DELAY 5
  85. unsigned char time_to_dance;
  86. short dance_time;
  87. unsigned char rockstar_visible;   /* is he visible? */
  88. unsigned long rockstar_time;      /* next time that he changes animation */
  89. unsigned char allow_rockstar;     /* allow him to materialize */
  90. /*
  91.  * The VP2 bitmap has several different control panel images which we
  92.  * scroll into view as necessary.  The top image is the normal panel.
  93.  * These constants define the scroll offset for each image.
  94.  */
  95. #define VP_PAUSED  VP2_HEIGHT
  96. #define VP_NOWHERE (VP2_HEIGHT*2)
  97. #define VP_VISIBLE (VP2_HEIGHT*3)
  98. #define VP_CRASHED (VP2_HEIGHT*4)
  99. #define VP_SUCCESS (VP2_HEIGHT*5)
  100.  
  101.  
  102. unsigned long lunar_cmap[NUM_COLORS];
  103. unsigned long vp2_cmap[VP2_NUM_COLORS];
  104.  
  105. /* need a copper list to turn off sprites */
  106. unsigned short copper_list[] = {
  107.     UC_WAIT, 0, 0, UC_NOSPRITES, UC_END
  108. };
  109.  
  110. struct copper_struct copper = 
  111.     {
  112.     copper_list,
  113.     NULL,
  114.     NULL
  115.     };
  116. /*
  117.  * vp is the viewport for the main viewing area.
  118.  * vp2 is the control panel at the bottom of the screen.
  119.  */
  120.  
  121. struct gs_viewport vp2 = {
  122.     NULL,                /* ptr to next viewport */
  123.     vp2_cmap,                /* ptr to color table */
  124.     VP2_NUM_COLORS,            /* number of colors in table */
  125.     &copper,                /* ptr to user copper list */
  126.     VP2_HEIGHT,DWIDTH,VP2_DEPTH,    /* height, width, depth */
  127.     0,0,                /* bmheight, bmwidth */
  128.     DHEIGHT+2,0,            /* top & left viewport offsets */
  129.     0,0,                /* X & Y bitmap offsets */
  130.     0,                    /* flags */
  131.     NULL,NULL,                /* 2.xx & above compatibility stuff */
  132.     NULL,NULL,                /* bitmap pointers */
  133.     NULL,                /* future expansion */
  134.     0,0,0,0                /* display clip (use nominal) */
  135. };
  136.  
  137. struct gs_viewport vp = {
  138.     &vp2,                /* ptr to next viewport */
  139.     lunar_cmap,                /* ptr to color table */
  140.     NUM_COLORS,                /* number of colors in table */
  141.     NULL,                /* ptr to user copper list */
  142.     DHEIGHT,DWIDTH,DDEPTH,        /* height, width, depth */
  143.     0,0,                /* bmheight, bmwidth */
  144.     0,0,                /* top & left viewport offsets */
  145.     0,0,                /* X & Y bitmap offsets */
  146.     0,                    /* flags */
  147.     NULL,NULL,                /* 2.xx & above compatibility stuff */
  148.     NULL,NULL,                /* bitmap pointers */
  149.     NULL,                /* future expansion */
  150.     0,0,0,0                /* display clip (use nominal) */
  151. };
  152.  
  153. struct display_struct lunar_display = {
  154.     NULL,                /* ptr to previous display view */
  155.     NULL,NULL,                /* 2.xx & above compatibility stuff */
  156.     0,0,                /* X and Y display offsets (1.3 style) */
  157.     DISP_MODE,                /* display mode ID */
  158.     GSV_DOUBLE|GSV_SCROLLABLE,        /* flags (double buffered, scrollable) */
  159.     &vp,                /* ptr to 1st viewport */
  160.     NULL                /* future expansion */
  161. };
  162.  
  163. struct anim_cplx *lem;            /* the spacecraft anim complex */
  164. struct anim_cplx *rockstar;             /* the rock star anim complex */
  165. struct display_struct *display;        /* points at lunar_display if it got created ok */
  166. struct Interrupt *scroller=NULL;    /* interrupt handler for smooth scrolling */
  167. int dlist=-1;                /* display list used with anim system */
  168. int bmwidth;
  169. int bmheight;
  170. struct RastPort rp;            /* RastPort for writing text to the control panel */
  171. struct BitMap *cp_bitmaps[2];        /* need to double-buffer bitmaps for RastPort */
  172. struct TextAttr sysfont = {        /* control panel will be topaz.8 */
  173.    "topaz.font", 8, 0, 0
  174. };
  175. struct TextFont *myfont;
  176.  
  177. short elapsed_mins;
  178. short elapsed_secs;
  179. short elapsed_ticks;
  180.  
  181. /*
  182.  * The MED module uses channels 0 and 1.  Sound effects are on 2 and 3
  183.  * except for the PING sound, which is only played without music so it's
  184.  * on one of the music channels.
  185.  */
  186. #include "libproto.h"
  187. struct MMD0 *tune;
  188. struct Library *MEDPlayerBase;
  189.    
  190. /*
  191.  * structures and channel assignments for each sound.
  192.  */
  193. #define THRUST_CHANNEL CHANNEL2
  194. #define WHOOP_CHANNEL  CHANNEL3
  195. #define PING_CHANNEL   CHANNEL1
  196. #define FILL_CHANNEL   CHANNEL3
  197. #define KABOOM_CHANNEL CHANNEL2
  198. #define LANDED_CHANNEL CHANNEL3
  199.  
  200. struct sound_struct thrust;
  201. struct sound_struct whoop;
  202. struct sound_struct kaboom;
  203. struct sound_struct landed;
  204. struct sound_struct ping;
  205. struct sound_struct fill;
  206.  
  207. /* the "lc" anim complex contains zillions of short anims showing the
  208.    spacecraft at various rotation angles (increments of 15 degrees),
  209.    with and without flames. the "lc_flame" array lists the anims with
  210.    flames in clockwise rotation order.  "lc_noflame" lists the anims
  211.    without flames. */
  212.  
  213. #define LC_ANIM_COUNT 24
  214.  
  215. short lc_flame[LC_ANIM_COUNT] = {
  216. FLAME00, FLAME15, FLAME30, FLAME45, FLAME60, FLAME75,
  217. FLAME90, FLAME105, FLAME120, FLAME135, FLAME150, FLAME165,
  218. FLAME180, FLAME195, FLAME210, FLAME225, FLAME240, FLAME255,
  219. FLAME270, FLAME285, FLAME300, FLAME315, FLAME330, FLAME345
  220. };
  221. short lc_noflame[LC_ANIM_COUNT] = {
  222. LEM00, LEM15, LEM30, LEM45, LEM60, LEM75,
  223. LEM90, LEM105, LEM120, LEM135, LEM150, LEM165,
  224. LEM180, LEM195, LEM210, LEM225, LEM240, LEM255,
  225. LEM270, LEM285, LEM300, LEM315, LEM330, LEM345
  226. };
  227.  
  228. /* sines and cosines are pre-computed for each 15 degree rotational
  229.    position.  this makes the game fast enough to run on an old
  230.    68000 Amiga without a math chip. */
  231.  
  232. double sinval[LC_ANIM_COUNT] = {
  233. -1.000000, -0.966168, -0.866519, -0.707840, -0.500941, -0.259916,
  234. 0.000000, 0.258771, 0.499914, 0.707002, 0.865927, 0.965862,
  235. 1.000000, 0.966015, 0.866223, 0.707421, 0.500428, 0.259344,
  236. 0.000593, -0.258199, -0.499401, -0.706583, -0.865630, -0.965708
  237. };
  238.  
  239. double cosval[LC_ANIM_COUNT] = {
  240. -0.000889, 0.257913, 0.499144, 0.706373, 0.865482, 0.965631,
  241. 1.000000, 0.965939, 0.866075, 0.707212, 0.500171, 0.259058,
  242. 0.000296, -0.258485, -0.499658, -0.706792, -0.865778, -0.965785,
  243. -1.000000, -0.966092, -0.866371, -0.707630, -0.500684, -0.259630
  244. };
  245.  
  246.  
  247. /* The "craft" structure defines the current physical attributes of
  248.    the spacecraft. */
  249.  
  250. struct {
  251.     int fuel;        /* fuel remaining */
  252.     int index;       /* array index into lc_flame/lc_noflame which indicates
  253.             the current rotation of the spac