#include"main.h"
#include"phong.h"
#include"phong2.h"


int ccx=110,ccy=110,ccxadd=-3,ccyadd=-1;        //
int ccx1=40,ccy1=110,ccxadd1=2,ccyadd1=3;
int ccx2=210,ccy2=40,ccxadd2=-4,ccyadd2=-2;      //
int ccx3=240,ccy3=60,ccxadd3=2,ccyadd3=4;
int ccx4=60,ccy4=140,ccxadd4=-4,ccyadd4=-3;     //
int ccx5=160,ccy5=160,ccxadd5=3,ccyadd5=5;

/* ==(procedures)======================================================================= */
/* ===================================================================================== */
void put_pixel(int x,int y,char r,char g,char b){
  buffer[y*(X_RES<<2)+(x<<2)]=r;
  buffer[y*(X_RES<<2)+(x<<2)+1]=g;
  buffer[y*(X_RES<<2)+(x<<2)+2]=b;
}

void put_pixel_sw(int x,int y,char r,char g,char b){
  schweif[y*(X_RES<<2)+(x<<2)]=r;
  schweif[y*(X_RES<<2)+(x<<2)+1]=g;
  schweif[y*(X_RES<<2)+(x<<2)+2]=b;
}

void line(int x, int y, int x2, int y2, int c, unsigned char *pal)
{
  int i, steep = 0, sx, sy, dx, dy, e, xx, yy;
  c*=3;

  dx = abs(x2 - x);
  sx = ((x2 - x) > 0) ? 1 : -1;
  dy = abs(y2 - y);
  sy = ((y2 - y) > 0) ? 1 : -1;

  if(dy > dx) {
    steep = 1;
    x ^= y;  // swap x and y
    y ^= x;
    x ^= y;
    dx ^= dy; // swap dx and dy
    dy ^= dx;
    dx ^= dy;
    sx ^= sy; // swap sx and sy
    sy ^= sx;
    sx ^= sy;
  }

  xx=x;
  yy=y;

  e = (dy<<1)-dx;

  for (i = 0;i < dx;i++)
  {

      if (steep!=0)
      {
         if ((x<199)&&(x>0))
            asmputpixel2(xtab[x]+(y<<2)  ,pal[c],pal[c+1],pal[c+2]);
         if ((xx<199)&&(xx>0))
            asmputpixel2(xtab[xx]+(yy<<2),pal[c],pal[c+1],pal[c+2]);/**/
      }
      else
      {
         if ((y<199)&&(y>0))
            asmputpixel2(xtab[y]+(x<<2)  ,pal[c],pal[c+1],pal[c+2]);
         if ((yy<199)&&(yy>0))
            asmputpixel2(xtab[yy]+(xx<<2),pal[c],pal[c+1],pal[c+2]);/**/
      }

      while(e >= 0){
         y  += sy;
         yy -= sy;
         e  -= dx<<1;
      }

      x  += sx;
      xx -= sx;
      e  += dy<<1;

      if (c>18) c-=18;
      if (c>9) c-=9;
      if (c>3) c-=3;
      if (c<4)  break;/**/

  }
}




void init_demo(){
int x,i;
unsigned char r,g,b;
float v,vadd;
	v=0.0;
	vadd=(2.0*PI/256.0);
        for (x=0;x<256;x++){
                cosine[x] =(cos(v)*75);
                sine[x]   =(sin(v)*75);
                cosine2[x]=cos(v)*47;   //kreisradius des sternes (NICHT metastuff)
                sine2[x]  =sin(v)*47;
                cosine3[x]=cos(v)*25;
                sine3[x]  =sin(v)*25;

                v+=vadd;
        }
	for (i=0; i<256; i++){
if (phong[i*3+0]>5)       	phong[i*3+0]-= 5; else phong[i*3+0]=0;
if (phong[i*3+1]>5)        	phong[i*3+1]-= 5; else phong[i*3+1]=0;
if (phong[i*3+2]>5)        	phong[i*3+2]-= 5; else phong[i*3+2]=0;
}

	for (i=0; i<256; i++){
        	phong[i*3+2]+=25;
//                phong2[i*3]>>=1;
//                phong2[i*3+1]<<=1;
	}

        for (x=0;x<Y_RES;x++)
            xtab[x]=x*1280;
}


void do_metastuff(int originx,int originy,unsigned char color){
int x,y,a,b;
for (x=0;x<127;x++){
           a=originx+cosine2[x];
           b=originy+sine2[x];
           line(originx,originy,a,b,color,phong2);
         }
}


void do_starstuff(int originx,int originy,int staerke){
int x,y,a,b;
         for (x=0;x<127;x+=staerke){
           a=originx+cosine2[x];
           b=originy+sine2[x];
           line(originx,originy,a,b,random()%255,phong);
         }

}


void draw_nd_update_stuff(unsigned char bb, unsigned char bb1, unsigned char bb2){
do_starstuff(ccx,                       ccy,2);
do_metastuff(ccx+cosine3[bb],           ccy+sine3[bb],120);
do_metastuff(ccx+cosine3[(bb+128)%255], ccy+sine3[(bb+128)%255],100);

do_starstuff(ccx1,ccy1,1);

do_starstuff(ccx2,                        ccy2,2);
do_metastuff(ccx2+cosine3[bb1],           ccy2+sine3[bb1],120);
do_metastuff(ccx2+cosine3[(bb1+128)%255], ccy2+sine3[(bb1+128)%255],110);

do_starstuff(ccx3,ccy3,1);

do_starstuff(ccx4,                       ccy4,2);
do_metastuff(ccx4+cosine3[bb2],           ccy4+sine3[bb2],130);
do_metastuff(ccx4+cosine3[(bb2+128)%255], ccy4+sine3[(bb2+128)%255],110);

do_starstuff(ccx5,ccy5,1);

ccx+=ccxadd;
if ((ccx>280)||(ccx<35)) ccxadd=0-ccxadd;
ccy+=ccyadd;
if ((ccy>170)||(ccy<35)) ccyadd=0-ccyadd;

ccx1+=ccxadd1;
if ((ccx1>280)||(ccx1<35)) ccxadd1=0-ccxadd1;
ccy1+=ccyadd1;
if ((ccy1>170)||(ccy1<35)) ccyadd1=0-ccyadd1;

ccx2+=ccxadd2;
if ((ccx2>280)||(ccx2<35)) ccxadd2=0-ccxadd2;
ccy2+=ccyadd2;
if ((ccy2>170)||(ccy2<35)) ccyadd2=0-ccyadd2;

ccx4+=ccxadd4;
if ((ccx4>280)||(ccx4<35)) ccxadd4=0-ccxadd4;
ccy4+=ccyadd4;
if ((ccy4>170)||(ccy4<35)) ccyadd4=0-ccyadd4;

ccx3+=ccxadd3;
if ((ccx3>280)||(ccx3<35)) ccxadd3=0-ccxadd3;
ccy3+=ccyadd3;
if ((ccy3>170)||(ccy3<35)) ccyadd3=0-ccyadd3;

ccx5+=ccxadd5;
if ((ccx5>280)||(ccx5<35)) ccxadd5=0-ccxadd5;
ccy5+=ccyadd5;
if ((ccy5>170)||(ccy5<35)) ccyadd5=0-ccyadd5;
}

void fill_exc_logo(){
            ccx =88;
            ccy =87;
            ccx1=127;
            ccy1=87;
            ccx2=165;
            ccy2=87;
            ccx3=196;
            ccy3=65;
            ccx5=218;
            ccy5=87;
            ccx4=253;
            ccy4=87;
}


void do_fire(int originx,int originy,int xadd, int xer, int yer,int drift){
//xer=neigung, wenn wert 100+ ist neigung nach rechts
//yer=speed
int x,y;
int yy=0,xx=0,col=245;
int ycount=0,xcount=0;
signed int a,b;
float fl=0.0;                       //19000
float fadd=(float)(Y_RES-originy)/(20000-(y>>8));
//for (x=0;x<1024*1;x++){
for (x=1024;x>1;x--){
           a=originx+cosine3[(x+xadd)%256]*fl;
           b=originy+sine3[(x+xadd)%256]*fl;
           fl+=fadd;                                    //form wird immer grsser
           b-=yy;
           if (xer>100) a+=xx; else a-=xx;
           if (a>318) break; //a=318;                   //a= x position
           if (b>196) break; //b=196;                   //b= y position
           if (a<3) break; //a=3;
           if (b<3) break; //b=3;

           if ((x%4)==0) col--;//4
           if (col<1) break;//15
     asmdrawblock(schweif, xtab[b]+((a-2)<<2), (((col>>1)<<8)+(col>>1)<<8)+(col>>1)*1.6); // FLOAT !!!!!
//     asmdrawblock(schweif, (b)*(X_RES<<2)+((a-2)<<2), (((col>>1)<<8)+(col>>1)<<8)+(col>>1));
//                         ^x/y werte in edi          ^32bit farbe erzeugen

           if (ycount==0)
              { yy++;
            if (b<drift) ycount=yer;
//  if (b>130) ycount=yer;
              //yer = y speed, drif=ab jetzt nach rechts/links driften
              } else ycount--;

           if (xcount==0)
              { xx++;                                   //xer = neigung
//if (b>100)
                if (xer>100) xcount=xer-100; else xcount=xer;
              } else xcount--;

}
}



int main(int argc,char *argv[])
{
        int x,y;
        long frames=0;
        long l,ll;
        int smok_shak=0;
        unsigned char bb=60,bb1=4,bb2=44;
        double fps;

        time_t tim2;
        time_t tim;
        int a=25;

        __djgpp_nearptr_enable();
        init_demo_system(X_RES,Y_RES,BPP);
	srand(0x46c);
        init_demo();
        memset(buffer,0,320*200*4);
        memset(schweif,0,320*200*4);
        convert2432(logo,logo32,320*200);
        convert2432(smokelogo,smokelogo32,320*200);
        initasmcode();                    //buffers auf 0 setzen
        memset(screen,0,X_RES*Y_RES*4);
        do_plasma_precalc();
        x=y=p1=p2=p3=p4=0;


        for (x=0;x<320*200*4;x++) {
          logo32[x]>>=1;
          smokelogo32[x]>>=2;
        }
        memset(blur_buffer,0,21*320*4);
        tim = time (NULL);
        sleep(1);

        x=30;

        while( (!kbhit()) /*(frames<100)/*/ ){
/*
            if (a>0){
               fill_exc_logo();
               a--;
            }
            draw_nd_update_stuff(bb,bb1,bb2);
            bb-=9;
            bb1+=8;
            bb2-=7;

/**/
/*
do_fire(151, 171,234+x    ,26+(sine[(smok_shak+222)%256]>>3)  ,8, 160-(sine2[(smok_shak    )%256]>>3));
do_fire(151, 171,128+x    ,45+(sine[smok_shak%256]>>2)        ,8, 160-(sine2[(smok_shak+32 )%256]>>3));
do_fire(152, 171,98+x     ,60+(sine[(smok_shak+44)%256]>>1)   ,8, 160+(sine2[(smok_shak+64 )%256]>>2));
do_fire(152, 171,(x>>1)   ,28+(sine[(smok_shak+122)%256]>>3)  ,7, 160+(sine2[(smok_shak+96 )%256]>>3));
do_fire(153, 171,x        ,44+(sine3[(smok_shak+222)%256]>>1) ,7, 160-(sine2[(smok_shak+128)%256]>>2));
do_fire(153, 171,234+x    ,10                                 ,6, 160+(sine2[(smok_shak+160)%256]>>3));
do_fire(154, 171,158+x    ,162+(sine[    (smok_shak)%256]>>2) ,6, 160+(sine2[(smok_shak+192)%256]>>3));
do_fire(154, 171,58+(x>>1),148+(sine[(smok_shak+142)%256]>>2) ,5, 160+(sine3[(smok_shak+224)%256]>>1));

do_metastuff(70,180,180);
do_metastuff(30+((frames)%100),180,180);
//do_starstuff(220,40,3);
//schweif

x+=16;          //16
smok_shak+=5;  //6
*/
//for (x=0;x<13;x++)//80 30
//    do_metastuff(160+random()%150,110+random()%80,(random()%150)+50);
for (x=0;x<50;x++)//80 30
    do_metastuff(20+random()%280,20+random()%160,(random()%150)+50);

            asmblurscreenrgb(15);

            do_timestuff(frames,tim);
//          __write13h2(0,"\\CREDS\\[[\0",random()%12+3,140<<2);0
/*            x=random()%13+3;
            __write13h2(0,"`D[[\0",x,(35)<<2);
            __write13h2(0,"\\CODE\\[[\0",x,(60)<<2);
            __write13h(0,"IQUITO[[[[[[\0",x,(85)<<2);

            do_plasma();

for (x=4;x<320*200*4;x+=4){
 l=(long)screen[x];
if (l!=0) (long)schweif[x]=l;
 l=(long)screen[x+1];
if (l!=0) (long)schweif[x+1]=l;
 l=(long)screen[x+2];
if (l!=0) (long)schweif[x+2]=l;
}
memset(screen,0,320*200*4);
/**/
/*            for (l=0;l<320*100*4;l+=4){ //bertrgt das logo wenn screen!=0 ist
                if ((long)schweif[l]!=0) schweif[l]+=(long)smokelogo32[l];
            }
/**/

  //          blitscreen3216(screen,vid_point,X_RES*Y_RES);
            blitscreen3216(schweif,vid_point,X_RES*Y_RES);
//            memcpy(vid_point,schweif,320*200*4);
//            asmcalcbuffer();  //buffer[x]=schweif[x]+logo32[x];/**/
//memset(schweif,0x31337333,320*200*4);
            frames++;

        }

  tim2 = time(NULL);

  exit_demo_system();

  fps=frames/difftime(tim2,tim);

  printf("\nfps: %f (%u frames in %f seconds)",fps,frames,difftime(tim2,tim));

  return 0;
}
/* ===================================================================================== */
