Mercurial > hg > forks > pwpunix
view oldchsool/sprites.c @ 81:475342949dcd
Kill some warnings and dead code.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 19 Feb 2013 00:38:22 +0200 |
parents | acb5694e93d9 |
children |
line wrap: on
line source
#include "pwpdemo.h" typedef struct { int width,height; u8*pict; u8*mask; }sprite; #include "sprites.h" #include "font.h" void zoomsprite_loop(mask, pict, xzoom, d, xo0, xdim, ydim, spwidth, yzoom, yo0, col) register u8* mask, *pict; register int xzoom, col; u8* d; int xo0, xdim, ydim, spwidth, yzoom, yo0; { register u8 *dd, *m, *p; register int xo, x; for(;ydim;ydim--) { int linebase = (yo0>>8) * spwidth; m = mask + linebase; p = pict + linebase; dd = d; xo = xo0; for(x=xdim;x;x--) { register int z=xo>>8; *dd = (*dd & m[z]) | (p[z]&col); dd++; xo += xzoom; } yo0 += yzoom; d += pwplib_bufw; } } void zoomsprite(int x0,int y0,sprite*sp,int xzoom,int yzoom, int col) { int xdim,ydim, xo0=0,yo0=0; if(xzoom<=32 && yzoom<=32)return; xdim=(sp->width<<8)/xzoom; ydim=(sp->height<<8)/yzoom; x0-=(xdim>>1); y0-=(ydim>>1); if(x0<0) { xdim+=x0; xo0=(0-x0)<<8; x0=0; } if(y0<0) { ydim+=y0; yo0=(0-y0)<<8; y0=0; } if(x0+xdim>=pwplib_bufw) { xdim=pwplib_bufw-x0; } if(y0+ydim>=pwplib_bufh) { ydim=pwplib_bufh-y0; } if(xdim<=0 || ydim<=0) return; zoomsprite_loop ( sp->mask, sp->pict, xzoom, pwplib_buf+x0+y0*pwplib_bufw, xo0, xdim, ydim, sp->width, yzoom, yo0, col ); } /* (mask, pict, xzoom, d, xo0, xdim, ydim, spwidth, yzoom, yo0) */ void zoomsprite_gen(int x0,int y0,sprite*sp,int zoom,int col) { zoomsprite(((x0+128)*pwplib_bufw)>>8, ((y0+128)*pwplib_bufh)>>8, sp, abs((zoom<<8)/pwplib_bufw), abs((zoom<<7)/pwplib_bufh), col ); } /* void metsae(int t,int mode) { int i,x; const sprite*mo[]={&kuusi}; const int mosiz[]={128}; const int mostep[]={64}; for(i=0;i<512;i+=mostep[mode]) { zoomsprite_gen( ((i-t/3)&511)-256 ,0,mo[mode],mosiz[mode]); } } void drawkiller(int tminus) { int ttt=tminus; if(tminus<-64)tminus=-64;else if(tminus>0)tminus=0; zoomsprite_gen(tminus,48,(ttt&16)?&pelustna0:&pelustna1,80); } void encounter(int tminus,int kode,int zoom,int speed) { int ttt=tminus; sprite*pum[][2]= { &krist0,&krist1, &pelusieni,&pelusieni, &pelusieni1,&pelusieni1, &pelusieni2,&pelusieni2, &pelux,&pelux, &pelustna0,&pelustna1, &ruumis,&ruumis, &uusmed0,&uusmed1, &tesno0,&tesno1, &army0,&army0, &windows0,&windows1, &quake0,&quake0 }; if(ttt<0)ttt=0; zoomsprite_gen(0+ttt,48,(tminus&16)?pum[kode][0]:pum[kode][1],zoom); } */ /******************/ char scale[3][8]={ 0x00,0x08,0x80,0x88,0x87,0x77,0xf7,0xff, 0x00,0x08,0x07,0x80,0x88,0x87,0x77,0x7f, 0x00,0x06,0x60,0x66,0x6e,0xe6,0xee,0xef }; char bwpal[8][256]; void bwpals() { int i,j; for(i=0;i<8;i++) { int gamma=rand()&3; int brite=256+(rand()&15)-(rand()&15); int scl=rand()%3; for(j=0;j<256;j++) { int it=((j&1)?1:0)+((j&2)?6:0)+((j&4)?3:0)+((j&8)?5:0)+ ((j&16)?3:0)+((j&32)?12:0)+((j&64)?8:0)+((j&128)?8:0); it+=gamma; it=(it*brite)>>8; if(it>63)it=63; it/=8; bwpal[i][j]=scale[scl][it]; } } } void naarmuta() { int i=pwplib_bufh*pwplib_bufw; static int ph=0,rr=0,nrmx=0; char*d=pwplib_buf; char*lookup=&bwpal[rr&7][0]; ph++;if(!(ph&3))rr=rand(); for(i=100;i;i--) { int z=rand()%(pwplib_bufw*pwplib_bufh); pwplib_buf[z]^=0x87; } for(i=0;i<pwplib_bufh;i++){ pwplib_buf[pwplib_bufw*i+nrmx]&=~0x78; if(!(rand()&7))nrmx+=(rand()&3)-1; if(nrmx<0 || nrmx>=pwplib_bufw) nrmx=rand()%pwplib_bufw; } i=pwplib_bufh*pwplib_bufw; for(;i;i--){*d=lookup[*d];d++;} } #define NUMZOOMS 4 struct zoomer_t { sprite*sprite; int starttime; int startzoom; int zoomspeed; int fadespeed; int dynamic; } zoomer[NUMZOOMS]; void drawtext(sprite*textbuf,char*txt,int col); void initzoomers() { int i=0; for(;i<NUMZOOMS;i++) zoomer[i].sprite=NULL; } void alloczoomer(sprite*s,int starttime,int startzoom, int zoomspeed,int fadespeed,int dynamic) { if(zoomer[0].sprite!=NULL) { int i=NUMZOOMS-2; for(;i>=0;i--) memcpy( &zoomer[i+1], &zoomer[i], sizeof(struct zoomer_t)); } zoomer[0].sprite=s; zoomer[0].starttime=starttime; zoomer[0].startzoom=startzoom; zoomer[0].zoomspeed=zoomspeed; zoomer[0].fadespeed=fadespeed; zoomer[0].dynamic=dynamic; } /* 0x00 -> 0x01 -> 0x11 -> 0x13 -> 0x33 -> 0x37 -> 0x77 -> 0x7f -> 0xff */ void zoomer_free(int i) { if(zoomer[i].dynamic) { free(zoomer[i].sprite->mask); free(zoomer[i].sprite->pict); free(zoomer[i].sprite); } zoomer[i].sprite=NULL; } void zoomer_do(int t) { int i=NUMZOOMS-1,col=0x00; for(;i>=0;i--) if(zoomer[i].sprite!=NULL) { int killit=0; int passed = t-zoomer[i].starttime, zoomlevel = zoomer[i].startzoom+((zoomer[i].zoomspeed*passed)>>8), fadelevel = ((zoomer[i].fadespeed*passed)>>8); { static char orrers[] = { 0x76,0xff,0xfe,0xea, 0xae,0xac,0xaa,0xa9, 0x9a,0x92,0x29,0x22, 0x21,0x12,0x11,0x01 }; if(fadelevel>=20) { killit++; } else col=orrers[fadelevel]; } if(zoomlevel<64)zoomlevel=64; if(killit || zoomlevel>512) { zoomer_free(i); } else zoomsprite_gen(0,0,zoomer[i].sprite,zoomlevel,col); } } /* void addtext(int m) { if(textbuf.width) { zoomsprite_gen(0,0,&textbuf,m); } } */ void pelubounce0(int t) { sprite*c; {int u=(t>>3)&3; if(u==0)c=&pelush0;else if(u==1)c=&pelush1;else if(u==2)c=&pelush2;else c=&pelush1;} {int j=0; for(;j<256;j+=32) zoomsprite_gen(SIN(t+j)>>9,COS(t+j)>>9,c,112,0xff); } } void pelubounce1(int t) { sprite*c; {int u=(t>>3)&3; if(u==0)c=&pelush0;else if(u==1)c=&pelush1;else if(u==2)c=&pelush2;else c=&pelush1;} {int axis0 = SIN(t/3),axis1=0; /* (48*COS(t/3))>>15; */ int j=0; for(;j<256;j+=32) zoomsprite_gen(SIN(t+j)>>9,(axis0*(COS(t+j)>>9))>>15,c, 112+((axis1*SIN(t/3+j))>>15),0xff); } } //zoomsprite(int x0,int y0,sprite*sp,int xzoom,int yzoom, int col) /*************************** boulderdash-related ***********************/ void bdash_do(u8*field,int xbase,int ybase,int zoom,int aniphase) { static sprite*pix[][4] = { {&bdash0,&bdash1,&bdash2,&bdash1}, {&pelush0,&pelush1,&pelush2,&pelush1}, {&brick0,&brick0,&brick0,&brick0}, {&brick1,&brick1,&brick1,&brick1}, {&pelush0,&pelush1,&pelush2,&pelush1}, {&pelush0,&pelush1,&pelush2,&pelush1}, {&pelush0,&pelush1,&pelush2,&pelush1}, {&pelush0,&pelush1,&pelush2,&pelush1}, {&pelush0,&pelush1,&pelush2,&pelush1}, {&pelush0,&pelush1,&pelush2,&pelush1}, {&pelush0,&pelush1,&pelush2,&pelush1}, {&boulder,&boulder,&boulder,&boulder}, {&boulder,&boulder,&boulder,&boulder}, {&splat0,&splat0,&splat0,&splat0}, {&splat1,&splat1,&splat1,&splat1}, {&splat2,&splat2,&splat3,&splat3}, {&splat4,&splat4,&splat4,&splat4}, {&boulder,&boulder,&boulder,&boulder}, {&bdash4,&bdash4,&bdash4,&bdash4}, {&tietzka,&tietzka,&tietzka,&tietzka} }; int x,y; /* 256 == normal size (16 objs per width) */ zoom = (zoom*pwplib.videobuf.width)>>8; /* zoom == width of the whole stuph in pixels */ aniphase&=3; for(y=0;y<16;y++) for(x=0;x<16;x++) { u8 f=*field++; if(f<128) { sprite*c=pix[f&31][aniphase]; zoomsprite(pwplib.videobuf.width/2 + ((x*zoom-((xbase*zoom)>>8))>>4), pwplib.videobuf.height/2 + ((y*zoom-((ybase*zoom)>>8))>>4), c,65536/zoom,65536/zoom,0xff); /* 256*256 / zoom -- */ /* size=16: zoom=256, väli=16 zoomsprite_gen(((x-xbase)*zoom)>>4,((y-ybase)*zoom)>>4,c, (256*16*16)/zoom,0xff); */ } } } enum { Rockford=0, PeluLeft=1,Brick0=2, Brick1=3, PeluRight=4, PeluUp=5, PeluDown=6, PeluLeftMoved=7, PeluRightMoved=8, PeluUpMoved=9, PeluDownMoved=10, Boulder=11, BoulderFalls=12, Splat0=13,Splat1=14,Splat2=15,Splat3=16, BoulderMoved=17,RockfordStanding=18,Tietzka=19, Void=128 }; #define MoveShit(mover,aftermove,afterchk, thispt,movpt,chkpt) \ if(s==(mover)) { \ if((field[(chkpt)&255]<128) && (field[(movpt)&255]>=128)) { \ field[(thispt)&255]=128; field[(movpt)&255]=(aftermove); } else \ field[(thispt)&255]=(afterchk); } void simulate_bdash(u8*field) { int x,y; /* field[rand()&255]=3; */ for(y=0;y<16;y++) for(x=0;x<16;x++) { u8 s=field[y*16+x]; MoveShit(PeluUp,PeluUpMoved,PeluRightMoved,y*16+x,y*16+x-16,y*16+x+1) else MoveShit(PeluDown,PeluDownMoved,PeluLeftMoved,y*16+x,y*16+x+16,y*16+x-1) else MoveShit(PeluRight,PeluRightMoved,PeluDownMoved,y*16+x,y*16+x+1,y*16+x+16) else MoveShit(PeluLeft,PeluLeftMoved,PeluUpMoved,y*16+x,y*16+x-1,y*16+x-16) else if(s==Boulder) { if(field[(y*16+x+16)&255]==128) field[y*16+x]=BoulderFalls; } else if(s==BoulderFalls) { u8 below = field[(y*16+x+16)&255]; if(below==128) { field[y*16+x]=128;field[(y*16+x+16)&255]=BoulderMoved; } else if(below==PeluRight || below==PeluLeft || below==PeluUp || below==PeluDown || below==PeluRightMoved || below==PeluLeftMoved || below==PeluUpMoved || below==PeluDownMoved) { int x1,y1; for(y1=-1;y1<=1;y1++)for(x1=-1;x1<=1;x1++) field[((y+y1)*16+x+x1)&255]=Splat0; } else if((field[(y*16+x+16+1)&255]==128) && (field[(y*16+x+1)&255]==128)) { field[y*16+x]=128;field[(y*16+x+1)&255]=Boulder; } else if((field[(y*16+x+16-1)&255]==128) && (field[(y*16+x-1)&255]==128)) { field[y*16+x]=128;field[(y*16+x-1)&255]=Boulder; } else field[y*16+x]=Boulder; } } for(y=0;y<16;y++) for(x=0;x<16;x++) { u8*s=&field[y*16+x]; if(*s==PeluUpMoved)*s=PeluUp;else if(*s==PeluDownMoved)*s=PeluDown;else if(*s==PeluRightMoved)*s=PeluRight;else if(*s==PeluLeftMoved)*s=PeluLeft;else if(*s==Splat0)*s=Splat1;else if(*s==Splat1)*s=Splat2;else if(*s==Splat2)*s=Splat3;else if(*s==Splat3)*s=Void;else if(*s==BoulderMoved)*s=BoulderFalls; } } /*************************************************************************/ void fadeoldsk(int t) { alloczoomer(&oldsk,t,128,-128,24,0); } void oldskzooms(int t) { zoomsprite_gen(0,32+abs(127-((t<<1)&255))-64,&oldsk,48+abs(64-((t<<2)&127)),0xff); } void newtext(int t,char*txt,int col) { sprite*z = (sprite*)malloc(sizeof(sprite)); drawtext(z,txt,col); alloczoomer(z,t,48,128,24,1); } void drawtext(sprite*textbuf,char*txt,int col) { int wdt=0,x=0,y=0,idx,hgt=7; unsigned char*f,*fnt=font; /* killtext();*/ {char*t=txt; for(;;) {int thiswdt=0; while(*t && *t!='\n'){thiswdt+=font_lengths[(*t>='A'&&*t<=']')?(*t-'@'):4];t++;} if(thiswdt>wdt)wdt=thiswdt; if(!*t)break; else {t++;hgt+=11;} }} textbuf->width=wdt+1; textbuf->height=hgt+1; { int sz=textbuf->height*textbuf->width*sizeof(u8); textbuf->pict=malloc(sz); textbuf->mask=malloc(sz); memset(textbuf->pict,0,sz); memset(textbuf->mask,0xff,sz);} while(*txt) { int z=*txt,a; txt++; if(z=='\n'){x=0;y+=textbuf->width*11;continue;} z-='@'; if(z<0 || z>29){x+=4;continue;} f=fnt; while(z) { if(*f==0)z--; f++; } while((a=*f)) { idx=x+y; for(;a;a>>=1) { if(a&1){textbuf->pict[idx]=col; textbuf->mask[idx]=0; if(textbuf->mask[idx+1+textbuf->width]) { textbuf->pict[idx+textbuf->width+1]= textbuf->mask[idx+textbuf->width+1]=0; } } idx+=textbuf->width; } x++; f++; } x++; /* x+=2; */ } } void rotozoompaski(u8*s,int u0,int v0,int du,int dv) { u8*d=pwplib_buf; int i,j,u,v; int idu=du/pwplib_bufw,idv=dv/pwplib_bufw; for(i=pwplib_bufh;i;i--) { int iu=u,iv=v; for(j=pwplib_bufw;j;j--) { *d++=s[((iu>>4)&(1023&~31))|((iv>>9)&31)]; iu+=idu;iv+=idv; } u+=idv;v+=-idu; } } /* void rotozoom_do(int t,int m) { u8*poo[]={piimae.pict,pelu.pict,taehti.pict}; int u=SIN(t),v=COS(t); rotozoompaski(poo[m],(-u+v)*32,(-v-u)*32,u,v); } */