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

check(flag,msg)
char *msg;
{
if (!flag) {
	PUTS("Lupengo: ");
	PUTS(msg);
	PUTS("\n");
	clall(20);
	}
}

#define SHIFTPOS 320
#define NAME_POS(A)	(  6+(SHIFTPOS*(A)))
#define SCOREPOS(A)	(256+(SHIFTPOS*(A)))
#define LEVELPOS(A)	(306+(SHIFTPOS*(A)))
#define VERTPOS(A)	((A)*8+32)
#define VERTPOS0	28

#define RECTY0	26
#define RECTY1	120

#define TOPSIZE sizeof(struct topitem)
#define FORALLTOPS FOR (i,1,TOPS) FOR (p,0,1)

topassign(a,b)
struct topitem *a, *b;
{
strcpy(a->name,b->name);
a->score=b->score;
a->level=b->level;
}

showhighs(lastscore,lastlevel)
{
register unsigned int yourpos,i,j,p,color;
BPTR topfile;
unsigned char work[10];

if (lastscore==-1) {	/* Read top file */
	if (topfile=Open(scorename,MODE_OLDFILE)) {
		FORALLTOPS Read(topfile,(char *)&(top[i][p]),TOPSIZE);
		Close(topfile);
		}
	else FORALLTOPS {
		strcpy(top[i][p].name,strnobody);
		top[i][p].score=0;
		top[i][p].level=0;
		}
	return;
	}
yourpos=0;
cls();
SetAPen(rp,8);
RectFill(rp,  0,     0,639,RECTY0);
SetAPen(rp,15);
RectFill(rp,  0,RECTY0,319,RECTY1);
SetAPen(rp,14);
RectFill(rp,320,RECTY0,639,RECTY1);
SetAPen(rp,2);
RectFill(rp,  0,RECTY1,639,255);
iprint(1,240,16,strhiscotab,MYUNDER);
FOR (p,0,1) {
	iprint(1,NAME_POS(p),VERTPOS0,strpl[p],MYUNDER);
	iprint(1,SCOREPOS(p),VERTPOS0,strscore,MYUNDER | MYRIGHT);
	iprint(1,LEVELPOS(p),VERTPOS0,strlevel,MYUNDER | MYRIGHT);
	}
FORALLTOPS {
	color=1;
	if (yourpos==0 && lastscore>top[i][p].score && p==players-1) {
		yourpos=i;
		FORDOWN (j,TOPS,i+1) topassign(&(top[j][p]),&(top[j-1][p]));
		top[i][p].score=lastscore;
		top[i][p].level=lastlevel;
		strcpy(top[i][p].name,"");
		color=2;
		}
	iprint(color,NAME_POS(p),VERTPOS(i),top[i][p].name,0);
	sprintf(work,"%ld",top[i][p].score);
	iprint(color,SCOREPOS(p),VERTPOS(i),work,MYRIGHT);
	sprintf(work,"%ld",top[i][p].level);
	iprint(color,LEVELPOS(p),VERTPOS(i),work,MYRIGHT);
	}
if (yourpos) {
	display(strentername,DF_NOWAIT | DF_NOREFRESH);
	inputat(NAME_POS(players-1),VERTPOS(yourpos),
		top[yourpos][players-1].name, stranonimous,
		players==2 ? 14 : 15);
	topfile=Open(scorename, MODE_NEWFILE);
	if (topfile) {
		FORALLTOPS Write(topfile,(char *)&(top[i][p]),TOPSIZE);
		Close(topfile);
		}
	showhighs(0,0);
	}
else display(strtrytobeat,DF_NOREFRESH);
}

struct IntuiText cursor ={ 0, 2, JAM2, 0, 0, &ta, " ",  NULL };

inputat(x,y,s,def,back)
char *s, *def;
{
register int l=0;
int n;
char c;
struct IntuiMessage *m;

PrintIText(rp, &cursor,  x, y);
for (;;) {
	WaitPort(w->UserPort);
	m=(struct IntuiMessage *)GetMsg(w->UserPort);
	c=(char)m->Code;
	ReplyMsg((struct Message *)m);
	if (c>=0x20 && c<=0x7f && l<MAXNAMELEN) s[l++]=c;
	else switch(c) {
		case 0x0d:
		  if (l==0) strcpy(s,def);
		  return;
		case 0x18:
		  l=0;
		  break;
		case 0x08:
		  if (l) l--;
		  break;
		}
	s[l]='\0';
	SetAPen(rp, back);
	RectFill(rp, x, y, x+180, y+7);
	n=iprint(2,x,y,s,0);
	PrintIText(rp, &cursor,  x+n, y);
	}
}

struct IntuiText printit={ 0, 0, JAM1, 0, 0, &ta, NULL, NULL };

iprint(color,x,y,s,flags)
char *s;
{
int l;

printit.FrontPen=color;
printit.IText=s;
l=IntuiTextLength(&printit);
if (color >= 0) {	/* color<0 : don't print */
	if (flags & MYRIGHT) x-=l;
	if (flags & MYUNDER) {
		SetAPen(rp,color);
		Move(rp,x,y+7);
		Draw(rp,x+l,y+7);
		}
	PrintIText(rp, &printit, x, y);
	}
return l;
}

struct MsgPort *playport, *reply;

static struct rexxmsg {
	struct Message cm_Node;
	LONG   RFU1;
	LONG   RFU2;
	LONG   rm_Action;
	LONG   rm_Result1;
	LONG   rm_Result2;
	char   *cm_Args[16];
	LONG   RFU7;
	LONG   RFU8;
	LONG   RFU9;
	LONG   RFU10;
	LONG   RFU11;
	LONG   RFU12;
} mymsg;

opensound()
{
playport=FindPort("rexx_play");
if (playport) {
	check(reply=CreatePort(0,0),"Can't create Reply Port");
	mymsg.cm_Node.mn_Node.ln_Type = NT_MESSAGE;
	mymsg.cm_Node.mn_Length = sizeof(struct rexxmsg);
	mymsg.rm_Action = 0;
	mymsg.cm_Node.mn_ReplyPort = reply;
	}
}

closesound()
{
toplay("-");
toplay("q");
if (reply) DeletePort(reply);
}

toplay(s)
char *s;
{
if (playport) {
	mymsg.cm_Args[0] = s;
	mymsg.rm_Result2 = 0;	/* clear out the last result. */
	PutMsg(playport, &(mymsg.cm_Node));
	WaitPort(reply);
	GetMsg(reply);
	}
}
