home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include <string.h>
-
- #include <exec/memory.h>
- #include <exec/types.h>
- #include <graphics/gfxbase.h>
-
- #include <clib/exec_protos.h>
- #include <clib/graphics_protos.h>
-
- #include "GameSmith:include/libraries/libraries.h"
- #include "GameSmith:include/libraries/libptrs.h"
- #include "GameSmith:GameSmith.h"
-
- /*-------------------------------------------------------------------------*/
- /* Function Prototypes */
-
- void parser(int,char **);
- int setup(void);
- void move_image(void);
- void check_bounds(void);
- int check_close(void);
- void cleanup(void);
- void free_arrays(void);
-
- /*-------------------------------------------------------------------------*/
-
- int cplx_cnt,swidth=320,sheight=200,smode=0,delay=0;
- int *x=NULL,*y=NULL,*speedx=NULL,*speedy=NULL,*bounce=NULL;
- char *file;
- int dlist; /* display list for anims */
-
- struct BitMap *bm3=NULL;
-
- struct anim_cplx *cplx;
-
- struct display_struct *display;
-
- /*-------------------------------------------------------------------------*/
-
- main(argc,argv)
- int argc;
- char *argv[];
-
- {
- int err,end=0;
-
- if (argc < 3)
- {
- printf("\nUSAGE: left_right {filename} [number of objects] ([HIRES] | [LACE]) [VB delay]\n");
- exit(01);
- }
- if (gs_open_libs(DOS|GRAPHICS,0))
- exit(02); /* if can't open libs, abort */
- parser(argc,argv); /* parse command line args */
- if (err=setup()) /* if couldn't get set up... abort program */
- {
- printf("\nsetup error %d\n",err);
- gs_close_libs(); /* close all libraries */
- exit(03);
- }
- Forbid();
- while (!end)
- {
- move_image();
- end=check_close(); /* end when user hits left mouse */
- }
- Permit();
- cleanup(); /* close & deallocate everything */
- gs_close_libs(); /* close all libraries */
- }
-
- /***************************************************************************/
-
- void parser(argc,argv)
- int argc;
- char *argv[];
-
- {
- file=argv[1]; /* remember file name */
- cplx_cnt=atoi(argv[2]); /* number of complexes running around screen */
- if (argc >= 4)
- {
- if (!(stricmp(argv[3],"HIRES"))) /* check for hires spec */
- {
- swidth=640;
- sheight=400;
- if (GfxBase->LibNode.lib_Version >= 36)
- {
- if (ModeNotAvailable(DBLNTSCHIRESFF_KEY))
- smode=HIRES|LACE;
- else
- smode=DBLNTSCHIRESFF_KEY;
- }
- else
- smode=HIRES|LACE;
- }
- else if (!(stricmp(argv[3],"SUPER"))) /* check for superhires */
- {
- if (GfxBase->LibNode.lib_Version >= 36)
- {
- if (ModeNotAvailable(SUPER72_MONITOR_ID | SUPERLACE_KEY))
- {
- swidth=640;
- sheight=400;
- smode=HIRES|LACE;
- }
- else
- {
- smode=SUPER72_MONITOR_ID | SUPERLACE_KEY;
- swidth=800;
- sheight=600;
- }
- }
- else
- {
- swidth=640;
- sheight=400;
- smode=HIRES|LACE;
- }
- }
- else if (!(stricmp(argv[3],"HAM"))) /* check for HAM mode */
- {
- smode|=HAM_KEY;
- }
- }
- if (argc >= 5)
- {
- if (!(stricmp(argv[4],"HAM"))) /* check for HAM mode */
- {
- smode|=HAM_KEY;
- }
- else
- {
- delay=atoi(argv[4]); /* number vertical blank delay intervals between anim updates */
- }
- }
- }
-
- /***************************************************************************/
-
- setup()
-
- {
- int cnt,seq,depth=0;
- struct anim_struct *anim;
- struct blit_struct *img;
-
- struct anim_load_struct load =
- {
- NULL, /* name of anim file to load */
- NULL, /* ptr to anim upon return */
- NULL, /* ptr to attachment array specification upon return */
- NULL, /* ptr to color map upon return */
- 0, /* # entries in the color map */
- 8, /* # bits per color map entry */
- 0, /* type (filled). 0 = anim, 1 = complex */
- 1, /* # objects to allocate in array */
- 0 /* flags */
- };
-
- if (!(x=(int *)malloc(cplx_cnt*sizeof(int))))
- return(-1);
- if (!(y=(int *)malloc(cplx_cnt*sizeof(int))))
- {
- free_arrays();
- return(-1);
- }
- if (!(speedx=(int *)malloc(cplx_cnt*sizeof(int))))
- {
- free_arrays();
- return(-1);
- }
- if (!(speedy=(int *)malloc(cplx_cnt*sizeof(int))))
- {
- free_arrays();
- return(-1);
- }
- if (!(bounce=(int *)malloc(cplx_cnt*sizeof(int))))
- {
- free_arrays();
- return(-1);
- }
- for (cnt=0; cnt < cplx_cnt; cnt++)
- bounce[cnt]=0;
- load.filename=file; /* user specified anim file name */
- load.array_elements=cplx_cnt; /* user specified # elves */
- if (gs_load_anim(&load))
- {
- free_arrays();
- return(-1);
- }
- cplx=load.anim_ptr.cplx; /* ptr to anim complex */
- if (load.type != 1) /* make sure it's an anim complex */
- {
- free_arrays();
- if (load.type == 0)
- gs_free_anim((struct anim_struct *)cplx,cplx_cnt);
- return(-2);
- }
- anim = cplx[0].list; /* ptr to 1st anim in complex */
- while (anim)
- {
- img = anim->list; /* ptr to 1st image in anim sequence */
- while (img) /* find max depth of anim */
- {
- if (img->depth > depth)
- depth = img->depth;
- if (img->next == img) /* avoid infinite loop */
- img=NULL;
- else
- img=img->next;
- }
- anim=anim->cplx_next; /* next anim in complex */
- }
- if (!(display=gs_display(swidth,sheight,depth,smode,GSV_DOUBLE,load.cmap)))
- {
- free_arrays();
- FreeMem(load.cmap,load.cmap_entries*sizeof(long));
- gs_free_cplx(cplx,cplx_cnt);
- return(-3);
- }
- FreeMem(load.cmap,load.cmap_entries*sizeof(long));
- if ((dlist=gs_get_display_list()) < 0)
- {
- cleanup();
- return(-4);
- }
- bm3=gs_get_bitmap(depth,swidth,sheight,0);
- gs_init_anim(dlist,display->vp->bitmap1,display->vp->bitmap2,bm3);
- gs_set_anim_bounds(dlist,0,0,swidth-1,sheight-1);
- for (cnt=0; cnt < cplx_cnt; cnt++)
- {
- x[cnt] = gs_random(swidth); /* random X,Y coords */
- y[cnt] = gs_random(sheight);
- while ((speedx[cnt] = gs_random(11)) < 3);
- while ((speedy[cnt] = gs_random(4)) == 0);
- if (cnt&1)
- {
- speedx[cnt]=-speedx[cnt];
- speedy[cnt]=-speedy[cnt];
- seq=0; /* left moving anim */
- }
- else
- seq=1; /* right moving anim */
- if (bm3) /* if restore bitmap */
- {
- anim=cplx[cnt].list; /* ptr to 1st anim object in complex */
- while (anim)
- {
- anim->flags|=ANIM_SAVE_BG; /* use fastest display method */
- if (anim->flags & ANIM_CLEAR)
- anim->flags ^= ANIM_CLEAR;
- if (anim->flags & ANIM_COPY)
- anim->flags ^= ANIM_COPY;
- anim=anim->cplx_next; /* next anim object in complex */
- }
- }
- if (gs_add_anim_cplx(dlist,&cplx[cnt],x[cnt],y[cnt],seq,cplx[cnt].list->prio))
- {
- cleanup(); /* release everything */
- return(-5); /* return failure */
- }
- }
- gs_draw_anims(dlist);
- check_bounds();
- gs_next_anim_page(dlist);
- gs_show_display(display,1);
- gs_flip_display(display,1);
- gs_open_vb_timer();
- return(0);
- }
-
- /***************************************************************************/
-
- void move_image()
-
- /* move and animate the graphic objects on the screen */
-
- {
- int cnt;
-
- if (gs_vb_time() < delay)
- return;
- gs_vb_timer_reset();
- for (cnt=0; cnt < cplx_cnt; cnt++)
- {
- x[cnt]+=speedx[cnt];
- y[cnt]+=speedy[cnt];
- gs_anim_cplx(&cplx[cnt],x[cnt],y[cnt]);
- }
- while (display->flags & GSV_FLIP); /* while display not flipped */
- gs_draw_anims(dlist); /* draw them anim objects! */
- check_bounds(); /* keep a watch on them pesky keeblers */
- gs_next_anim_page(dlist); /* tell anim sys to use other bitmap */
- gs_flip_display(display,1); /* switch to other display, sync */
- }
-
- /***************************************************************************/
-
- void check_bounds()
-
- {
- int cnt;
-
- for (cnt=0; cnt < cplx_cnt; cnt++)
- {
- if (cplx[cnt].anim->flags & ANIM_BOUNDS_X1)
- {
- x[cnt]=cplx[cnt].anim->x;
- speedx[cnt]=-speedx[cnt];
- gs_set_cplx_seq(&cplx[cnt],1,x[cnt],y[cnt]); /* move right */
- }
- else if (cplx[cnt].anim->flags & ANIM_BOUNDS_X2)
- {
- x[cnt]=cplx[cnt].anim->x;
- speedx[cnt]=-speedx[cnt];
- gs_set_cplx_seq(&cplx[cnt],0,x[cnt],y[cnt]); /* move left */
- }
- if ((cplx[cnt].anim->flags & (ANIM_BOUNDS_Y1|ANIM_BOUNDS_Y2)) && (!(bounce[cnt])))
- {
- y[cnt]=cplx[cnt].anim->y;
- speedy[cnt]=-speedy[cnt];
- bounce[cnt]=1; /* don't get "stuck" on top or bottom */
- }
- else
- bounce[cnt]=0;
- }
- }
-
- /***************************************************************************/
-
- int check_close()
-
- /* check for user input */
-
- {
- if (gs_joystick(0) & (JOY_BUTTON1|JOY_BUTTON2)) /* IF (mouse button pressed) */
- return(1); /* ..time to wrap up */
- return(0); /* ELSE (keep going) */
- }
-
- /***************************************************************************/
-
- void cleanup()
-
- /* release all resources and memory */
-
- {
- if (dlist > -1)
- gs_free_display_list(dlist);
- free_arrays();
- gs_free_cplx(cplx,cplx_cnt);
- gs_remove_display(display);
- gs_close_vb_timer();
- }
-
- /***************************************************************************/
-
- void free_arrays()
-
- {
- if (bounce)
- free(bounce);
- if (speedy)
- free(speedy);
- if (speedx)
- free(speedx);
- if (y)
- free(y);
- if (x)
- free(x); /* free up control arrays */
- if (bm3)
- gs_free_bitmap(bm3);
- }
-