/*
** Name:      Sprite Example
** Author:    Paul Manias
** Copyright: DreamWorld Productons (c) 1996-1997.
** SAS/C:     1> sc Sprites.c link startup=LIB:gms.o data=far nostackcheck
** Dice:      1> dcc -l0 -mD gms.o Sprites.c -o Sprites
**
** This example shows you how to set up a 16 colour OCS sprite with a
** doubled X axis (32 pixels width).  Those with hardware experience will
** know that it takes 4 sprite banks to do this successfully in OCS, which
** leaves you with another 4 banks to do with what you will.  You can do
** this same demo in AGA with just 2 banks used.
** 
*/

#include <proto/games.h>

extern struct GMSBase *GMSBase;
APTR   PREFSNAME = DEFAULT;

ULONG Palette[] = {
   0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,
   0x000000,0x608080,0x406060,0x304040,0xC0C000,0x908000,0x807000,0x605000,
   0x10C020,0x005000,0xB000B0,0x600060,0xF02000,0x901000,0xB0B0B0,0xF0F0F0,
   0x00B0F0,0x006080,0x506080,0x90B0F0,0xF0F000,0xE0E000,0xB0A000,0x504000
};

void main(void)
{
  struct Sprite *Sparkie;
  struct GameScreen *GameScreen;
  APTR  SparkieData;
  UWORD Timer=0;
  ULONG ZBXY=0;

  if (SparkieData = SmartLoad("GMS:demos/data/RAW.Sparkie",0,MEM_VIDEO)) {
  
    if (GameScreen = AddScreenTags(TAGS_GAMESCREEN,NULL,
       GSA_Palette,Palette,
       GSA_AmtColours,32,
       GSA_Planes,1,
       GSA_Attrib,SPRITES|NOSCRBDR,
       TAGEND)) {
  
       if (Sparkie = InitSpriteTags(GameScreen,TAGS_SPRITE,NULL,
          SPA_Data,SparkieData,
          SPA_XCoord,100,
          SPA_YCoord,100,
          SPA_Width,16,
          SPA_Height,21,
          SPA_AmtColours,16,
          SPA_ColStart,16,
          SPA_Planes,2,
          SPA_ScrMode,LORES,
          SPA_Attrib,XLONG,
          TAGEND)) {

          UpdateSprite(GameScreen,Sparkie);
          ShowScreen(GameScreen);
  
          InitJoyPorts();
  
          while (!(ZBXY&MB_LMB)) {
  
             if (++Timer&0x1) {
                if (Sparkie->Frame == 5) Sparkie->Frame = 0;
                else Sparkie->Frame++;
             }
  
             ZBXY = ReadJoyPort(JPORT1,JT_ZBXY);
             Sparkie->XPos += GetX(ZBXY);
             Sparkie->YPos += GetY(ZBXY);
             WaitVBL();
             UpdateSprite(GameScreen, Sparkie);
          }
       FreeSprite(Sparkie);
       }
    DeleteScreen(GameScreen);
    }
  FreeMemBlock(SparkieData);
  }
}

