/*
	SetCPU V1.60
	by Dave Haynie, April 13, 1990
	Released to the Public Domain

	COOLHAND MODULE

	This module contains the code used to display a cool looking 
	KickStart prompt hand on the screen.
*/

#include "setcpu.h"

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

/* This is the KickStart hand design as in the A1000.  Only, Intuition makes
   it considerably easier to build than they way the Kernel ROM does it. */
   
/* Define the vectors.  The hand is a drawing composed of a series of line
   vectors.  Intuition provides a handy structure, called a boarder, that'll
   render this whole mess with a single function call. */

static WORD vect1[] = {  0,  0, 23,  0, 23, 22, 78, 22, 78,  0, 90,  0,101, 11,
                       101, 83, 92, 83, 92, 45, 29, 45, 27, 43, 18, 43, 17, 45,
                        10, 45, 10, 54,  0, 61,  0,  0 };
static WORD vect2[] = {  0,  0,  0,-62, 93,-62,105,-50,105, 23, 53, 23, 53, 28,
                        49, 36, 45, 41, 41, 44, 35, 53, 27, 57, 27, 68,-23, 68,
                       -23, 37,-24, 37,-24,  9,-20,  3,-13, -3,-12, -7, -8,-14,
                        -3,-17,  0,-18,  0,-18, -3,-16, -7,-14,-11, -7,-12, -3,
                       -19,  3,-23,  9,-23, 36,-22, 37,-22, 67,  7, 67,  7, 46,
                        15, 46, 19, 44, 19, 23, 17, 20, 17, 10, 32, -3, 32,-15,
                        29,-17, 26,-17, 29,-14, 29, -7, 28, -6, 21, -6, 18, -9,
                         9, -2, -3,  4,-15, 13,-15, 12, -3,  3, -7,  2,-10, -1,
                        -7,  1, -3,  2,  0,  0 };
static WORD vect3[] = {  0,  0,  2, -7, 10, -6, 11, -3, 11,  4,  4,  4,  0,  0 };
static WORD vect4[] = {  0,  0,  0,-10, 15,-23, 15,-35, 74,-35, 74,  2,  1,  2,
                         0, -2 };
static WORD vect5[] = {  0,  0, 51,  0, 51, 21,  0, 21,  0,  0 };
static WORD vect6[] = {  0,  0, 11,  0, 11, 14,  0, 14,  0,  0 };
static WORD vect7[] = {  0,  0,  7,  0,  7, 12,  0, 12,  0,  0 };
static WORD vect8[] = {  0,  0,  3,  0,  3,  2,  0,  6,  0,  0 };
static WORD vect9[] = {  0,  0,  0,-20,  7,-20, 12,-25, 12,-34, 16,-32, 24,-32,
                        24,-30, 28,-25, 32,-25, 32,-23, 26,-14, 18,-11, 18,  0,
                         0,  0 };
static WORD vect10[] = { 0,  0,  0,  5,  5,  2,  0,  0 };
static WORD vect11[] = { 0,  0, -4,  2, -4, -3, 17, -3,  7,  7,  6,  7,  8,  5,
                         3,  0,  0,  0 };

static WORD vect12[] = { 0,  0,  7,  0,  7,  5,  3, 13,  0, 17, -5, 18, -8, 18,
                       -11, 14,-11, 11,  0,  0 };

static WORD vect13[] = { 0,  0,  0,  3,  2,  6,  2,  6,  8,  5,  9,  2,  5, -1,
                         0,  0 };
static WORD vect14[] = { 0,  0,  8,  2, 10, -1,  6, -5,  3, -5,  0, -3,  0,  0 };
static WORD vect15[] = { 0,  0, 11, 11, 11, 83 };

static struct Border HandLines[] = {
   { 105, 51,1,0,JAM1,18, &vect1[0], &HandLines[1] },
   { 103,112,1,0,JAM1,59, &vect2[0], &HandLines[2] },
   { 120,101,1,0,JAM1, 7, &vect3[0], &HandLines[3] },
   { 121,132,1,0,JAM1, 8, &vect4[0], &HandLines[4] },
   { 130, 51,1,0,JAM1, 5, &vect5[0], &HandLines[5] },
   { 166, 54,1,0,JAM1, 5, &vect6[0], &HandLines[6] },
   { 168, 55,1,0,JAM1, 5, &vect7[0], &HandLines[7] },
   { 117, 97,1,0,JAM1, 5, &vect8[0], &HandLines[8] },
   { 111,179,1,0,JAM1,15, &vect9[0], &HandLines[9] },
   { 123,135,1,0,JAM1, 4,&vect10[0],&HandLines[10] },
   { 127,138,1,0,JAM1, 9,&vect11[0],&HandLines[11] },
   { 148,135,1,0,JAM1,10,&vect12[0],&HandLines[12] },
   { 138,146,1,0,JAM1, 8,&vect13[0],&HandLines[13] },
   { 124,144,1,0,JAM1, 7,&vect14[0],&HandLines[14] },   
   { 196, 51,1,0,JAM1, 3,&vect15[0],NULL },
};

/* This is a list of area fills to perform; the first number is the "A" pen
   to set, the next two numbers are the screen position to start filling
   from. */

static WORD FillList[][3] = {
   { 2, 107,109 }, { 3, 132, 71 }, { 2, 169, 66 }, { 1, 104, 51 },
   { 1, 129, 51 }, { 1, 167, 55 }, { 1, 176, 67 }, { 1, 182, 55 },
   { 1, 196,134 }, { 1, 145,136 }, { 1, 116, 97 }
};

#define FILLCNT	11

/* Finally, I've got a few images to render, which I do using the standard
   Intuition Image structures. */

UWORD image0[] = {	/* AMIGA */
   0x1f9f,0xfe3f,0xff77,0xfe7c, 0x070c,0xef8f,0x1e71,0xdc30,
   0x07f8,0xe7ce,0x1cf3,0x1fe0, 0x0731,0xf3ce,0x1df6,0x1cc0,
   0x0760,0x03dc,0x3ffc,0x1d80, 0x07c0,0x879c,0x3f78,0x1f00,
   0x0780,0xcf78,0x7e78,0x1e00, 0x0700,0xfeff,0xfc7c,0x1c00,
   0x1001,0x8220,0x4050,0x0004, 0x0404,0x8889,0x1210,0x5010,
   0x0408,0x2448,0x1090,0x1020, 0x0410,0x1042,0x0510,0x1040,
   0x0420,0x0050,0x2690,0x1080, 0x0440,0x0484,0x0900,0x1100,
   0x0480,0x4960,0x4208,0x1200, 0x0500,0x0683,0x8404,0x1400,
};

UWORD image1[] = {	/* Kick */
   0xc71f,0x1e63,0x8000, 0x6631,0x8c63,0x0000, 0x3e01,0x8c33,0x0000, 
   0x6631,0x8c1f,0x0000, 0xc61f,0x0e33,0x0000, 0x0600,0x0063,0x0000,
   0x0700,0x0c63,0x8000
};

UWORD image2[] = {	/* Start */
   0x703c,0xdc38,0x3e00, 0x9818,0x664c,0x6000, 0x1998,0x780c,0x3c00,
   0x19b8,0x600c,0x0600, 0x7cdc,0x3c3e,0x7c00, 0x1800,0x000c,0x0000,
   0x1000,0x0008,0x0000
};

struct Image NameImage[] = {
   { 126,122,64,8,2,&image0[0],3,0,&NameImage[1] },
   { 144,112,48,7,1,&image1[0],2,0,&NameImage[2] },
   { 140,102,48,7,1,&image2[0],2,0,NULL }   
};

/* Here's the color scheme. */

static WORD coolColor[] = { 0x0fff,0x0000,0x077c,0x0bbb };

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

/* This section contains data for the mechanics of the CoolHand. */

static struct NewScreen newScreen = {
   0,0,320,200,2,0,1,0,CUSTOMSCREEN,NULL,NULL,NULL,NULL
};

static struct NewWindow newWindow = {
   0,0,320,200,2,0,0,BORDERLESS|ACTIVATE,NULL,NULL,NULL,NULL,NULL,0,0,0,0,
   CUSTOMSCREEN
};

static struct Screen	*coolScreen;
static struct Window	*coolWindow, *coolShade;

struct GfxBase		*GfxBase;
struct IntuitionBase	*IntuitionBase;

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

/* This is the main section.  Since I consider the CoolHand prompt the end
   of this life and the beginning of the next, I'm not going to worry about
   freeing stuff up. */
   
struct Window *CoolHand() {
   struct RastPort *rp;
   struct ViewPort *vp;
   struct Image *image;
   LONG size;
   UWORD i,*bits,*pointer;
   BOOL ok = TRUE;

   GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0L);
   IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0L);
   if (!GfxBase || !IntuitionBase) return;
   if (!(coolScreen = OpenScreen(&newScreen))) return;
   ShowTitle(coolScreen,0L);
   LoadRGB4(vp = &coolScreen->ViewPort,&coolColor[0],4L);
   newWindow.Screen = coolScreen;
   pointer = (UWORD *)AllocMem(64L,MEMF_CHIP|MEMF_CLEAR);
   if (!(coolShade = OpenWindow(&newWindow))) return;
   if (!(coolWindow = OpenWindow(&newWindow))) return;
   WindowToFront(coolShade);
   SetPointer(coolWindow,pointer,2L,2L,0L,0L);
   Delay(25L);
   DrawBorder(rp = coolWindow->RPort,&HandLines[0],0L,0L);

   SetOPen(rp,1L);
   for (i = 0; i < FILLCNT; ++i) {
      SetAPen(rp,(long)FillList[i][0]);
      Flood(rp,0L,(long)FillList[i][1],(long)FillList[i][2]);
   }
   for (image = &NameImage[0]; image; image = image->NextImage) {
      size = (LONG) (((image->Width+15)/16)*image->Height)*2*image->Depth;
      movmem((char *)image->ImageData,
             (char *)(bits = (UWORD *)AllocMem(size,MEMF_CHIP)),
             (int)size);
      image->ImageData = bits;
   }
   DrawImage(rp,&NameImage[0],0L,0L);
   CloseWindow(coolShade);
   return coolWindow;
}
