#include "stdio.h"
#include <stdlib.h>
#include <dos.h>
#include <conio.h>
#include <math.h>

#define PI 3.141
#define YMAX 50
#define XMAX 80
#define YMIN 0
#define XMIN 0
#define Dframe 1

  #if !defined(PI)
    #define PI 3.1415927
  #endif

  #if !defined(VGA)
    #define VGA 0xA000
  #endif

struct REGPACK rp;

/* Define Global for wavetable*/
unsigned char waves[256];
unsigned char Pall[256][3], Pall2[256][3];
unsigned char *vga = (unsigned char *) MK_FP(0xA000, 0);

char far *ruutu = (char far *) 0xb8000000;
void Set50L()       {

        rp.r_ax=0x1112;
        rp.r_bx=0;
        intr(0x10,&rp);
        rp.r_ax=0x1200;
        rp.r_bx=0x20;
        intr(0x10,&rp);

}

void Pal(unsigned char ColorNo, unsigned char R,
	 unsigned char G,       unsigned char B)
	 {

  outp (0x03C8,ColorNo); /* here is the pallette color I want to set  */
  outp (0x03C9,R);
  outp (0x03C9,G);
  outp (0x03C9,B);

}
void SetMCGA() {
  _AX = 0x0013;
  geninterrupt (0x10);
}
void SetText() {
  _AX = 0x0003;
  geninterrupt (0x10);
}

/* Create Wavetable */
void create_wave()
{
	int i;
	for (i=0; i<256;i++)
		waves[i] = (unsigned char) (40*(1+sin(i*2*PI/256)));
}

/* Play Plasma routine  */
void plasmah()
{
	int x,y,l,temp=0, colnum=0, redvalue=0;
	unsigned char pos1, pos2, pos3, pos4;
	unsigned char tps1, tps2, tps3, tps4;
	unsigned char spd1, spd2, spd3, spd4;
	unsigned char col;
	int ymaxi=YMAX, xmaxi=XMAX, ymin=YMIN, xmin=XMIN;

	create_wave();  /* Create the wave table*/

	/* Set up the variables for the plasma*/
	spd1=1;spd2=2;spd3=3;spd4=4;
	pos1=pos2=pos3=pos4=0;

/*	Set50L();*/


	for(l=0;l<8000;ruutu[l+=2]='v',ruutu[l+=2]='l',ruutu[l+=2]='p');


	for(l=0;l<255;l++){Pal(l,l,0,0);}

		 l=0;
	while (l++<40) {      /* Repeat the effect until keypress*/

		/* Increment to next frame*/
		tps1=pos1; tps2=pos2; y=0;

		while (y<ymaxi){ /* loop for Y*/

			tps3=pos3; tps4=pos4; x=0;
			/*x=x+random(3);*/
			while (x<xmaxi){ /* Loop for X*/

					Pal(0,60,0,0);
					col=waves[tps1]+waves[tps2]+waves[tps3]+
					    waves[tps4];

					/*ruutu[(y*160)+x*2]=col;*/
					ruutu[(y*160)+x*2+1]=col/2+10;



				tps3++; tps4+=1;
				x++;
					Pal(0,0,50,0);
				}

			tps1+=1; tps2++;
			pos1+=spd1;
			pos2+=spd2;
			pos3+=spd3;
			pos4+=spd4;
			y++;

			}

	} /* End of the routine           */

	SetText();
	printf("\n terve");
	/* Reset the screen to text mode*/
}





















#define paa(x,y,b) ruutu[x*160+y*2]=b;
#define vari(x,y,b) ruutu[x*160+y*2+1]=b;




static unsigned char isot_kirjaimet[3][24*11] =
{

1,1,1,1,0,0,0,0,0,0,0,
1,1,1,1,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,1,1,
0,1,1,0,0,0,0,0,0,1,1,
1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,


1,1,1,0,0,0,0,0,1,1,1,
1,1,1,0,0,0,0,0,1,1,1,
0,1,1,0,0,0,0,0,0,1,1,
0,1,1,0,0,0,0,0,0,1,1,
0,1,1,0,0,0,0,0,0,1,1,
0,1,1,0,0,0,0,0,0,1,1,
0,1,1,0,0,0,0,0,0,1,1,
0,1,1,0,0,0,0,0,0,1,1,
0,1,1,0,0,0,0,0,0,1,1,
0,1,1,0,0,0,0,0,0,1,1,
0,1,1,0,0,0,0,0,0,1,1,
0,1,1,0,0,0,0,0,0,1,1,
0,1,1,0,0,0,0,0,0,1,1,
0,1,1,2,0,0,0,0,0,1,1,
0,3,1,3,0,0,0,0,0,1,1,
0,2,1,1,2,0,0,0,0,1,1,
0,0,3,1,3,0,0,0,2,1,1,
0,0,2,1,1,2,0,0,3,1,3,
0,0,0,3,1,3,0,2,1,1,2,
0,0,0,2,1,1,2,3,1,3,0,
0,0,0,0,3,1,3,1,1,2,0,
0,0,0,0,2,1,1,1,3,0,0,
0,0,0,0,0,3,1,1,2,0,0,
0,0,0,0,0,0,1,3,0,0,0,


1,1,1,1,1,1,3,2,0,0,0,
1,1,1,1,1,1,1,1,3,0,0,
1,1,0,0,0,2,3,1,1,2,0,
1,1,0,0,0,0,0,3,1,3,0,
1,1,0,0,0,0,0,2,1,1,0,
1,1,0,0,0,0,0,2,1,1,0,
1,1,0,0,0,0,0,3,1,3,0,
1,1,0,0,0,0,0,1,1,2,0,
1,1,0,0,0,0,3,1,3,0,0,
1,1,0,0,0,3,1,1,2,0,0,
1,1,1,1,1,1,1,3,0,0,0,
1,1,1,1,1,1,3,0,0,0,0,
1,1,0,0,0,0,0,0,0,0,0,
1,1,0,0,0,0,0,0,0,0,0,
1,1,0,0,0,0,0,0,0,0,0,
1,1,0,0,0,0,0,0,0,0,0,
1,1,0,0,0,0,0,0,0,0,0,
1,1,0,0,0,0,0,0,0,0,0,
1,1,0,0,0,0,0,0,0,0,0,
1,1,0,0,0,0,0,0,0,0,0,
1,1,0,0,0,0,0,0,0,0,0,
1,1,0,0,0,0,0,0,0,0,0,
1,1,1,0,0,0,0,0,0,0,0,
1,1,1,0,0,0,0,0,0,0,0
};

void jutska(int corna, int cornb, int side) {

	long int l,l2,c,j;
	float z,x,y;

	for(l=0;l<50;l++) {
		for(l2=0;l2<80;l2++) {
		x=corna+((side * (l <<7)) / (80<<7));
		y=cornb+((side * (l2 <<7))/ (50<<7));
		z=x*x+y*y;
		c=z;
		j=c%2;
		if(j==0) {
			  ruutu[((l*160)+(l2<<1))]=14;
			/*  ruutu[((l*160)+(l2<<1))+1]=14*/;
		}
		else {ruutu[((l*160)+(l2<<1))]=0;
		     /*ruutu[((l*160)+(l2<<1))]=0;*/}
		}
	}

}



tulijutska(){

	int l,l2=0,t;
	while(l2++<25) {
		for(l=1;l<8000;l=l+2) {
			  t=ruutu[l-160]+ruutu[l+160]+ruutu[l-2]+ruutu[l+2]/4;
			  ruutu[l]=t-1;

		}
	}
}
#define SOLUJA 80
#define LONG_TIME 35

void solukkoToRuutu(unsigned char *s) {
	int i,l;

	for(l=0;l<8000;ruutu[l++]=1);

	for(l=0;l<50;l++) {

	for(i=0; i<SOLUJA; ++i)
	ruutu[l*160+i*2]= s[i] ? '#' : ' ';


	}
/*	for(i=0; i<50; ++i)
	 memcpy(ruutu+i*160, ruutu, 160);*/

}
#define MAX 60
main() {
      int l,l2,c=0,v,v1,v2,v3,jutskah=0;
      unsigned char x,y,x2,y2,jee=19,jee2=0;
      unsigned char jeex[20];
      unsigned char jeey[20];
      unsigned char kakka=0;
      unsigned char solukko[2][SOLUJA];


      float r=0,rr=0.01;
      int cc,ccc,max=20;
      int xxx[MAX],yyy[MAX],xx[MAX],yy[MAX],vv[MAX];
      int i,j,k;





      for(l=0;l<20;l++){jeex[l]=0;jeey[l]=random(256);};

       Set50L();



printf("\n\n\n\n\n\n");
printf("                     OOO.                          \n");
printf("                      'OO.                         \n");
printf("                .OOO.  'OO.        .OOO. .OOOOO.   \n");
printf("               .OO OO   'OOO.     .O  'O OO  'OO.  \n");
printf("               OO  OO.    'OO     O'   OOO'   OOOO \n");
printf("               O    OOO.   'O     O    OOO    'OOO.\n");
printf("       OOO      O   .OOO   OO          O'      'OOO\n");
printf("       'OO.        .OOO'   OO          O        OOO\n");
printf("        OOO        OOO'    OO          O       .OOO\n");
printf("        'OO.      .OO'    .OO          O.     .OOO'\n");
printf("         OOO     .OOO    .OO           OOOO.  OO'\n");
printf("         'OO.   .OOO'    OOO.   .OOOO .O 'OOOOO'\n");
printf("          'OOO. OOO'     'OOOOOOOOO'  OO   \n");
printf("            'OOOOO'                  .OO   \n");
printf("                                    .OO'   \n");
printf("                                    OO'    \n");
printf("                                    OO     \n");
printf("        VIRTU AALINEN VALO PUNMPPU.OO      \n");
printf("                                   OO'\n");
sleep(5);






       for(l=0;l<8000;){
		ruutu[l++]='v';
		ruutu[l++]=1;
		ruutu[l++]='l';
		ruutu[l++]=4;
		ruutu[l++]='p';
		ruutu[l++]=5;
       }
/*       for(l=0;l<8000;l=l+2){ruutu[l+1]=1;}*/

	randomize();
/*       jutska(random(100)-50,random(100)-50,random(200)-100);*/
	while(jutskah++<6/*50*/) {

		Pal(0,kakka++,0,0);
		printf("vlp");
		for(l2=0;l2<50;l2++) {
			c=random(4);
			if (c==0) x--;
			else if (c==1) x++;
			else if (c==2) y--;
			else if (c==3) y++;
			if(x>79)x=79;
			if(y>49)y=49;
			ruutu[y*160+x*2]=ruutu[y*160+x*2]+1;
			if(x==0)x=1;

			if(y==0)y=1;
			c=random(4);
			if (c==0) x2--;
			else if (c==1) x2++;
			else if (c==2) y2--;
			else if (c==3) y2++;
			if(x2>79)x2=79;
			if(y2>49)y2=49;
			ruutu[y2*160+x2*2]=0;
			if(x2==0)x2=1;
			if(y2==0)y2=1;


		}
		Pal(0,255,255,0);
		printf("vlp");

       }
	for(l=0;l<8000;l++)ruutu[l]=10;


       for(l=0;l<8000;) {ruutu[l++]='v';ruutu[l++]='l';ruutu[l++]='p';}
	l2=0;
	for(l=0;l<255;l++) {
		Pal(l,l<<2,0,0);
	}

/*	tulijutska();
	plasmah();*/
	for(l=0;l<8000;l++) ruutu[l]=0;
	l2=0;v=0;
	printf("\n\n\n\n\n\n\n\n\n\n\n\bvlp vlp vlp vlp vlp virtuaalinen valopumppu vlp vlp vlp vlp");
	for(l=0;l<400000;l++) {

		Pal(0,63,0,0);
		delay(1);
		Pal(0,50,0,0);
		delay(1);
		Pal(0,40,0,0);
		delay(1);
		Pal(0,30,0,0);
		delay(1);
		Pal(0,20,0,0);
		delay(1);
		Pal(0,10,0,0);
		delay(1);

		Pal(0,0,0,0);
		delay(1);
		Pal(0,10,0,0);
		delay(1);
		Pal(0,20,0,0);
		delay(1);
		Pal(0,30,0,0);
		delay(1);
		Pal(0,40,0,0);
		delay(1);
		Pal(0,50,0,0);
		delay(1);
		Pal(0,63,0,0);
		delay(1);


	}

	Pal(1,0,0,0);
	SetText();Set50L();

	for(i=0;i<SOLUJA;++i) solukko[0][i]=rand()%2;

	for(j=0; j<LONG_TIME; ++j) {
	 solukko[(j+1)%2][0]= solukko[j%2][0] || solukko[j%2][1];
	 solukko[(j+1)%2][SOLUJA-1]=solukko[j%2][SOLUJA-1] || solukko[j%2][SOLUJA-2];

	 for(i=1; i<SOLUJA-1; ++i)
	  solukko[(j+1)%2][i]=(solukko[j%2][i] &&
	  !(solukko[j%2][i-1] && solukko[j%2][i+1])) ||
	  (!solukko[j%2][i] && (solukko[j%2][i-1] || solukko[j%2][i+1]));


	  solukkoToRuutu(solukko[(j+1)%2]);
	  delay(100);

	}

	for(l=0;l<8000;l+=2) ruutu[l]=0;

       printf("hit elitekey to exit");
       for(cc=1;cc<max;cc++){xx[cc]=-30+random(60);yy[cc]=-25+random(50);vv[cc]=random(12);}


       x=cos(r)*x+y*sin(r);
       y=cos(r)*x-y*sin(r);


       while(!kbhit()){
       rr=rr+0.0001;
       r=r+rr;
       ruutu[20*160+80]=random(255);

       for(cc=1;cc<max;cc++){

	xxx[cc]=sin(r)*xx[cc]+40;
	yyy[cc]=cos(r)*yy[cc]+25;
       ruutu[yyy[cc]*160+xxx[cc]*2]=random(255);
       ruutu[yyy[cc]*160+xxx[cc]*2+1]=vv[cc];
       }




       }



	SetText();
	printf("ei oo ennenk„„n osattu mit„„n - \n vlp \n- laatua talossa");
	printf("2000. fuckken millennium vlp produktions\n");
	printf("nosfe ja aropupu \"koodas\" ");
	printf("live musan teki twn\n");
	printf("\n my” ollaan jo 5v vanha.\n ");

}


