view final_isi/effu.c @ 71:a87eb778f225

Improvements to the MinGW crossbuild. Should now build with default tools from Debian mingw packages, though you need Win32 version of libSDL with the necessary headers and so on in addition. 64-bit builds not tested and probably won't work. Tested on Debian 7.0, earlier won't work. binutils-mingw-w64-i686 gcc-mingw-w64-i686 mingw-w64-i686-dev
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 14 Aug 2012 03:08:10 +0300
parents c13a2f8c5b10
children deedd4fae98d
line wrap: on
line source

#include "wrapper.h"

#include "fisi.h"

/* #include "dos.h" */

#define uchar unsigned char
#define uint unsigned int
#define sint signed int

#include "sini.h"

extern void waitretrace();
extern signed int mul32(signed int a,signed int b);

/*************** setup *******************/

      char setup_rtc=1;
      char setup_force25=0;
      char setup_nohibit=0;

/*************** multimedia interface **********/

      char buffclass;   /* preparebuff == setmode etc */

      int bgcol=0;
      int txtcol=0;
      int ansifrom=0;

      /*************/

      char fx_main=0;
      char fx_main_spex=0;
      char fx_3d=0;
      char fx_flare=0;

      /*************/

uchar txl[6][20];

/*************** cOnstANTZ eTC *************/

uchar ruutu__[80*25*2];
uchar*ruutu=ruutu__;

uchar symtab[50][80];
uchar videobuf[80*50];  /* 80x50! */
uchar textbuf[80*50];
uchar ansibuf[80*25*2];   /* 80x25! */
/*char xorru[120*75];*/
uchar*abb=ansibuf;
uchar*txb=textbuf;
uchar*vib=videobuf;

/*********/

/***************.: STATiK dEMO mAiNLOOP eT sETUppES :.******************/


/******************.: tABLES, pRECALX :.*********************/

char fadetab[256];            /* fadetaulu on ihan hY™DYKE */
void fadetab_make(char *ft)
{
      int s;char d;
      for(s=0;s<256;s++){
      switch(s&0x88){
	    case(0x88):d=s&~8;break;              /* 99 -> 91 */
	    case(0x80):d=(s&0x70)|(s>>4);break;   /* 91 -> 19 */
	    case(0x08):if(s&0xf0)d=((s&7)<<4)|(s&7);
		       else d=(s&7)<<4; break;	  /* 19 -> 11 */
						  /* 09 -> 10 */
	    case(0x00):
		  if((s&0xf0)&&(s&0x0f))d=s&0xf0; /* 11 -> 10 */
		  else d=s>>4;                    /* 10 -> 01 */
            break;
      }
      *ft++=d;}
}

uchar sqrt[256];
void sqrt_make()
{
      uint l=0,l2=0,sq;       /* m„„rjoukko: 0..255 */
			      /* arvojoukko: 0..255 (=<<8) */
      for(;l<256;l++){
            sq=(l*l)>>8;
	    while(l2<=sq) sqrt[l2++]=l;
      }
      while(l2<=255) sqrt[l2++]=255;
}

/************************ xORRUTUS *************************/

/************************* TUNNELZ ************************/
/************************* TUNNELZ ************************/
/************************* TUNNELZ   etc ******************/

char lenssprite[256]={
0x00,0x00,0x00,0x00,0x00,0x88,0xff,0xff,0xff,0xff,0x88,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
0x00,0x00,0xff,0xff,0xff,0xff,0x77,0x88,0x88,0x77,0xff,0xff,0xff,0xff,0x00,0x00,
0x00,0xff,0xff,0xff,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0xff,0xff,0xff,0x00,
0x88,0xff,0xff,0xff,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0xff,0xff,0xff,0x88,
0xff,0xff,0xff,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0xff,0xff,0xff,
0xff,0xff,0xff,0x88,0x00,0x00,0x00,0x88,0x88,0x00,0x00,0x00,0x88,0xff,0xff,0xff,
0xff,0xff,0xff,0x88,0x00,0x00,0x00,0x88,0x88,0x00,0x00,0x00,0x88,0xff,0xff,0xff,
0xff,0xff,0xff,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0xff,0xff,0xff,
0x88,0xff,0xff,0xff,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0xff,0xff,0xff,0x88,
0x00,0xff,0xff,0xff,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0xff,0xff,0xff,0x00,
0x00,0x00,0xff,0xff,0xff,0xff,0x77,0x88,0x88,0x77,0xff,0xff,0xff,0xff,0x00,0x00,
0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x77,0xff,0xff,0xff,0xff,0x77,0x00,0x00,0x00,0x00,0x00
};


/*
symtab_tunnel()
{
	int x,y;
	uchar*d=symtab[0];
	for(y=0;y<50;y++)
	for(x=0;x<80;x++){
		sint r=(x-40)*(x-40)+(y-25)*(y-25);
		*d++=sqrt[r/10];
	}
}

uchar tunxlat[4*16]={
      0x00,0x00,0x00,0x00,
      0x01,0x01,0x10,0x10,
      0x11,0x11,0x11,0x19,
      0x19,0x91,0x99,0xff,

      0x00,0x08,0x80,0x88,
      0x87,0x78,0x77,0x7f,
      0xff,0xff,0xff,0xff,
      0xfe,0xef,0xee,0xe6,

      0x00,0x00,0x00,0x00,
      0x02,0x02,0x20,0x20,
      0x20,0x22,0x22,0x22,
      0x2a,0x2a,0xa2,0xa2,

      0x00,0x08,0x80,0x88,
      0x87,0x78,0x77,0x7f,
      0xff,0xff,0xff,0xff,
      0xfe,0xef,0xee,0xe6,
      };


xorrutab()
{
	int x,y;
	uchar*d=xorru;
	for(y=0;y<75;y++)
	for(x=0;x<120;x++){
		char joo;
		sint r=(x-60)*(x-60)+(y-37)*(y-37);
		r=sqrt[r/20];
		joo=tunxlat[(r>>3)&15];
		if(r&16)joo^=0xcc;
		*d++=joo;
	}
}

do_xorru(int t)
{
	sint x,y,zoom,q=t/6;
	uchar*s0,*s1;
	uchar*d=videobuf;

	x=sini[t&255];y=sini[(t+64)&255];
	x=20+(x/4);y=12+(y/10);
	s0=xorru+x+120*y;

	x=sini[(-t+q+128+47)&255];y=sini[(-t+q+128+64+22)&255]*zoom;
	x=20+(x/4);y=12+(y/10);
	s1=xorru+x+120*y;

	xorrase(s0,s1,videobuf,bgcol);
}

char paletti[255];

dotunneltxt(int t)
{
	int i,j=0;uchar*d=paletti;
	for(i=64;i;i--){
		j+=i+192;
		*d++=fadetab[tunxlat[((t+(j>>6))>>4)&63]|bgcol];
	}
	for(i=192;i;i--){
		j+=i;
		*d++=tunxlat[((t+(j>>6))>>4)&63]|bgcol;
	}
}
*/

/*
tunxshl()
{
	int l;
	for(l=0;l<16;l++) tunxlat[l]<<=1;
}
*/

/*        ^^3   ^^2  */


/******************.: eFFECTZ hANDLER :.*********************/

char wirez[16]={
        ' ', '¼', 'È', 'Í', '»', 'º', 'Î', 'É',
        'É', 'Î', 'º', '»', 'Í', 'È', '¼', ' ' };

char zbpalli[]={
      0x00,0x01,0x10,0x11,0x13,0x31,0x33,0x3c,0xc3,0xcc,0xcf,0xfc,0xff};

int fps=0,framez,lasttik=0;

void preparebuff(int c)
{
      if(c!=buffclass)
      switch(c){
	case(NONE):case(HYBRID):txtmode(0);
		memfill(ruutu,0x0000,80*25*2);
		memfill(ansibuf,253,80*25*2);
		break;

	case(SINGLE):
                txtmode(1-setup_force25);
                if(!setup_force25)memfill(ruutu,176+256*176,80*50*2);
			     else memfill(ruutu,223+256*223,80*25*2);
		break;
      }
	buffclass=c;
}

/*
txtmode(int c)
{
  #ifdef MSDOS
      _AX=0x0003;_BX=0;geninterrupt(0x10);
      _AX=0x1003;_BX=0;geninterrupt(0x10);
      if (c){_AX=0x1112;_BX=0;geninterrupt(0x10);}
  #else
  #endif
}
*/

/**********************************/

framekey o0[7]={
      40*32,40*32,1024,  /* OX */
      25*32,25*32,1024,  /* OY */
      25000,25000,1024,  /* OZOOM */
      0,0,1024,          /* OROT */

      25*256,25*256,4096,/* OHGT */
      0*256,0*256,4096,/* OFLX */
      0*256,0*256,4096 /* OFLY */
};

char ltcols[]={
      0x00,
      0x00,
      0x00,
      0x80,
      0x00,
      0x08,
      0x88,
      0x88,
      0x87,
      0x78,
      0x77,
      0x87,
      0x7e,
      0xe7,
      0xe6,
      0xee,
      0xef,
      0xfe,
      0xf7,
      0xff,
      0xff,
      0xff,
      0xff
};

uchar*ltloc;
void doltsrc(char*b,int x,int y,int lev)
{
      int i;char*tmp;
      x+=40;y+=25;
      b+=x+y*80;ltloc=b;

      *b=0xff;

      tmp=b;
      i=lev;if(i>x-1)i=x-1;
            if(i>0)
            while(i--){tmp--;*tmp|=ltcols[i+(rand()&3)];}
      tmp=b;
      i=lev;if(i>79-x)i=79-x;
            if(i>0)
            while(i--){tmp++;*tmp|=ltcols[i+(rand()&3)];}

      tmp=b;
      i=lev;if(i>y-1)i=y-1;
            if(i>0)
            while(i--){tmp-=80;*tmp|=ltcols[i+(rand()&3)];}

      tmp=b;
      i=lev;if(i>49-y)i=49-y;
            if(i>0)
            while(i--){tmp+=80;*tmp|=ltcols[i+(rand()&3)];}
}

/********************************************/

void psetpic(char *buf, char *pic, sint x, sint y, int xsize, int ysize,int method)
{
      sint xstart=0,ystart=0,xclip=xsize,yclip=ysize;
      x-=(xsize>>1);y-=(ysize>>1);

      if (x>=0-xsize) if (x<=80+xsize)
      if (y>=0-ysize) if (y<=50+ysize){

      if (x<0){xstart=0-x;xclip-=xstart;x=0;}
      if (y<0){ystart=0-y;yclip-=ystart;y=0;}

      if (x+xclip>79) xclip-=abs((x+xclip)-79);
      if (y+yclip>49) yclip-=abs((y+yclip)-49);

      if (xclip>0) if (yclip>0)
      picmov(pic+xsize*ystart+xstart,
             buf+y*80+x,
             xsize,xclip,yclip,method);
}}

char lensb[256],lensg[256],lensr[256];

void lflare_do(signed int x,signed int y)
{
	if(abs(x)<40*4)if(abs(y)<25*4)
	if(*ltloc==0xff){
	    doltsrc(videobuf,(x+(rand()&1)) >>2,(y+(rand()&1)) >>2,20);
	    psetpic(videobuf,lensr,40-(x>>3),25-(y>>3),16,16,1);
	    psetpic(videobuf,lensb,40-(x>>2),25-(y>>2),16,16,1);
	    psetpic(videobuf,lensg,40-(x>>1),25-(y>>1),16,16,1);
        }
}

void flarez_init()
{
	char*s=lenssprite;
	char*d0=lensb,*d1=lensg,*d2=lensr;
	int i;
	for(i=256;i;i--){*d0++=*s&0x9c;
	*d1++=*s&0x9a;*d2++=*s++&0xec;}
}


void do3ddezign(int tskip)
{
      int i;
      for(i=0;i<7;i++){
            o0[i].curr+=
            tskip*mul32(o0[i].targ-o0[i].curr,o0[i].frac);
      }

      if(o0[OZOOM].curr>100)eggine_do(videobuf,o0[OROT].curr&255,
      o0[OZOOM].curr,o0[OX].curr,o0[OY].curr);
}

void precalx()
{
/*      cprintf("cREATiNG!!! ");*/
	fillbuf(textbuf,0,80*50);
      eggine_init();
      flarez_init();
}

void effu(int t)
{
      static int lastt=0;
      char*ggg;

      switch(buffclass){
	    case(SINGLE):
	       #ifdef MSDOS
		  if(!setup_force25)
	       #endif
			if(txtcol)
                                attr2dump(textbuf,videobuf,ruutu+1,
					80*50,txtcol);
			else
				attrdump(videobuf,ruutu+1,80*50);
		#ifdef MSDOS
		  else{
			int z=0xf0f0;if(setup_nohibit)z=0x7070;
			if(!txtcol)
			dump16(videobuf,ruutu,z);else
			dump216(textbuf,videobuf,ruutu,txtcol,z);
		  }
		#endif
		  break;

	    case(HYBRID):
                if(ansifrom)ggg=ansibuf;else ggg=textbuf;
                if(ansifrom==2)if(t&16)ggg=textbuf;
                dumphybrid(ggg,videobuf,ruutu);
		break;
      }

/*      framez++;gotoxy(1,1);textcolor(15);cprintf("%i  %i  %i  ..%i           ",taimeri,buffclass,fps,fx_3d);
      if (taimeri>lasttik+70) { lasttik=taimeri;fps=framez;framez=0;}*/

      /*** EFFUEZ ***/

/*      o0[OFLX].curr=sini[(t/3)&255]*30;
      o0[OFLY].curr=sini[(t+64)&255]*30;*/

      if (buffclass){
	int c=bgcol;
	if(buffclass==1)c*=0x101;

	/*if(fx_main==NONE)fillbuf(videobuf,c,80*50);*/

	if(fx_main==SCROLLER)scroller_do(videobuf,t,o0[OHGT].curr>>8);

        if(fx_flare)
	    doltsrc(videobuf,o0[OFLX].curr>>8,o0[OFLY].curr>>8,10);
	if(fx_3d)do3ddezign(t-lastt);
	if(fx_flare)lflare_do(o0[OFLX].curr>>6,o0[OFLY].curr>>6);
	    }
     /**************/


        lastt=t;
}

/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/
/*****************************************/