/*
** Mirror Demo
** -----------
** Demo of the mirroring effect.  When this effect is combined with a
** decrease in palette values at the same line, you can create the illusion of
** water.
** 
** Use the mouse to move the mirror around. LMB exits.
*/

#include <proto/exec.h>
#include <proto/games.h>
#include <exec/memory.h>

struct GMSBase *GMSBase;
extern struct ExecBase *SysBase;

#define AMT_PLANES 5

UWORD Palette[] =
{
     0x0000,0x0130,0x0FCB,0x0FA9,0x0D88,0x0965,0x0644,0x0211,
     0x0400,0x0444,0x0FF0,0x0432,0x0CC0,0x0150,0x0501,0x0880,
     0x0261,0x0271,0x0382,0x0492,0x05A3,0x05B4,0x0677,0x06C4,
     0x0788,0x09AA,0x0BCC,0x0801,0x0901,0x0A02,0x0701,0x0601
};

UWORD WaterPalette[] =
{
     0x0000,0x0010,0x0765,0x0754,0x0644,0x0432,0x0322,0x0100,
     0x0200,0x0222,0x0770,0x0211,0x0660,0x0020,0x0200,0x0440,
     0x0130,0x0130,0x0141,0x0241,0x0251,0x0252,0x0333,0x0362,
     0x0344,0x0455,0x0666,0x0400,0x0400,0x0501,0x0300,0x0300
};

ULONG RasterList[] =
{
     WAITLINE(190),
     MIRROR,
     NEWPALETTE(0,32,WaterPalette),
     RASTEND
};

struct GameScreen GameScreen =
{
     GSV1,               /* Structure version */
     0,0,0,              /* Screen_Mem1,2,3 */
     0,                  /* ScreenLink */
     Palette,            /* Adress of palette */
     RasterList,         /* Address of rasterlist */
     0,                  /* Amount of colours */
     320,256,            /* Screeen Width, Height */
     336/8,256,          /* Picture Width/8, Height */
     AMT_PLANES,         /* Amount of bitplanes */
     0,0,                /* X/Y screen offset */
     0,0,                /* X/Y picture offset */
     HSCROLL|VSCROLL,    /* Special attributes */
     LORES|COL12BIT,     /* Screen mode */
     INTERLEAVED,        /* Screen type */
     0                   /* Reserved */
};

struct Picture MirrorPic =
{
     PCV1,           /* Version header */
     0,              /* Destination */
     336/8,256,      /* Width, Height */
     AMT_PLANES,     /* Amount of planes */
     32,             /* Amount of colours */
     Palette,        /* Palette */
     LORES|COL12BIT, /* Screen mode */
     INTERLEAVED,    /* Destination */
     0,              /* Parameters */
     "GAMESLIB:data/IFF.Pic336" 
};

/*=========================================================================*/

void main(void)
{
   ULONG mousestat;
   if (GMSBase = (struct GMSBase *) OpenLibrary("games.library", 0)) {
      SetUserPrefs(0);
      if (Add_Screen(&GameScreen) == NULL)
      {
         MirrorPic.Data = GameScreen.MemPtr1;
         LoadPic(&MirrorPic);

         Show_Screen(&GameScreen);
         InitJoyPorts();

         do
         {
            mousestat = Read_Mouse(JPORT1);
            GameScreen.PicXOffset += (BYTE)(mousestat >> 8);
            GameScreen.PicYOffset += (BYTE)(mousestat);
            if (GameScreen.PicXOffset < 0) GameScreen.PicXOffset = 0;
            if (GameScreen.PicXOffset > 16) GameScreen.PicXOffset = 16;
            if (GameScreen.PicYOffset < 0) GameScreen.PicYOffset = 0;
            if (GameScreen.PicYOffset > 255-190) GameScreen.PicYOffset = 255-190;
            Move_Picture(&GameScreen);
            Wait_OSVBL();
         } while (!(mousestat & MB_LMB));

      Delete_Screen(&GameScreen);
      }
   CloseLibrary((struct Library *)GMSBase);
   }
}

/*=========================================================================*/
