#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <math.h>
#include "h\mxmplay.h"


#define pi 3.14159265359


#define ord (xmpGetPos())
#define row (xmpGetRow())

char *video=(char *)0xa0000;
char vpage[64000];

extern "C"
{
extern unsigned char meditation[];
};

void setmode13(void);
#pragma aux setmode13="mov ax,13h""int 10h" modify[ax];
void setmode3(void);
#pragma aux setmode3="mov ax,3h""int 10h" modify[ax];

void setpal(char *pal);
#pragma aux setpal=\
	"sub eax,eax",\
	"mov dx,3c8h",\
	"out dx,al",\
	"inc dx",\
	"mov cx,768",\
	"rep outsb",\
	parm[esi] modify[cx];

int float2int(float);
#pragma aux float2int = \
	"push eax",\
	"fistp dword ptr [esp]",\
	"pop eax",\
	value[eax] parm[8087];


void shadebob(char *where,char *bob,int xpos,int ypos)
{
	int x,y,offset,boffset,a;

	offset=ypos*320+xpos;
	boffset=0;

	for (y=0;y<32;y++,offset+=320)
	{
		for (x=0;x<32;x++,boffset++)
		{
		a=bob[boffset];


		if (a) where[offset+x]+=a;
		}
	}


}



void runding(char *where)
{

	int x,y;
	char col;
	float dist;


	for (y=0;y<16;y++)
		for (x=0;x<16;x++)
		{
			dist=16-sqrt((16-x)*(16-x)+(16-y)*(16-y));
			if (dist<1) dist=0;
			col=(int)dist*8;
			where[y*32+x]=col;
			where[(31-y)*32+x]=col;
			where[y*32+(31-x)]=col;
			where[(31-y)*32+(31-x)]=col;
		}
}


//		"eventyret om niels, petter og vennene-hans."


void bitmaprotate(char *to,char *from,float rot,float zoom)
{
	float x1,x2,x3,x4,y1,y2,y3,y4;
	int x,y,xx,yy,offset=0;

	float xih,yih,xiv,yiv,cx,cy,startx,starty;

	x1=32768-128+  cos(rot)*zoom;
	y1=32768-128+  sin(rot)*zoom;

	x2=32768-128+  cos(rot+(pi/2))*zoom;
	y2=32768-128+  sin(rot+(pi/2))*zoom;

	x3=32768-128+  cos(rot+pi)*zoom;
	y3=32768-128+  sin(rot+pi)*zoom;


	x4=32768-128+  cos(rot+pi+(pi/2))*zoom;
	y4=32768-128+  sin(rot+pi+(pi/2))*zoom;

	xih=(x1-x2)/320;
	yih=(y1-y2)/320;

	xiv=(x3-x2)/200;
	yiv=(y3-y2)/200;


	startx=x2;
	starty=y2;


	for (y=0;y<200;y++)
	{

		cx=startx;
		cy=starty;

		for (x=0;x<320;x++,offset++)
		{

			xx=(float2int(cx))&0xff;
			yy=(float2int(cy))&0xff;


			to[offset]=from[(yy<<8)+xx];
			cx+=xih;
			cy+=yih;
		}
		startx+=xiv;
		starty+=yiv;
	}
}

void bitmaprotate2(char *to,char *from,float rot,float zoom)
{
	float x1,x2,x3,x4,y1,y2,y3,y4;
	int x,y,xx,yy,offset=0;

	float xih,yih,xiv,yiv,cx,cy,startx,starty;

	x1=32768+  cos(rot)*zoom;
	y1=32768+  sin(rot)*zoom;

	x2=32768+  cos(rot+(pi/2))*zoom;
	y2=32768+  sin(rot+(pi/2))*zoom;

	x3=32768+  cos(rot+pi)*zoom;
	y3=32768+  sin(rot+pi)*zoom;


	x4=32768+  cos(rot+pi+(pi/2))*zoom;
	y4=32768+  sin(rot+pi+(pi/2))*zoom;

	xih=(x1-x2)/320;
	yih=(y1-y2)/320;

	xiv=(x3-x2)/200;
	yiv=(y3-y2)/200;


	startx=x2;
	starty=y2;


	for (y=0;y<200;y++)
	{

		cx=startx;
		cy=starty;

		for (x=0;x<320;x++,offset++)
		{

			xx=(float2int(cx))&0xff;
			yy=(float2int(cy))&0xff;


			to[offset]=(from[(yy<<8)+xx]+to[offset])/2;
			cx+=xih;
			cy+=yih;
		}
		startx+=xiv;
		starty+=yiv;
	}
}


void smooth(char *p)
{
	int x,y;

	for (y=1; y<199; y++)
	for (x=1; x<319; x++)
	p[y*320+x]=(p[y*320+x-1]+p[y*320+x+1]+p[y*320+x-320]+p[y*320+x+320])/4;

}


float sintbl[256],costbl[256];

void plasma(char *dest,int u)
{
	int x,y,col;

	for (y=0; y<200; y++)
	{
		for (x=0; x<320; x++)
		{
			col=fabs(atan2(x-u,y)*sintbl[(y+u)&0xff]*costbl[(x|u)&0xff]*100);
			*dest++ = col;
		}
	}


}


void kalkulerkulting(char *hvorskaldenvaere)
{
	int x,y,offset=0;

	for (y=0;y<256;y++)
	for (x=0;x<256;x++,offset++)
	{
		hvorskaldenvaere[offset]=x^y;

	}

}

char palle[768],proffen[768];

void updatepal(void)
{
	float t;
	int i;
	char p[768];

	t=cos((float)xmpGetTimer()/41000)*0.5+0.5;

	for (i=0; i<256; i++)
	{
	 p[i*3+0]=palle[i*3+0]+((proffen[i*3+0]-palle[i*3+0])*t);
	 p[i*3+1]=palle[i*3+1]+((proffen[i*3+1]-palle[i*3+1])*t);
	 p[i*3+2]=palle[i*3+2]+((proffen[i*3+2]-palle[i*3+2])*t);
	}

	setpal(p);
}

int escpressed(void)
{
	if (inp(0x60)==1)
	{
			xmpStop();
			setmode3();
			exit(0);
	}
	return 0;
}

/*
	det var en gang tre brdre, niels, petter og vennen-hans. kongen hadde
	reverk og trengte to paracet. frste mann til  prve var niels, men
	han hoppet utfor stupet og ble lungemos. petter hoppet i strikk fra en
	flyvende lastebil og ble vt p fttene, og det likte	ikke kongen.
	vennene-hans spurte og om han kunne f halv prinsessen og to
	kongeriker, og kongen sa ja. s levde de lykkelig fram til halv tte.
*/
char tekst[64000];

void fikstekstogsaann(void)
{
	int x,y,i;
	printf("det var en gang tre brdre,\n"
	       "niels, petter og vennen-hans.\n"
				 "kongen hadde reverk og trengte\n"
				 "to paracet. frste mann til \n"
				 "prve var niels, men han hoppet\n"
				 "utfor stupet og ble lungemos.\n"
				 "petter hoppet i strikk fra en\n"
	       "flyvende lastebil og ble vt\n"
				 "p fttene, og det likte ikke\n"
				 "kongen. vennene-hans spurte og\n"
				 "om han kunne f halve prinsessen\n"
				 "og to kongeriker, og kongen sa\n"
				 "ja. s levde de lykkelig fram\n"
				 "til halv tte.\n");

	printf("\n\n\n\n\n              rC\n");
	fflush(stdout);

	memset(tekst,0,64000);
	for (i=0; i<64000; i++)
	{
		if (video[i]) tekst[i] = 200;

	}
}

char bobhans[32*32];
char elitepattern[0xffff+1];

void main()
{
			int i;
			int blipp=0;

			setmode13();

			xmpInit(meditation,xmpGetGUSPort(xmpGetEnvPtrDPMI(_psp)),65536,MXMINTMODEDPMI);

			for (i=0; i<256; i++)
			{
				sintbl[i]=sin((float)i/30);
				costbl[i]=cos((float)i/100);
			}

			kalkulerkulting(elitepattern);

			memset(palle,0,768);
			setpal(palle);

			fikstekstogsaann();

			xmpPlay(0);

			memset(bobhans,223,32*32);

			runding(bobhans);
			for (i=0;i<256;i++)
			{
				palle[i*3+0]=proffen[i*3+2]=i>>2;
				palle[i*3+1]=proffen[i*3+1]=i>>3;
				palle[i*3+2]=proffen[i*3+0]=i>>4;
			}

			setpal((char *)palle);

			do {
				bitmaprotate(vpage,elitepattern,(float)blipp/40,200+(cos((float)blipp/5)*150));
				updatepal();
				memcpy(video,vpage,64000);
				blipp++;
			}while((ord<2) && !escpressed());

			i=0;
			do
			{
				int xx,yy;
				smooth(vpage);

				xx=160+(cos((float)i*3.1415926535897932/128)*100);
				yy=100+(sin((float)i*3.1415926535897932/64)*70);
				shadebob(vpage,bobhans,xx-16,yy-16);
				updatepal();
				memcpy(video,vpage,64000);
				i++;
			}while((ord<4) && !escpressed());

			do
			{
				smooth(vpage);
				shadebob(vpage,bobhans,rand()%280,rand()%160);
				updatepal();
				memcpy(video,vpage,64000);
			}while((ord<6) && !escpressed());

			do
			{
				memcpy(video,tekst,64000);
				updatepal();
			}while((ord<8) && !escpressed());

			do
			{
				plasma(vpage,blipp);
				smooth(vpage);
				memcpy(video,vpage,64000);
				blipp+=3;
			}while((ord>0) && !escpressed());

			xmpStop();
			setmode3();

			printf("dette var \"eventyret om niels, petter og vennene-hans\n"
			       "  code - sprstekt lk och oppvaskvann\n"
						 "  music - HeiZahn och Dejs\n"
						 "  deszsign - niels och petter\n");
 }
