/* _______________________________________________________________________ */

/* demo.c main module for the example program */

#define  ALLOCATE_GLOBALS

#include <ram:general.h>

#include <ram:demo.h>

extern struct Image Image1;

extern struct Image Image2;

struct SimpleSprite sprite;

WORD g_sprite_number;


main(void)

{           
                           
WORD x=XSTART, y=YSTART;

if (begin_block()==TRUE) exit(FALSE); /* grab required resources or quit */

LoadRGB4(global_viewport_p,&colourtable,32); ScreenToFront(global_screen_p); 

DrawImage(global_rastport_p,&Image1,0,0); /* Draw top of background */

DrawImage(global_rastport_p,&Image2,0,118); /* Draw bottom of background */

DrawImage(global_rastport_p,&my_name_image,20,200); /* some text */

MoveSprite(global_viewport_p,&sprite,x,y); /* position sprite */

/* now clear gameport device... */

global_gameport_IO_request_p->io_Command=CMD_CLEAR;

global_gameport_IO_request_p->io_Flags=IOF_QUICK;

DoIO(global_gameport_IO_request_p);
  
/* all we need to do now is collect joystick events... */

global_exit_flag=FALSE;

do {
   
   global_gameport_IO_request_p->io_Command=GPD_READEVENT;

   global_gameport_IO_request_p->io_Length=sizeof(struct InputEvent);;

   global_gameport_IO_request_p->io_Data=(APTR)&input_event;

   SendIO(global_gameport_IO_request_p); /* asynchronous */

   Wait(1<<global_gameport_message_port_p->mp_SigBit);
   
   GetMsg(global_gameport_message_port_p);


   switch(input_event.ie_Class)

       {

        /* rough and ready sprite positioning code using 'magic numbers'
           for boundary conditions - OK for example purposes but all
           this sort of stuff should really be #defined... */

        case IECLASS_RAWMOUSE: x=x+8*input_event.ie_X; /* ie_X MACRO! */
                               y=y+5*input_event.ie_Y; /* ie_Y MACRO! */
                               if(x<0) x=0; if(x>304) x=304;
                               if(y<0) y=0; if(y>232) y=232; 
                               MoveSprite(global_viewport_p,&sprite,x,y);
                               break;

        default:   break;

       }
       
if(input_event.ie_Code==IECODE_LBUTTON) global_exit_flag=TRUE;

}while(!global_exit_flag);

end_block(); /* Logical end of program */

}

/* _______________________________________________________________________ */

BOOL begin_block(void)

{   
    
UBYTE i,j; 

BOOL error_flag=FALSE;

for (i=1;i<=g_resource_vector[0];i++)

      { error_flag=allocate_resource(g_resource_vector[i]);

        if (error_flag==TRUE)

            { for (j=i-1;j>0;j--){deallocate_resource(g_resource_vector[j]);}

              i=g_resource_vector[0]+1; /* force exit from 'i' loop */

            }
      }

return(error_flag);

}

/* _______________________________________________________________________ */

void end_block(void)

{

UBYTE i;

for(i=g_resource_vector[0];i>0;i--){deallocate_resource(g_resource_vector[i]);}

}
/* _______________________________________________________________________ */

BOOL allocate_resource( UBYTE function_number)

{

BOOL error_flag=FALSE;

switch (function_number) {

         case OPEN_INTUITION_LIBRARY:

                  if(!(IntuitionBase=(struct IntuitionBase *)

                  OpenLibrary("intuition.library",INTUITION_VERSION)))

                   {error_flag=TRUE;}

                  break;


         case OPEN_GRAPHICS_LIBRARY:

                  if(!(GfxBase=(struct GfxBase *)

                  OpenLibrary("graphics.library",GRAPHICS_VERSION)))

                   {error_flag=TRUE;}

                  break;


         case OPEN_CUSTOM_SCREEN:

                  if(!(global_screen_p=(struct Screen *)OpenScreen(&NewScreen)))

                   {error_flag=TRUE;}

                   else {

                        global_viewport_p=&global_screen_p->ViewPort;
                        global_rastport_p->GelsInfo->sprRsrvd=0x03;

                        }

                   break;


         case  OPEN_WINDOW:

                  NewWindow.Screen=global_screen_p;

                  if(!(global_window_p=(struct Window *)OpenWindow(&NewWindow)))

                   {error_flag=TRUE;}

                   else {global_rastport_p=global_window_p->RPort;}

                   break;


         case  GET_SPRITE:  if((g_sprite_number=
                            GetSprite(&sprite,SPRITE_NUMBER))==-1)
                            {error_flag=TRUE;}
                             break;
			     

         case INSTALL_SPRITE:  sprite.x=XSTART; sprite.y=YSTART; 
                               sprite.height=SPRITE_HEIGHT;
                               ChangeSprite(global_viewport_p, 
                               &sprite, sprite_data);
                               break;


         case CREATE_REPLY_PORT1:  if(!(global_gameport_message_port_p=
                                   (struct Port *)CreatePort("game_port",0))) 
                                   error_flag=TRUE;
                                   break;
                                   

         case CREATE_REQUEST_BLOCK1: if(!(global_gameport_IO_request_p=
                                     (struct IOStdReq *)  
                                     CreateStdIO(global_gameport_message_port_p)))
                                     error_flag=TRUE;
                                     break;


         case OPEN_GAMEPORT_DEVICE:  if(OpenDevice("gameport.device",1,
                                     global_gameport_IO_request_p,0))
                                     error_flag=TRUE;
                                     break;   

         
         case SET_CONTROLLER_TYPE:   
         global_gameport_IO_request_p->io_Command=GPD_ASKCTYPE;
         global_gameport_IO_request_p->io_Flags=IOF_QUICK;
         global_gameport_IO_request_p->io_Length=1;
         global_gameport_IO_request_p->io_Data=(APTR)&global_controller_type;
         DoIO(global_gameport_IO_request_p);

         if(global_controller_type==GPCT_NOCONTROLLER)         
           {
           global_controller_type=GPCT_RELJOYSTICK; 
           global_gameport_IO_request_p->io_Command=GPD_SETCTYPE;
           global_gameport_IO_request_p->io_Flags=IOF_QUICK;
           global_gameport_IO_request_p->io_Length=1;
           global_gameport_IO_request_p->io_Data=(APTR)&global_controller_type;
           DoIO(global_gameport_IO_request_p);
           }
         else error_flag=TRUE;
         break;

         case SET_GAMEPORT_TRIGGER:
              global_gameport_IO_request_p->io_Command=GPD_SETTRIGGER;
              global_gameport_IO_request_p->io_Flags=IOF_QUICK;
              global_gameport_IO_request_p->io_Length=(LONG)
                                            sizeof(struct GamePortTrigger);
              global_gameport_IO_request_p->io_Data=(APTR)&gameport_trigger;
              DoIO(global_gameport_IO_request_p);
              break;

         
         default: error_flag=TRUE; break;

                         }
return(error_flag);

}

/* ______________________________________________________________________ */

void deallocate_resource(UBYTE function_number)

{

switch (function_number) {

      case OPEN_INTUITION_LIBRARY:  CloseLibrary(IntuitionBase); break;

      case OPEN_GRAPHICS_LIBRARY:   CloseLibrary(GfxBase); break;

      case OPEN_CUSTOM_SCREEN:      CloseScreen(global_screen_p); break;

      case OPEN_WINDOW:             CloseWindow(global_window_p); break;

      case GET_SPRITE:              MoveSprite(NULL,&sprite,320,0);
                                    FreeSprite(g_sprite_number); break;
                                  
      case INSTALL_SPRITE:          break;

      case CREATE_REPLY_PORT1:      DeletePort(global_gameport_message_port_p);
                                    break;
                                    
      case CREATE_REQUEST_BLOCK1:   DeleteStdIO(global_gameport_IO_request_p);
                                    break;


      case OPEN_GAMEPORT_DEVICE:    CloseDevice(global_gameport_IO_request_p);
                                    break;

      case SET_CONTROLLER_TYPE:   
              global_controller_type=GPCT_NOCONTROLLER;
              global_gameport_IO_request_p->io_Command=GPD_SETCTYPE;
              global_gameport_IO_request_p->io_Flags=IOF_QUICK;
              global_gameport_IO_request_p->io_Length=1;
              global_gameport_IO_request_p->io_Data=(APTR)&global_controller_type;
              DoIO(global_gameport_IO_request_p);
              break;


              case SET_GAMEPORT_TRIGGER:       break;


                 default:                      break;

                         }

}

/* ______________________________________________________________________ */



