/*
 * MKSoft SnakePit (c) 1988
 *
 * Screen, Window, and Requester definitions  (Plus gadgets & menus)
 */

#define	Snake_Windows_c	1

#include	"Snake.h"

/* These are the gadget ID definitions */
#define	gACCEPT		255

#define	gLEVEL_UP	201
#define	gLEVEL_DN	202

#define	gKEY_UP		203
#define	gKEY_DN		204
#define	gKEY_LF		205
#define	gKEY_RT		206
#define	gKEY_BASE	gKEY_UP

#define	gCONTINUE	211
#define	gABORT		gCONTINUE+1
#define	gQUIT		gABORT+1

#define	gESC		254

#define	gBACKSPACE	8
#define	gCR		13

#define	RAW_LF		0x4F
#define	RAW_RT		0x4E
#define	RAW_LF_UP	(0x80 | 0x4F)
#define	RAW_RT_UP	(0x80 | 0x4E)
#define	RAW_SP_UP	(0x80 | 0x40)
#define	RAW_CR_UP	(0x80 | 0x44)
#define	RAW_EN_UP	(0x80 | 0x43)
#define	RAW_C_UP	(0x80 | 0x33)
#define	RAW_A_UP	(0x80 | 0x20)
#define	RAW_Q_UP	(0x80 | 0x10)

static	short	SelectLevel		= 1;
static	UBYTE	Level_Text[10]		= "Level:xxx";
static	UBYTE	Lives_Text[10]		= "Lives:xxx";
static	UBYTE	Score_Text[16]		= "Score:xxxxxxxxx";
static	UBYTE	SelectLevelText[4]	= " 1";

static	struct	Screen	*MyScreen=NULL;
	struct	Window	*MyWindow=NULL;

static struct TextAttr TOPAZ80 = {(STRPTR)"topaz.font",TOPAZ_EIGHTY,0,0};
static struct TextAttr TOPAZ60 = {(STRPTR)"topaz.font",TOPAZ_SIXTY,0,0};

static UBYTE Title_Text[]="SnakePit © 1988 - MKSoft Development";

static struct NewScreen NewScreenStructure = {0,0,320,200,5,1,0,NULL,CUSTOMSCREEN|SCREENBEHIND,&TOPAZ80,Title_Text,NULL,NULL};

static USHORT Palette[32] = {
				0x0000,0x0EEE,0x0FCD,0x0F77,0x0F00,0x0A00,0x0600,0x0FC9,
				0x0FB7,0x0F80,0x0B50,0x0630,0x0FFC,0x0FF7,0x07C5,0x0097,
				0x0650,0x0CFC,0x07F7,0x00E0,0x0580,0x0170,0x0CCF,0x077F,
				0x000F,0x000A,0x0006,0x0FCF,0x0F7F,0x0F0F,0x070A,0x0606
			    };

static struct IntuiText MainIText0 = {1,0,JAM1,19,0,&TOPAZ80,(UBYTE *)"End Edit",NULL};
static struct IntuiText MainITextA = {7,1,JAM1,19,0,&TOPAZ80,(UBYTE *)"Erase",NULL};
static struct IntuiText MainIText1 = {7,1,JAM1,0,0,&TOPAZ80,(UBYTE *)"Clear",NULL};
static struct IntuiText MainIText2 = {7,1,JAM1,0,0,&TOPAZ80,(UBYTE *)"Save",NULL};
static struct IntuiText MainIText3 = {7,1,JAM1,0,0,&TOPAZ80,(UBYTE *)"Load",NULL};
static struct IntuiText MainIText4 = {13,0,JAM1,19,0,&TOPAZ80,(UBYTE *)"Level",NULL};
static struct IntuiText MainIText5 = {21,1,JAM1,19,0,&TOPAZ60,(UBYTE *)"9",NULL};
static struct IntuiText MainIText6 = {21,1,JAM1,19,0,&TOPAZ60,(UBYTE *)"8",NULL};
static struct IntuiText MainIText7 = {21,1,JAM1,19,0,&TOPAZ60,(UBYTE *)"7",NULL};
static struct IntuiText MainIText8 = {21,1,JAM1,19,0,&TOPAZ60,(UBYTE *)"6",NULL};
static struct IntuiText MainIText9 = {21,1,JAM1,19,0,&TOPAZ60,(UBYTE *)"5",NULL};
static struct IntuiText MainIText10= {21,1,JAM1,19,0,&TOPAZ60,(UBYTE *)"4",NULL};
static struct IntuiText MainIText11= {21,1,JAM1,19,0,&TOPAZ60,(UBYTE *)"3",NULL};
static struct IntuiText MainIText12= {21,1,JAM1,19,0,&TOPAZ60,(UBYTE *)"2",NULL};
static struct IntuiText MainIText13= {21,1,JAM1,19,0,&TOPAZ60,(UBYTE *)"1",NULL};
static struct IntuiText MainIText14= {2,26,JAM2,2,0,&TOPAZ60,ScoreList[7].str,NULL};
static struct IntuiText MainIText15= {2,26,JAM2,2,0,&TOPAZ60,ScoreList[6].str,NULL};
static struct IntuiText MainIText16= {2,26,JAM2,2,0,&TOPAZ60,ScoreList[5].str,NULL};
static struct IntuiText MainIText17= {2,26,JAM2,2,0,&TOPAZ60,ScoreList[4].str,NULL};
static struct IntuiText MainIText18= {2,26,JAM2,2,0,&TOPAZ60,ScoreList[3].str,NULL};
static struct IntuiText MainIText19= {2,26,JAM2,2,0,&TOPAZ60,ScoreList[2].str,NULL};
static struct IntuiText MainIText20= {2,26,JAM2,2,0,&TOPAZ60,ScoreList[1].str,NULL};
static struct IntuiText MainIText21= {2,26,JAM2,2,0,&TOPAZ60,ScoreList[0].str,NULL};
static struct IntuiText MainIText22= {31,0,JAM1,0,0,&TOPAZ80,(UBYTE *)"High Scores",NULL};
static struct IntuiText MainIText23= {9,1,JAM1,0,0,&TOPAZ80,(UBYTE *)"Quit",NULL};
static struct IntuiText MainIText30= {21,1,JAM1,0,0,&TOPAZ80,(UBYTE *)"Sound On/Off",NULL};
static struct IntuiText MainIText31= {21,1,JAM1,0,0,&TOPAZ80,(UBYTE *)"Drums On/Off",NULL};
static struct IntuiText MainIText24= {30,1,JAM1,0,0,&TOPAZ80,(UBYTE *)"Edit",NULL};
static struct IntuiText MainIText25= {13,1,JAM1,0,0,&TOPAZ80,(UBYTE *)"Define Keys",NULL};
static struct IntuiText MainIText26= {10,1,JAM1,0,0,&TOPAZ80,(UBYTE *)"Play",NULL};

static struct IntuiText SelectLevelIText30 = {18,26,JAM2,30,-17,&TOPAZ60,SelectLevelText,NULL};

static struct IntuiText SelectKeysIText34 = {14,26,JAM2,73,-57,&TOPAZ60,KeyList[gKEY_RT-gKEY_BASE].str,NULL};
static struct IntuiText SelectKeysIText33 = {14,26,JAM2,-16,-57,&TOPAZ60,KeyList[gKEY_LF-gKEY_BASE].str,&SelectKeysIText34};
static struct IntuiText SelectKeysIText32 = {14,26,JAM2,28,-16,&TOPAZ60,KeyList[gKEY_DN-gKEY_BASE].str,&SelectKeysIText33};
static struct IntuiText SelectKeysIText31 = {14,26,JAM2,28,-97,&TOPAZ60,KeyList[gKEY_UP-gKEY_BASE].str,&SelectKeysIText32};

static struct IntuiText HighScoresIText42 = {2,5,JAM2,-16,-14,&TOPAZ80,ScoreList[7].str,NULL};
static struct IntuiText HighScoresIText41 = {2,5,JAM2,-16,-26,&TOPAZ80,ScoreList[6].str,&HighScoresIText42};
static struct IntuiText HighScoresIText40 = {2,5,JAM2,-16,-38,&TOPAZ80,ScoreList[5].str,&HighScoresIText41};
static struct IntuiText HighScoresIText39 = {2,5,JAM2,-16,-50,&TOPAZ80,ScoreList[4].str,&HighScoresIText40};
static struct IntuiText HighScoresIText38 = {2,5,JAM2,-16,-62,&TOPAZ80,ScoreList[3].str,&HighScoresIText39};
static struct IntuiText HighScoresIText37 = {2,5,JAM2,-16,-74,&TOPAZ80,ScoreList[2].str,&HighScoresIText38};
static struct IntuiText HighScoresIText36 = {2,5,JAM2,-16,-86,&TOPAZ80,ScoreList[1].str,&HighScoresIText37};
static struct IntuiText HighScoresIText35 = {2,5,JAM2,-16,-98,&TOPAZ80,ScoreList[0].str,&HighScoresIText36};

static struct IntuiText MainIText29= {24,0,JAM2,102,193,&TOPAZ80,Score_Text,NULL};
static struct IntuiText MainIText28= {15,0,JAM2,248,193,&TOPAZ80,Lives_Text,&MainIText29};
static struct IntuiText MainIText27= {5,0,JAM2,0,193,&TOPAZ80,Level_Text,&MainIText28};

#define MainIntuiTextList MainIText27

/* This files contains the 8x8 images for the snake screen... */
#include	"Snake_Parts.h"

static struct MenuItem MainSubItem3 = {NULL,52,8,80,8,ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP,0,(APTR)&MainIText1,NULL,'C',NULL,MENUNULL};
static struct MenuItem MainSubItem2 = {&MainSubItem3,52,0,80,8,ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP,0,(APTR)&MainIText2,NULL,'S',NULL,MENUNULL};
static struct MenuItem MainSubItem1 = {&MainSubItem2,52,-8,80,8,ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP,0,(APTR)&MainIText3,NULL,'L',NULL,MENUNULL};

static struct IntuiText Copyright1= {13,25,JAM2,0,0,&TOPAZ80,(UBYTE *)"     SnakePit     ",NULL};
static struct IntuiText Copyright2= {13,25,JAM2,0,0,&TOPAZ80,(UBYTE *)" Copyright © 1988 ",NULL};
static struct IntuiText Copyright3= {13,25,JAM2,0,0,&TOPAZ80,(UBYTE *)"        by        ",NULL};
static struct IntuiText Copyright4= {13,25,JAM2,0,0,&TOPAZ80,(UBYTE *)"MKSoft Development",NULL};

static struct MenuItem MainSubItem15= {NULL,132,57,144,8,ITEMTEXT|ITEMENABLED|HIGHNONE,0,(APTR)&Copyright4,NULL,NULL,NULL,MENUNULL};
static struct MenuItem MainSubItem14= {&MainSubItem15,132,49,144,8,ITEMTEXT|ITEMENABLED|HIGHNONE,0,(APTR)&Copyright3,NULL,NULL,NULL,MENUNULL};
static struct MenuItem MainSubItem13= {&MainSubItem14,132,41,144,8,ITEMTEXT|ITEMENABLED|HIGHNONE,0,(APTR)&Copyright2,NULL,NULL,NULL,MENUNULL};
static struct MenuItem MainSubItem12= {&MainSubItem13,132,33,144,8,ITEMTEXT|ITEMENABLED|HIGHNONE,0,(APTR)&Copyright1,NULL,NULL,NULL,MENUNULL};
static struct MenuItem MainSubItem11= {&MainSubItem12,132,24,144,9,ITEMTEXT|ITEMENABLED|HIGHNONE,0,(APTR)&MainIText14,NULL,NULL,NULL,MENUNULL};
static struct MenuItem MainSubItem10= {&MainSubItem11,132,16,144,8,ITEMTEXT|ITEMENABLED|HIGHNONE,0,(APTR)&MainIText15,NULL,NULL,NULL,MENUNULL};
static struct MenuItem MainSubItem9 = {&MainSubItem10,132,8,144,8,ITEMTEXT|ITEMENABLED|HIGHNONE,0,(APTR)&MainIText16,NULL,NULL,NULL,MENUNULL};
static struct MenuItem MainSubItem8 = {&MainSubItem9,132,0,144,8,ITEMTEXT|ITEMENABLED|HIGHNONE,0,(APTR)&MainIText17,NULL,NULL,NULL,MENUNULL};
static struct MenuItem MainSubItem7 = {&MainSubItem8,132,-8,144,8,ITEMTEXT|ITEMENABLED|HIGHNONE,0,(APTR)&MainIText18,NULL,NULL,NULL,MENUNULL};
static struct MenuItem MainSubItem6 = {&MainSubItem7,132,-16,144,8,ITEMTEXT|ITEMENABLED|HIGHNONE,0,(APTR)&MainIText19,NULL,NULL,NULL,MENUNULL};
static struct MenuItem MainSubItem5 = {&MainSubItem6,132,-24,144,8,ITEMTEXT|ITEMENABLED|HIGHNONE,0,(APTR)&MainIText20,NULL,NULL,NULL,MENUNULL};
static struct MenuItem MainSubItem4 = {&MainSubItem5,132,-32,144,8,ITEMTEXT|ITEMENABLED|HIGHNONE,0,(APTR)&MainIText21,NULL,NULL,NULL,MENUNULL};

static struct MenuItem MainMenuItem2B= {NULL,-24,92,123,8,ITEMTEXT|ITEMENABLED|HIGHCOMP|COMMSEQ,0,(APTR)&MainIText0,NULL,'D',NULL,MENUNULL};
static struct MenuItem MainMenuItem2A= {&MainMenuItem2B,-24,73,123,8,CHECKIT|ITEMTEXT|ITEMENABLED|HIGHBOX,126,(APTR)&MainITextA,NULL,NULL,NULL,MENUNULL};
static struct MenuItem MainMenuItem20= {&MainMenuItem2A,-24,64,123,8,CHECKIT|ITEMENABLED|HIGHBOX,190,(APTR)&mShrinkFood,NULL,NULL,NULL,MENUNULL};
static struct MenuItem MainMenuItem19= {&MainMenuItem20,-24,55,123,8,CHECKIT|ITEMENABLED|HIGHBOX,222,(APTR)&mGrowFood,NULL,NULL,NULL,MENUNULL};
static struct MenuItem MainMenuItem18= {&MainMenuItem19,-24,46,123,8,CHECKIT|ITEMENABLED|HIGHBOX,238,(APTR)&mPopUpBrick,NULL,NULL,NULL,MENUNULL};
static struct MenuItem MainMenuItem17= {&MainMenuItem18,-24,37,123,8,CHECKIT|ITEMENABLED|HIGHBOX,246,(APTR)&mDropBrick,NULL,NULL,NULL,MENUNULL};
static struct MenuItem MainMenuItem16= {&MainMenuItem17,-24,28,123,8,CHECKIT|ITEMENABLED|HIGHBOX,250,(APTR)&mMoveBrick,NULL,NULL,NULL,MENUNULL};
static struct MenuItem MainMenuItem15= {&MainMenuItem16,-24,19,123,8,CHECKIT|ITEMENABLED|HIGHBOX|CHECKED,252,(APTR)&mBrick,NULL,NULL,NULL,MENUNULL};
static struct MenuItem MainMenuItem14= {&MainMenuItem15,-24,0,123,8,ITEMTEXT|ITEMENABLED|HIGHCOMP,0,(APTR)&MainIText4,NULL,NULL,&MainSubItem1,MENUNULL};

static struct MenuItem MainMenuItem29= {NULL,0,72,69,8,CHECKIT|ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP,255,(APTR)&MainIText5,NULL,'9',NULL,MENUNULL};
static struct MenuItem MainMenuItem28= {&MainMenuItem29,0,63,69,8,CHECKIT|ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP,383,(APTR)&MainIText6,NULL,'8',NULL,MENUNULL};
static struct MenuItem MainMenuItem27= {&MainMenuItem28,0,54,69,8,CHECKIT|ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP,447,(APTR)&MainIText7,NULL,'7',NULL,MENUNULL};
static struct MenuItem MainMenuItem26= {&MainMenuItem27,0,45,69,8,CHECKIT|ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP,479,(APTR)&MainIText8,NULL,'6',NULL,MENUNULL};
static struct MenuItem MainMenuItem25= {&MainMenuItem26,0,36,69,8,CHECKIT|ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP,495,(APTR)&MainIText9,NULL,'5',NULL,MENUNULL};
static struct MenuItem MainMenuItem24= {&MainMenuItem25,0,27,69,8,CHECKIT|ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP|CHECKED,503,(APTR)&MainIText10,NULL,'4',NULL,MENUNULL};
static struct MenuItem MainMenuItem23= {&MainMenuItem24,0,18,69,8,CHECKIT|ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP,507,(APTR)&MainIText11,NULL,'3',NULL,MENUNULL};
static struct MenuItem MainMenuItem22= {&MainMenuItem23,0,9,69,8,CHECKIT|ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP,509,(APTR)&MainIText12,NULL,'2',NULL,MENUNULL};
static struct MenuItem MainMenuItem21= {&MainMenuItem22,0,0,69,8,CHECKIT|ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP,510,(APTR)&MainIText13,NULL,'1',NULL,MENUNULL};

static struct MenuItem MainMenuItem34= {NULL,0,95,128,8,ITEMTEXT|ITEMENABLED|HIGHCOMP,0,(APTR)&MainIText22,NULL,NULL,&MainSubItem4,MENUNULL};
static struct MenuItem MainMenuItem33= {&MainMenuItem34,0,76,128,8,ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP,0,(APTR)&MainIText23,NULL,'Q',NULL,MENUNULL};
static struct MenuItem MainMenuItem35= {&MainMenuItem33,0,57,128,8,ITEMTEXT|ITEMENABLED|HIGHCOMP,0,(APTR)&MainIText30,NULL,0,NULL,MENUNULL};
static struct MenuItem MainMenuItem36= {&MainMenuItem35,0,47,128,8,ITEMTEXT|ITEMENABLED|HIGHCOMP,0,(APTR)&MainIText31,NULL,0,NULL,MENUNULL};
static struct MenuItem MainMenuItem32= {&MainMenuItem36,0,28,128,8,ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP,0,(APTR)&MainIText24,NULL,'E',NULL,MENUNULL};
static struct MenuItem MainMenuItem31= {&MainMenuItem32,0,19,128,8,ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP,4,(APTR)&MainIText25,NULL,'K',NULL,MENUNULL};
static struct MenuItem MainMenuItem30= {&MainMenuItem31,0,0,128,8,ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP,4,(APTR)&MainIText26,NULL,'P',NULL,MENUNULL};

static struct Menu MainMenu3 = {NULL,146,0,57,0,NULL,"Tools",&MainMenuItem14};
static struct Menu MainMenu2 = {&MainMenu3,82,0,57,0,MENUENABLED,"Speed",&MainMenuItem21};
static struct Menu MainMenu1 = {&MainMenu2,0,0,75,0,MENUENABLED,"Project",&MainMenuItem30};

#define MainMenuList MainMenu1

static struct NewWindow MainNewWindowStructure = {0,0,320,200,1,0,MENUPICK,REPORTMOUSE|BORDERLESS|BACKDROP|ACTIVATE,NULL,NULL,NULL,NULL,NULL,320,200,320,200,CUSTOMSCREEN};

/*
 * These files contain the image data for the requesters.
 * They were broken out to make editing easier.
 * (a 310,000 byte file is a bit hard on an editor...
 */
#include	"ContinueImageData.h"
#include	"SelectLevelImageData.h"
#include	"SelectKeysImageData.h"
#include	"HighScoresImageData.h"
#include	"PauseImageData.h"

static struct Image ContinueImage = {0,0,78,33,5,ContinueImageData,0x001F,0x0000,NULL};

/* Select Level Requester info... */
static struct Image SelectLevelImage20 = {-18,-45,114,84,5,SelectLevelImageData20,0x001F,0x0000,NULL};

static struct Gadget SelectLevelGadget81 = {NULL,18,45,78,33,GADGIMAGE|GADGHIMAGE,RELVERIFY|ENDGADGET,BOOLGADGET|REQGADGET,(APTR)&SelectLevelImage20,(APTR)&ContinueImage,&SelectLevelIText30,NULL,NULL,gACCEPT,NULL};
static struct Gadget SelectLevelGadget80 = {&SelectLevelGadget81,10,21,22,21,GADGHNONE,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,gLEVEL_UP,NULL};
static struct Gadget SelectLevelGadget79 = {&SelectLevelGadget80,82,21,22,21,GADGHNONE,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,gLEVEL_DN,NULL};
#define SelectLevelGadgetList SelectLevelGadget79

static struct Requester SelectLevelRequesterStructure = {NULL,100,50,114,84,0,0,&SelectLevelGadgetList,NULL,NULL,NOISYREQ,0,NULL,NULL,NULL};

/* Select keys requester info... */
static struct Image SelectKeysImage21 = {-26,-121,129,160,5,SelectKeysImageData21,0x001F,0x0000,NULL};

static struct Gadget SelectKeysGadget84 = {NULL,26,121,78,33,GADGIMAGE|GADGHIMAGE,RELVERIFY|ENDGADGET,BOOLGADGET|REQGADGET,(APTR)&SelectKeysImage21,(APTR)&ContinueImage,&SelectKeysIText31,NULL,NULL,gACCEPT,NULL};
static struct Gadget SelectKeysGadget83 = {&SelectKeysGadget84,54,39,21,22,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,gKEY_UP,NULL};
static struct Gadget SelectKeysGadget82 = {&SelectKeysGadget83,71,57,22,21,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,gKEY_RT,NULL};
static struct Gadget SelectKeysGadget81 = {&SelectKeysGadget82,36,57,22,21,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,gKEY_LF,NULL};
static struct Gadget SelectKeysGadget80 = {&SelectKeysGadget81,54,74,21,22,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,gKEY_DN,NULL};
#define SelectKeysGadgetList SelectKeysGadget80

static struct Requester SelectKeysRequesterStructure = {NULL,90,20,129,160,0,0,&SelectKeysGadgetList,NULL,NULL,NOISYREQ,0,NULL,NULL,NULL};

/* High Scores requester info... */
static struct Image HighScoresImage22 = {-42,-141,237,180,5,HighScoresImageData22,0x001F,0x0000,NULL};

static struct Gadget HighScoresGadget111= {NULL,42,141,78,33,GADGIMAGE|GADGHIMAGE,RELVERIFY|ENDGADGET,BOOLGADGET|REQGADGET,(APTR)&HighScoresImage22,(APTR)&ContinueImage,&HighScoresIText35,NULL,NULL,gACCEPT,NULL};
static struct Gadget HighScoresGadget110= {&HighScoresGadget111,156,151,34,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,gBACKSPACE,NULL};
static struct Gadget HighScoresGadget109= {&HighScoresGadget110,210,131,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'&',NULL};
static struct Gadget HighScoresGadget108= {&HighScoresGadget109,192,131,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,' ',NULL};
static struct Gadget HighScoresGadget107= {&HighScoresGadget108,174,131,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'Z',NULL};
static struct Gadget HighScoresGadget106= {&HighScoresGadget107,156,131,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'Y',NULL};
static struct Gadget HighScoresGadget105= {&HighScoresGadget106,210,111,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'X',NULL};
static struct Gadget HighScoresGadget104= {&HighScoresGadget105,192,111,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'W',NULL};
static struct Gadget HighScoresGadget103= {&HighScoresGadget104,174,111,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'V',NULL};
static struct Gadget HighScoresGadget102= {&HighScoresGadget103,156,111,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'U',NULL};
static struct Gadget HighScoresGadget101= {&HighScoresGadget102,210,91,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'T',NULL};
static struct Gadget HighScoresGadget100= {&HighScoresGadget101,192,91,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'S',NULL};
static struct Gadget HighScoresGadget99 = {&HighScoresGadget100,174,91,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'R',NULL};
static struct Gadget HighScoresGadget98 = {&HighScoresGadget99,156,91,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'Q',NULL};
static struct Gadget HighScoresGadget97 = {&HighScoresGadget98,210,71,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'P',NULL};
static struct Gadget HighScoresGadget96 = {&HighScoresGadget97,192,71,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'O',NULL};
static struct Gadget HighScoresGadget95 = {&HighScoresGadget96,174,71,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'N',NULL};
static struct Gadget HighScoresGadget94 = {&HighScoresGadget95,156,71,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'M',NULL};
static struct Gadget HighScoresGadget93 = {&HighScoresGadget94,210,51,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'L',NULL};
static struct Gadget HighScoresGadget92 = {&HighScoresGadget93,192,51,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'K',NULL};
static struct Gadget HighScoresGadget91 = {&HighScoresGadget92,174,51,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'J',NULL};
static struct Gadget HighScoresGadget90 = {&HighScoresGadget91,156,51,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'I',NULL};
static struct Gadget HighScoresGadget89 = {&HighScoresGadget90,210,31,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'H',NULL};
static struct Gadget HighScoresGadget88 = {&HighScoresGadget89,192,31,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'G',NULL};
static struct Gadget HighScoresGadget87 = {&HighScoresGadget88,174,31,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'F',NULL};
static struct Gadget HighScoresGadget86 = {&HighScoresGadget87,156,31,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'E',NULL};
static struct Gadget HighScoresGadget85 = {&HighScoresGadget86,210,11,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'D',NULL};
static struct Gadget HighScoresGadget84 = {&HighScoresGadget85,192,11,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'C',NULL};
static struct Gadget HighScoresGadget83 = {&HighScoresGadget84,174,11,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'B',NULL};
static struct Gadget HighScoresGadget82 = {&HighScoresGadget83,156,11,16,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,'A',NULL};
static struct Gadget HighScoresGadget81 = {&HighScoresGadget82,192,151,34,18,NULL,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,NULL,NULL,gCR,NULL};

#define HighScoresGadgetList HighScoresGadget81

static struct Requester HighScoresRequesterStructure = {NULL,40,13,237,180,0,0,&HighScoresGadgetList,NULL,NULL,NOISYREQ,0,NULL,NULL,NULL};

static struct Image PauseImage1 = {0,0,52,33,5,PauseImageData1,0x001F,0x0000,NULL};
static struct Image PauseImage2 = {0,0,68,33,5,PauseImageData2,0x001F,0x0000,NULL};
static struct Image PauseImage3 = {0,0,85,33,5,PauseImageData3,0x001F,0x0000,NULL};

static struct Gadget PauseGadget3 = {NULL,153,0,52,33,GADGIMAGE,RELVERIFY|ENDGADGET,BOOLGADGET|REQGADGET,(APTR)&PauseImage1,NULL,NULL,NULL,NULL,gQUIT,NULL};
static struct Gadget PauseGadget2 = {&PauseGadget3,85,0,68,33,GADGIMAGE,RELVERIFY|ENDGADGET,BOOLGADGET|REQGADGET,(APTR)&PauseImage2,NULL,NULL,NULL,NULL,gABORT,NULL};
static struct Gadget PauseGadget1 = {&PauseGadget2,0,0,85,33,GADGIMAGE,RELVERIFY|ENDGADGET,BOOLGADGET|REQGADGET,(APTR)&PauseImage3,NULL,NULL,NULL,NULL,gCONTINUE,NULL};

#define PauseGadgetList PauseGadget1

static struct Requester PauseRequesterStructure = {NULL,51,69,205,33,0,0,&PauseGadgetList,NULL,NULL,NOISYREQ,0,NULL,NULL,NULL};

VOID	Show_Title()
{
	ShowTitle(MyScreen,1L);
}

VOID	Hide_Title()
{
	ShowTitle(MyScreen,0L);
}

short	OpenMyWindow()
{
	if (MyScreen=OpenScreen(&NewScreenStructure))
	{
		LoadRGB4(&(MyScreen->ViewPort),Palette,32L);
		MainNewWindowStructure.Screen=MyScreen;
		if (MyWindow=OpenWindow(&MainNewWindowStructure))
		{
			SetMenuStrip(MyWindow,&MainMenuList);
			SetWindowTitles(MyWindow,NULL,Title_Text);
			ScreenToFront(MyScreen);
		}
	}
	return( (MyWindow ? TRUE:FALSE) );
}

VOID	CloseMyWindow()
{
	if (MyWindow)
	{
		ClearMenuStrip(MyWindow);
		CloseWindow(MyWindow);
		MyWindow=NULL;
	}
	if (MyScreen)
	{
		CloseScreen(MyScreen);
		MyScreen=NULL;
	}
}

short	Request_SelectLevel(lv)	short	lv;
{
register	struct	IntuiMessage	*msg;
register	struct	Gadget		*g;
register		short		add_flag=0;
register		short		loop=TRUE;
			ULONG		tmpIDCMP;
			UBYTE		tmp;

	Show_Title();
	if ((lv>0)&&(lv<MAX_LEVEL)) SelectLevel=lv;
	sprintf(SelectLevelText,"%2d",SelectLevel);
	tmpIDCMP=MyWindow->IDCMPFlags;
	ModifyIDCMP(MyWindow,GADGETUP|INTUITICKS|RAWKEY);
	if (Request(&SelectLevelRequesterStructure,MyWindow)) while (loop)
	{
		WaitPort(MyWindow->UserPort);
		while (msg=(struct IntuiMessage *)GetMsg(MyWindow->UserPort))
		{
			if (loop) switch (msg->Class)
			{
			case RAWKEY:		add_flag=0;
						switch ((UBYTE)(msg->Code))
						{
						case RAW_CR_UP:
						case RAW_EN_UP:
						case RAW_SP_UP:
						case RAW_A_UP:	loop=FALSE;
								EndRequest(&SelectLevelRequesterStructure,MyWindow);
								break;
						case RAW_RT:	add_flag=1;
								break;
						case RAW_LF:	add_flag=-1;
								break;
						default:	if (((UBYTE)(msg->Code)) & 0x80)
								{
									tmp=Convert_Key((UBYTE)(msg->Code))-'0';
									if ((tmp>=0) && (tmp<10))
									{
										add_flag=SelectLevel%10;
										SelectLevel=0;
										if (add_flag>(MAX_LEVEL/10)) add_flag=0;
										add_flag=add_flag*10 + tmp;
										if (!add_flag) add_flag=MAX_LEVEL+1;
									}
								}
								break;
						}
						if (add_flag)
						{
							SelectLevel+=add_flag;
							if (SelectLevel<1) SelectLevel=MAX_LEVEL;
							if (SelectLevel>MAX_LEVEL) SelectLevel=SelectLevel%MAX_LEVEL;
							sprintf(SelectLevelText,"%2d",SelectLevel);
							RefreshGadgets(&SelectLevelGadget81,MyWindow,&SelectLevelRequesterStructure);
						}
						break;
			case GADGETUP:		g=(struct Gadget *)(msg->IAddress);
						if (g->GadgetID==gACCEPT) loop=FALSE;
						break;
			case INTUITICKS:	add_flag=0;
						if (SelectLevelGadget80.Flags&SELECTED) add_flag=-1;
						if (SelectLevelGadget79.Flags&SELECTED) add_flag=1;
						if (add_flag)
						{
							SelectLevel+=add_flag;
							if (SelectLevel<1) SelectLevel=MAX_LEVEL;
							if (SelectLevel>MAX_LEVEL) SelectLevel=1;
							sprintf(SelectLevelText,"%2d",SelectLevel);
							RefreshGadgets(&SelectLevelGadget81,MyWindow,&SelectLevelRequesterStructure);
						}
						break;
			}
			ReplyMsg(msg);
		}
	}
	ModifyIDCMP(MyWindow,tmpIDCMP);
	Hide_Title();
	return(SelectLevel);
}

VOID	Request_SelectKeys()
{
register	struct	IntuiMessage	*msg;
register	struct	Gadget		*g;
register		short		change_flag=0;
register		short		loop=TRUE;
			UBYTE		tmp;
			ULONG		tmpIDCMP;

	Show_Title();
	tmpIDCMP=MyWindow->IDCMPFlags;
	ModifyIDCMP(MyWindow,RAWKEY|GADGETUP);

	if (Request(&SelectKeysRequesterStructure,MyWindow)) while (loop)
	{
		WaitPort(MyWindow->UserPort);
		while (msg=(struct IntuiMessage *)GetMsg(MyWindow->UserPort))
		{
			if (loop) switch (msg->Class)
			{
			case GADGETUP:	g=(struct Gadget *)(msg->IAddress);
					fix_KeyList();
					if (g->GadgetID==gACCEPT) loop=FALSE;
					else
					{
						change_flag=g->GadgetID;
						strcpy(KeyList[change_flag-gKEY_BASE].str,"¿?");
						RefreshGadgets(&SelectKeysGadget84,MyWindow,&SelectKeysRequesterStructure);
					}
					break;
			case RAWKEY:	if (change_flag>0)
					{
						tmp=(UBYTE)msg->Code;
						if ((tmp<RAW_MAX) && (tmp!=RAW_ESC))
						{
							KeyList[change_flag-gKEY_BASE].raw=tmp;
							fix_KeyList();
							RefreshGadgets(&SelectKeysGadget84,MyWindow,&SelectKeysRequesterStructure);
							change_flag=0;
						}
					}
					break;
			}
			ReplyMsg(msg);
		}
	}

	ModifyIDCMP(MyWindow,tmpIDCMP);
	Hide_Title();
}

VOID	Request_HighScores(Score)	register	ULONG	Score;
{
register		short		loop;
register		short		pos=8;
register	struct	IntuiMessage	*msg;
			UBYTE		tmp;
			ULONG		tmpIDCMP;

	Show_Title();
	for (loop=0;loop<8;loop++) if (Score>ScoreList[loop].score) { pos=loop; loop=8; }
	if (pos<7) for (loop=6;loop>=pos;loop--)
	{
		ScoreList[loop+1].score=ScoreList[loop].score;
		strcpy(ScoreList[loop+1].str,ScoreList[loop].str);
	}
	if (pos<8)
	{
		sprintf(ScoreList[pos].str,"    %9ld",Score);
		ScoreList[pos].score=Score;
	}
	loop=0;
	tmpIDCMP=MyWindow->IDCMPFlags;

	ModifyIDCMP(MyWindow,GADGETUP | RAWKEY);

	if (Request(&HighScoresRequesterStructure,MyWindow)) while (loop>=0)
	{
		WaitPort(MyWindow->UserPort);
		while (msg=(struct IntuiMessage *)GetMsg(MyWindow->UserPort))
		{
			if (loop>=0)
			{
				tmp=(UBYTE)(msg->Code);
				if ((msg->Class==RAWKEY)&&(tmp&0x80)) tmp=Convert_Key(tmp);
				else if (msg->Class==GADGETUP) tmp=((struct Gadget *)(msg->IAddress))->GadgetID;
				else tmp=0;
				switch (tmp)
				{
				case 0:		break;
				case gESC:	EndRequest(&HighScoresRequesterStructure,MyWindow);
				case gACCEPT:	if (pos<8) ScoreList[pos].str[loop]=' ';
						loop=-1;
						break;
				case gCR:	if (pos<8)
						{
							ScoreList[pos].str[loop]=' ';
							RefreshGadgets(&HighScoresGadget111,MyWindow,&HighScoresRequesterStructure);
						}
						pos=9;
						break;
				case gBACKSPACE:
						if ((loop>0)&&(pos<8))
						{
							ScoreList[pos].str[loop--]=' ';
							ScoreList[pos].str[loop]='';
							RefreshGadgets(&HighScoresGadget111,MyWindow,&HighScoresRequesterStructure);
						}
						break;
				default:	if (pos<8) if (ScoreList[pos].str[loop+1]==' ')
						{
							ScoreList[pos].str[loop++]=tmp;
							ScoreList[pos].str[loop]='';
							RefreshGadgets(&HighScoresGadget111,MyWindow,&HighScoresRequesterStructure);
						}
						break;
				}
			}
			ReplyMsg(msg);
		}
	}

	ModifyIDCMP(MyWindow,tmpIDCMP);
	Hide_Title();
}

short	Request_Pause()
{
register		short		typ=2;
register	struct	IntuiMessage	*msg;
register		ULONG		tmpIDCMP;

	Show_Title();
	tmpIDCMP=MyWindow->IDCMPFlags;
	ModifyIDCMP(MyWindow,GADGETUP | RAWKEY);

	if (Request(&PauseRequesterStructure,MyWindow))
	{
		typ=0;
		while (!typ)
		{
			WaitPort(MyWindow->UserPort);
			while (msg=(struct IntuiMessage *)GetMsg(MyWindow->UserPort))
			{
				if (!typ)
				{
					if (msg->Class==GADGETUP) typ=((struct Gadget *)(msg->IAddress))->GadgetID-gCONTINUE+1;
					else if (msg->Class==RAWKEY) switch ((UBYTE)(msg->Code))
					{
					case RAW_SP_UP:
					case RAW_CR_UP:
					case RAW_C_UP:	typ=-1;	break;
					case RAW_A_UP:	typ=-2;	break;
					case RAW_Q_UP:	typ=-3;	break;
					}
				}
				ReplyMsg(msg);
			}
		}
		if (typ<0)
		{
			typ=0-typ;
			EndRequest(&PauseRequesterStructure,MyWindow);
		}
	}

	ModifyIDCMP(MyWindow,tmpIDCMP);
	Hide_Title();
	return(typ);
}

VOID	UpDate_Status(level,score,lives)	short	level;
						ULONG	score;
						short	lives;
{
static	short	o_level=-1;
static	ULONG	o_score=3000000000L;
static	short	o_lives=-1;

	if (level!=o_level)
	{
		sprintf(Level_Text,"Level:%3d",level);
		o_level=level;
	}
	if (score!=o_score)
	{
		sprintf(Score_Text,"Score:%9ld",score);
		o_score=score;
	}
	if (lives!=o_lives)
	{
		sprintf(Lives_Text,"Lives:%3d",lives);
		o_lives=lives;
	}

	PrintIText(MyWindow->RPort,&MainIntuiTextList,0L,0L);
}

	/* This will fade out (or in) the snake screen... */
VOID	Set_Color_Level(chg)	register	short	chg;
{
register	short	x;
register	USHORT	y;
register	USHORT	z;
		USHORT	OldPalette[32];

	chg&=15;
	for(x=0;x<32;x++)
	{
		y=Palette[x];
		z=(y & 0x0F00)>>8;
		if (z>chg) z-=chg; else z=0;
		OldPalette[x]=z<<8;
		z=(y & 0x00F0)>>4;
		if (z>chg) z-=chg; else z=0;
		OldPalette[x]+=z<<4;
		z=(y & 0x000F);
		if (z>chg) z-=chg; else z=0;
		OldPalette[x]+=z;
	}
	LoadRGB4(&(MyScreen->ViewPort),OldPalette,32L);
}

VOID	Cycle_Colors()	/* This cycles the snake's colors... */
{
register	USHORT	x;

	x=Palette[20];
	Palette[20]=Palette[21];
	Palette[21]=x;
	LoadRGB4(&(MyScreen->ViewPort),Palette,32L);
}
