/* Lupengo			*
 * by Carlo Borreo		*
 * email: borreo@softhome.net	*
 * License: GPL			*
 * Started writing: 10-Aug-1987	*
 * First released:  01-May-2000 */

struct NewWindow nw= {
	0, 0,			/* LeftEdge, TopEdge	*/
	640, 200,		/* Width, Height	*/
	0, 1,			/* DetailPen, BlockPen	*/
	VANILLAKEY,		/* IDCMPFlags		*/
	NOCAREREFRESH | BORDERLESS | ACTIVATE,
				/* Flags		*/
	NULL,			/* FirstGadget		*/
	NULL,			/* CheckMark		*/
	NULL,			/* Title		*/
	NULL,			/* Screen		*/
	NULL,			/* BitMap		*/
	0, 0,			/* MinWidth, MinHeight	*/
	0, 0,			/* MaxWidth, MaxHeight	*/
	CUSTOMSCREEN,		/* Type			*/
	};

cls()
{
register unsigned short x, y;

Move(rp,0,0);
ClearScreen(rp);
FOR (x,0,BX1+2)
	FOR (y,0,BY1+2)
		screen[x][y]=0;
}

struct IntuiText dit={ 1, 2, JAM2, DELTAX, 0, &bigta, NULL, NULL };

#define DISPX0	BX0
#define DISPX1	BX1
#define DX0	(DISPX0*36)
#define DX1	(DISPX1*36+35)

display(msg, flags)
char *msg;
{
register int i,j;
int dy0=(flags & DF_HALF ? 80 : 130);
int dy1=dy0+59;
int hx=DX0+(DX1-DX0)/2;
int hy=dy0+(dy1-dy0)/2;

if (!(flags & DF_NORECT)) {
	SetAPen(rp,2);
	RectFill(rp, DX0+DELTAX, dy0, DX1+DELTAX, dy1);
	}
dit.IText=msg;
PrintIText(rp, &dit, hx-IntuiTextLength(&dit)/2, hy-7);
ScreenToFront(s);
if (!(flags & DF_NOWAIT)) {
	do { readjoy(2); Delay(10); } while (button);
	do { readjoy(2); Delay(10); } while (!button); /* sleep a bit */
	do { readjoy(2); Delay(10); } while (button);
	}
if (!(flags & DF_NOREFRESH))
	for (i=DISPX0; i<=DISPX1; i++)
		for (j=4; j<=6; j++)
			putscreen(i, j, screen[i][j]);
}

struct IntuiText numit={ 1, 0, JAM2, DELTAX, 0, &bigta, NULL, NULL };

addscore(n)
{
char buf[10];

score += n;
if (score>=nextwin) {
	lives++;
	nextwin=nextwin+wininc;
	updatelives();
	}
sprintf(buf,"%7ld",score);
numit.IText=buf;
PrintIText(rp,&numit,350,0);
}

updatelives()
{
register int i;
int livepic;
livepic=( players==1 ? FIRST : MONSTER);
FOR (i,0,6) putscreen(i+1,0,(i<lives) ? livepic : BLANK);
}

testkey(playing)
{
char buf[24];
int code, q;
struct IntuiMessage *m;
if (m=(struct IntuiMessage *)GetMsg(w->UserPort)) {
	code=m->Code;
	q=( (m->Qualifier) & 0xff);
	ReplyMsg((struct Message *)m);
	switch (code) {
		case 't': if (q==0xc0) {
				trainer=1;
				secretdisplay("?!?");
				longjmp(jmpsave,0);
				}
			   break;
			/* Right Amiga+Left Amiga+T=Trainer */

		case 'd': if (q==0xc0) {
				secretdisplay(readytorecord);
				openwdemo();
				longjmp(jmpsave,0);
				}
			   break;
			/* Right Amiga+Left Amiga+D=Demo */

		case 'c': if (q==0xc0) {
				secretdisplay(__DATE__);
				secretdisplay(__TIME__);
				secretdisplay("Written by Carlo Borreo");
				sprintf(buf,"Fast=%ld",AvailMem(MEMF_FAST));
				secretdisplay(buf);
				sprintf(buf,"Chip=%ld",AvailMem(MEMF_CHIP));
				secretdisplay(buf);
				longjmp(jmpsave,0);
				}
			break;
			/* Right Amiga+Left Amiga+c=Compile info */

		case '1':
		case '2':
		case '3':
		case '4':
		case '5':
		case '6':
			return code-'0';

		case 0x1b: if (playing) {
				closedemo();
				trainer=0;
				longjmp(jmpsave,0);
				}
			/* ESC key to exit game		*/

		case 0x20: if (playing) display(strpaused,DF_HALF);
			   break;
			/* spacebar to pause game	*/
		default:
			break;
		}
	}
return 0;
}

secretdisplay(s)
char *s;
{
display(s,players ? DF_HALF : (DF_HALF | DF_NOREFRESH) );
}

/* Here starts the demo stuff */

long seed=0;

#define FACTOR 5764817

int rnd(low,high)
{
if (seed==0) {
	long curr[3];

	DateStamp((struct DateStamp *)curr);
	seed = (60*curr[1])+(curr[2]/50);
	}
seed = (seed*343+37512) % FACTOR;
return (int) (seed*(high-low+1)/FACTOR+low);
}

#define DEMOBUFSIZE	3000
#define DEMO_NULL	0
#define DEMO_READING	1
#define DEMO_WRITING	2

long demoseed, demoplayers;
static char demobuf[DEMOBUFSIZE];
unsigned short demoindex, demostatus, demosize;

openwdemo()
{
usercheck(demostatus == DEMO_NULL, stralreadyrw);
rnd(0,0);
demoseed=seed;
demoindex=0;
demostatus=DEMO_WRITING;
longjmp(jmpsave,0);
}

closedemo()
{
BPTR f;

switch (demostatus) {
	case DEMO_READING:
		demostatus=DEMO_NULL;
		display(strendofdemo,DF_HALF | DF_NOREFRESH);
		break;
	case DEMO_WRITING:
		demostatus=DEMO_NULL;
		usercheck(f=Open(demofile,MODE_NEWFILE), strdiskerr);
		Write(f,(char *)&demoseed   ,4);
		Write(f,(char *)&demoplayers,4);
		Write(f,demobuf,(int)demoindex);
		Close(f);
		break;
	case DEMO_NULL:
		return;
	}
}

playdemo()
{
BPTR f;

usercheck(demostatus == DEMO_NULL, stralreadyrw);
usercheck(f=Open(demofile,MODE_OLDFILE), strnodemofile);
Read(f, (char *)&demoseed   , 4);
Read(f, (char *)&demoplayers, 4);
demosize=Read(f,demobuf,DEMOBUFSIZE);
usercheck(demosize>0, "Bad demo file");
Close(f);
demoindex=0;
demostatus=DEMO_READING;
seed=demoseed;
newgame();
longjmp(jmpsave,0);
}

usercheck(flag, msg)
char *msg;
{
if (flag) return;
display(msg,DF_HALF);
longjmp(jmpsave,0);
}

readjoy(port)
{
unsigned short x;
char c;

if (demostatus==DEMO_READING) {
	c=demobuf[demoindex++];
	joyx	=(c & 3)-1;
	joyy	=((c/4) & 3)-1;
	button	=((c/16) & 3)-1;
	if (demoindex>=demosize) {
		closedemo();
		longjmp(jmpsave,0);
		}
	return;
	}
joyx=joyy=0;
x=*( (unsigned short *)(0xdff008 + 2*port) );
if (x & 2)	joyx= 1;
if (x & 512)	joyx=-1;
x=(x>>1^x);
if (x & 1)	joyy= 1;
if (x & 256)	joyy=-1;
button=(!(*( (unsigned char  *)(0xbfe001) ) & 64*port));
if (demostatus==DEMO_WRITING) {
	demobuf[demoindex++]=(joyx+1)+(joyy+1)*4+(button+1)*16;
	if (demoindex >= DEMOBUFSIZE-20) {
		display(strnomoreroom, DF_HALF | DF_NOREFRESH | DF_NOWAIT);
		closedemo();
		display(strnomoreroom, DF_HALF);
		}
	}
}
