diff options
Diffstat (limited to 'Src/nsv/nsvplay/about.h')
-rw-r--r-- | Src/nsv/nsvplay/about.h | 661 |
1 files changed, 661 insertions, 0 deletions
diff --git a/Src/nsv/nsvplay/about.h b/Src/nsv/nsvplay/about.h new file mode 100644 index 00000000..a04e48d6 --- /dev/null +++ b/Src/nsv/nsvplay/about.h @@ -0,0 +1,661 @@ +#ifndef _ABOUT_H_ +#define _ABOUT_H_ + +#include <math.h> + + +#pragma warning(disable : 4731) + +static HWND about_hwnd; + +#ifndef NO_ABOUT_EGG + +#define BITMAP_W 100 +#define BITMAP_H 64 +static HDC m_hdc; +static HBITMAP m_hbm; +static char *m_dib; +static char ge_fbuf[(BITMAP_H+1)*BITMAP_W+1]; +static int ge_tmp; +#define M_NUM_FX 9 +static int m_effect; +#define BLOBS_NPOINTS 8 +static int BLOBPOINTS[4*BLOBS_NPOINTS]; +static int fire_textcnt,fire_textpos; +static char *fire_texts[]={ + "nsvplay", + "Nullsoft 2003-8", + "", + "greets to", + "winamp forums", + "#nullsoft", + "britney spears", + "p.s.", + "DrO was here", + " <3", + "", +}; +static HDC scrolldc; +static HBITMAP scrollbitmap; +static char *scrolldib; +static const char scrolltext[]="nullsoft presents you nSVpLAY hidden part! cracked by rOn +5 trainer by deadbeef "; +static int scrolloffs; +static char *rototmp; + +#endif //NO_ABOUT_EGG + +static INT_PTR CALLBACK aboutProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam) +{ + switch (uMsg) + { + case WM_INITDIALOG: +#ifndef NO_ABOUT_EGG + { + HBITMAP about_bmp = NULL; + m_effect=M_NUM_FX-1; + + // try to use the localised image and then revert to the normal dll image + about_bmp = (HBITMAP)LoadImage((HINSTANCE)lParam,MAKEINTRESOURCE(IDB_BITMAP1),IMAGE_BITMAP,0,0,LR_SHARED); + if(about_bmp == NULL){ + about_bmp = (HBITMAP)LoadImage(g_hInstance,MAKEINTRESOURCE(IDB_BITMAP1),IMAGE_BITMAP,0,0,LR_SHARED); + } + + // set on control with id of -1 (0xFFFFFFFF) or 0xFFFF (not sure how/why this happened) + SendDlgItemMessage(hwndDlg,0xFFFF,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)about_bmp); + SendDlgItemMessage(hwndDlg,-1,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)about_bmp); + } +#endif + SetDlgItemText(hwndDlg,IDC_VERSION,WNDMENU_CAPTION); + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDCANCEL: + case IDOK: +#ifndef MODAL_ABOUT + DestroyWindow(hwndDlg); +#else + EndDialog(hwndDlg,1); +#endif + return FALSE; + } + break; + + case WM_DESTROY: + about_hwnd=NULL; +#ifndef NO_ABOUT_EGG + if (m_hbm) DeleteObject(m_hbm); + if (m_hdc) DeleteDC(m_hdc); + if (scrollbitmap) DeleteObject(scrollbitmap); + if (scrolldc) DeleteDC(scrolldc); + m_hbm=0; + m_hdc=0; + scrollbitmap=0; + scrolldc=0; + if (rototmp) free(rototmp); + rototmp=NULL; +#endif + break; +#ifndef NO_ABOUT_EGG + case WM_LBUTTONDBLCLK : + //easter eggs :) + if (++m_effect >= M_NUM_FX) m_effect=1; + + KillTimer(hwndDlg,0x1234); + + if (m_hbm) DeleteObject(m_hbm); + if (m_hdc) DeleteDC(m_hdc); + if (scrollbitmap) DeleteObject(scrollbitmap); + if (scrolldc) DeleteDC(scrolldc); + scrollbitmap=0; + scrolldc=0; + if (rototmp) free(rototmp); + rototmp=NULL; + + { + struct + { + BITMAPINFO bmi; + RGBQUAD more_bmiColors[256]; + LPVOID data; + } m_bitmap; + m_hdc = CreateCompatibleDC(NULL); + m_bitmap.bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + m_bitmap.bmi.bmiHeader.biPlanes = 1; + m_bitmap.bmi.bmiHeader.biBitCount = 8; + m_bitmap.bmi.bmiHeader.biCompression = BI_RGB; + m_bitmap.bmi.bmiHeader.biSizeImage = 0; + m_bitmap.bmi.bmiHeader.biClrUsed = 256; + m_bitmap.bmi.bmiHeader.biClrImportant = 256; + m_bitmap.bmi.bmiHeader.biWidth = BITMAP_W; + m_bitmap.bmi.bmiHeader.biHeight = -BITMAP_H; + m_bitmap.bmi.bmiHeader.biSizeImage = BITMAP_W*BITMAP_H; + + memset(ge_fbuf,0,BITMAP_W*(BITMAP_H+1)); + fire_textcnt=0; + + if (m_effect < 3) + { + unsigned char *t=(unsigned char *)m_bitmap.bmi.bmiColors; + int x=255; + int adj=!!m_effect; + t[0]=t[1]=t[2]=0; + t+=4; + while (x) + { + if (m_effect == 2) + { + if (x > 128) + { + t[0]=0; + t[1]=((256-x)*2)/3; + t[2]=(256-x)*2; + } + else + { + t[0]=256-x*2; + t[1]=255/3 + ((256-x)*2)/3; + t[2]=255; + } + } + else + { + int a=x*2; + if (a>255) a=255; + t[0]=a; + t[2-adj]=a; + a+=a; + if (a > 255) a=255; + t[1+adj]=a; + } + + t+=4; + x--; + } + } + + if(m_effect==0) + { + //sine scroll + struct + { + BITMAPINFO bmi; + RGBQUAD more_bmiColors[1]; + LPVOID data; + } m_bitmap; + scrolldc = CreateCompatibleDC(NULL); + m_bitmap.bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + m_bitmap.bmi.bmiHeader.biPlanes = 1; + m_bitmap.bmi.bmiHeader.biBitCount = 8; + m_bitmap.bmi.bmiHeader.biCompression = BI_RGB; + m_bitmap.bmi.bmiHeader.biSizeImage = 0; + m_bitmap.bmi.bmiHeader.biClrUsed = 1; + m_bitmap.bmi.bmiHeader.biClrImportant = 1; + m_bitmap.bmi.bmiHeader.biWidth = 128; + m_bitmap.bmi.bmiHeader.biHeight = -32; + m_bitmap.bmi.bmiHeader.biSizeImage = 128*32; + scrollbitmap = CreateDIBSection(scrolldc,&m_bitmap.bmi,DIB_RGB_COLORS, &m_bitmap.data, NULL, 0); + SelectObject(scrolldc,scrollbitmap); + SetBkMode(scrolldc,TRANSPARENT); + scrolldib = (char *)m_bitmap.data; + scrolloffs = 0; + } + + if (m_effect == 1) + { + int *t=BLOBPOINTS; + int a=BLOBS_NPOINTS; + while (a) + { + t[0]=(rand()&127) - 64; + t[2]=(rand()&127) - 64; + t[1]=t[3]=a; + t+=4; + a--; + } + } + + if((m_effect >= 3 && m_effect <= 8)) //rotozooms + { + rototmp=(char *)malloc(65536+256); + //generate noise texture + memset(rototmp,0xd0,65536+256); + __asm + { + mov cx,0ffffh + xor ax,ax + xor ebx,ebx + xor dx,dx + mov edi,[rototmp] + TEXGEN: + mov bx,cx + add ax,cx + rol ax,cl + mov dh,al + sar dh,5 + adc dl,dh + adc dl,[edi+ebx+255] + shr dl,1 + mov [edi+ebx],dl + not bh + mov [edi+ebx],dl + loop TEXGEN + } + + if ((!!(GetAsyncKeyState(VK_SHIFT)&0x8000)) ^ (m_effect==5)) // secondary easter egg, hah! + for (int x = 0; x < 256*256; x ++) rototmp[x] = 0x40 + ((x^(x>>8)) & 0x1F); + + rototmp[0]=rototmp[1]; + rototmp[0xff00]=rototmp[0xff01]; + + //generate palette + unsigned char *t=((unsigned char *)(&m_bitmap.bmi.bmiColors[0x40])); + for(int i=0;i<0x20;i++) + { + int r,g,b; + switch(m_effect) + { + case 3: r=i*4; g=i*5; b=i*8; break; + case 4: r=i*4; g=i*7; b=i*8; break; + case 5: r=i*8; g=i*2; b=i*2; break; + case 6: r=i*6; g=i*8; b=i*6; break; + case 7: r=i*8; g=i*6; b=i*8; break; + case 8: r=i*6; g=i*6; b=i*8; break; + } + t[0]=b; + t[1]=g; + t[2]=r; + t+=4; + } + } + + m_hbm = CreateDIBSection(m_hdc,&m_bitmap.bmi,DIB_RGB_COLORS, &m_bitmap.data, NULL, 0); + SelectObject(m_hdc,m_hbm); + m_dib = (char *)m_bitmap.data; + + SetTimer(hwndDlg,0x1234,35,NULL); + } + break; + + case WM_TIMER: + { + int nomemcpy=0; + static float inc=0; + inc++; + if (m_effect == 0) // oldsk00l sine scroll + { + double blah=3.14/BITMAP_W; + double val1=1; + double val2=(BITMAP_H-16)/2; + static double vinc=0; + __asm + { + mov edi, offset ge_fbuf + mov ecx, BITMAP_W*BITMAP_H + xor eax, eax + rep stosb + } + + for(int j=0;j<8;j++) { + for(int k=0;k<16;k++) { + int col=255-k*(256/16); + if(col<128) col=128+(128-col); + memset(ge_fbuf+(k+(int)((BITMAP_H-16)*(cos(vinc+(j*8)*3.14/50)+1)/2))*BITMAP_W,col,BITMAP_W); + } + } + + __asm + { + mov edi, offset ge_fbuf + mov ecx, 0 + mov esi, dword ptr [scrolldib] + + SINELOOP: + mov [ge_tmp], ecx + fild dword ptr [ge_tmp] + fmul qword ptr [blah] + fadd qword ptr [vinc] + fcos + fadd qword ptr [val1] + fmul qword ptr [val2] + fistp dword ptr [ge_tmp] + mov eax, [ge_tmp] + mov ebx, eax + + mov edx, BITMAP_W + mul edx + + mov dh, bl + push ecx + mov ebx, 0 + mov ecx, 16 + + SINELOOP2: + cmp byte ptr [esi+ebx],0 + je SINECONT + + mov dl,0ffh + sub dl,dh + sub dl,cl + + mov [edi+eax], dl + SINECONT: + add eax, BITMAP_W + add ebx, 128 + loop SINELOOP2 + + pop ecx + + inc esi + inc edi + + inc ecx + cmp ecx, BITMAP_W + jl SINELOOP + + mov edi, [scrolldib] + mov esi, edi + inc esi + mov ebx, 32 + SINESCROLL: + mov ecx, 127 + rep movsb + inc edi + inc esi + dec ebx + jnz SINESCROLL + } + vinc+=0.2; + scrolloffs++; + if((scrolloffs&7)==7) + { + int o=scrolloffs/8; + if(!scrolltext[o]) scrolloffs=0; + else TextOutA(scrolldc,100,0,&scrolltext[o],1); + } + } + else if (m_effect == 1) // blobs + { + int *blobptr=BLOBPOINTS; + int i=BLOBS_NPOINTS*2; + while (i--) + { + if (blobptr[0] > 0) blobptr[1]--; + else blobptr[1]++; + + int a=blobptr[1]; + if (rand()&1) a++; + else a--; + blobptr[0]+=a/8; + + blobptr+=2; + } + + int y=BITMAP_H; + unsigned char *p=(unsigned char *)ge_fbuf; + while (y--) + { + int x=BITMAP_W; + while (x--) + { + blobptr=BLOBPOINTS; + i=BLOBS_NPOINTS; + double sum=0.0; + while (i--) + { + double as=(x-(BITMAP_W/2)) - blobptr[0]; + double bs=(y-(BITMAP_H/2)) - blobptr[2]; + sum+=sqrt(as*as + bs*bs); + blobptr+=4; + } + sum *= 6.0/BLOBS_NPOINTS; + int a=(int)sum; + if (a > 0xff) a= 0xff; + *p++=a; + } + } + } + else if(m_effect==2) //gayfire + { + unsigned char *p=(unsigned char *)ge_fbuf; + int x; + unsigned char *t=p + BITMAP_W*BITMAP_H; + for (x = 0; x < BITMAP_W; x ++) + { + int a=*t - 10; + if ((rand()&0x7) == 7) a+=100; + if (a < 0) a=0; + else if (a > 192) a=192; + *t++=a;//rand()&0xf0; + } + int y; + for (y = 0; y < BITMAP_H; y ++) + { + *p++=p[0]/4 + p[BITMAP_W]/2 + p[BITMAP_W+1]/4; + + for (x = 1; x < BITMAP_W-1; x ++) + *p++=p[0]/4 + p[BITMAP_W]/4 + p[BITMAP_W-1]/4 + p[BITMAP_W+1]/4; + + *p++=p[0]/4 + p[BITMAP_W]/2 + p[BITMAP_W-1]/4; + } + if (fire_textcnt-- <= 0) + { + memcpy(m_dib,ge_fbuf,BITMAP_W*BITMAP_H); + SetBkMode(m_hdc,TRANSPARENT); + SetTextColor(m_hdc,RGB(255,255,255)); + RECT r={0,0,BITMAP_W,BITMAP_H}; + DrawTextA(m_hdc,fire_texts[fire_textpos%(sizeof(fire_texts)/sizeof(fire_texts[0]))],-1,&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE); + if (fire_textcnt < -30) + { + memcpy(ge_fbuf,m_dib,BITMAP_W*BITMAP_H); + fire_textpos++; + fire_textcnt=30; + } + else nomemcpy=1; + } + } + else if (m_effect == 3) //rotozoom + { + char *p=ge_fbuf; + static float angle=0; + for(int j=-32;j<32;j++) + for(int i=-50;i<50;i++) + { + //rotozoom + double x=(i*cosf(angle)-j*sinf(angle))*(2+cosf(angle*1.4f)); + double y=(i*sinf(angle)+j*cosf(angle))*(2+cosf(angle*1.4f)); + //slime + x+=cos(angle*x)*4; + y+=sin(angle*y)*4; + int x2=(int)x & 0xff; + int y2=(int)y & 0xff; + *p++=rototmp[256*y2+x2]; + } + + angle+=0.01f; + } + else if (m_effect == 4) //rotozoom 2 + { + char *p=ge_fbuf; + double angle=cos(inc*0.01f)*2; + for(int j=-32;j<32;j++) + for(int i=-50;i<50;i++) + { + //position + double x=i-cos(inc*0.013f)*64; + double y=j+sin(inc*0.013f)*64; + + //slime + x+=cos((angle+i)*50)*cos(angle)*4; + y+=sin((angle+j)*50)*cos(angle)*4; + + //rotozoom + double x3=(x*cos(angle)-y*sin(angle))*(2+cos(angle*1.4f)); + double y3=(x*sin(angle)+y*cos(angle))*(2+cos(angle*1.4f)); + + int x2=(int)x3 & 0xff; + int y2=(int)y3 & 0xff; + *p++=rototmp[256*y2+x2]; + } + } + else if (m_effect == 5) //3d rotozoom + { + char *p=ge_fbuf; + static float angle=0; + const double b=50; + for(int j=-32;j<32;j++) + for(int i=-50;i<50;i++) + { + //rotozoom + double x=(i*cos(angle)+j*sin(angle));//*(2+cos(angle*1.4f)); + double y=(i*sin(angle)-j*cos(angle));//*(2+cos(angle*1.4f)); + //gay z-projection + x*=b/(((double)j+32)); + y*=b/(((double)j+32)); + //position + x-=cos(inc*0.013f)*64; + y+=sin(inc*0.013f)*64; + + int x2=(int)x & 0xff; + int y2=(int)y & 0xff; + + char c=rototmp[256*y2+x2]; + *p++=0x40+((c-0x40)*(j+32)/56); + } + + angle+=0.01f; + //b++; + } + else if (m_effect == 6) //tunnel + { + const double TINYNUM=1.0E-6; + const double CONE_RADIUS=128; + const double FOV=120.0; + #define sqr(a) ((a)*(a)) + + char *p=ge_fbuf; + for(int y=-32;y<32;y++) + for(int x=-50;x<50;x++) + { + double originx=cos(inc*0.025f)*20; + double originy=sin(inc*0.04f)*20; + double originz=inc*4; + double dirx=x/FOV; + double diry=y/FOV; + double dirz=1; + + //normalize dir vector + { + double l=1.0f/sqrt(sqr(dirx)+sqr(diry)+sqr(dirz)); + dirx*=l; + diry*=l; + dirz*=l; + } + + //y-axis rotation + { + double rot=inc*0.015f; + double dirx2=dirx*cos(rot)+dirz*sin(rot); + dirz=dirx*sin(rot)-dirz*cos(rot); + dirx=dirx2; + } + + //tunnel algo shit + double a=sqr(dirx)+sqr(diry); + double b=2*(originx*dirx + originy*diry); + double c=sqr(originx)+sqr(originy)-sqr(CONE_RADIUS); + double delta=sqrt(sqr(b)-(4*a*c)); + + double t1=(-b+delta)/(2*a+TINYNUM); + double t2=(-b-delta)/(2*a+TINYNUM); + + double t=t1>0?t1:t2; + + double intx=originx+dirx*t; + double inty=originy+diry*t; + double intz=originz+dirz*t; + + //tex. coords + int u=(int)(fabs(intz)*0.6); + int v=(int)(fabs(atan2(inty,intx)*256/3.14159265)); + + //depth + t=20000.0/t; + int z=(int)(t>63?63:t); + + u&=0xff; + v&=0xff; + z&=0xff; + + { + char c=rototmp[256*u+v]; + *p++=0x40+((c-0x40)*z/64); + } + } + } + else if(m_effect==7) //washing machine + { + char *p=ge_fbuf; + for(int j=-32;j<32;j++) + for(int i=-50;i<50;i++) + { + double dist=sqrt(double(sqr(i)+sqr(j))); // pythagoras rules :) + double angle=cos(dist*0.05f)*(cos(inc*0.1f)) + inc*0.07f; + //rotozoom + double x=(i*cos(angle)-j*sin(angle)); + double y=(i*sin(angle)+j*cos(angle)); + int x2=(int)x & 0xff; + int y2=(int)y & 0xff; + *p++=rototmp[256*y2+x2]; + } + } + else if(m_effect==8) //reflection-like(?) effect + { + char *p=ge_fbuf; + for(int j=-32;j<32;j++) + for(int i=-50;i<50;i++) + { + double dist=sqrt(double(sqr(i)+sqr(j))); + double zoom=cos(dist*0.05f)*(cos(inc*0.02f)*8)+1; + //rotozoom + double x=i*zoom+inc; + double y=j*zoom+inc; + int x2=(int)x & 0xff; + int y2=(int)y & 0xff; + *p++=rototmp[256*x2+y2]; + } + } + + if (!nomemcpy) memcpy(m_dib,ge_fbuf,BITMAP_W*BITMAP_H); + if (hwndDlg != NULL) + { + HDC h = GetDC(hwndDlg); + BitBlt(h, 11, 11, BITMAP_W, BITMAP_H, m_hdc, 0, 0, SRCCOPY); + ReleaseDC(hwndDlg, h); + } + } + break; +#endif + } + return 0; +} + +static void do_about(HWND hwnd, HINSTANCE hinst) { +#ifndef MODAL_ABOUT + if(about_hwnd) { + SetForegroundWindow(about_hwnd); + return; + } + about_hwnd=CreateDialogParam((!hinst?g_hInstance:hinst),MAKEINTRESOURCE(IDD_ABOUT),hwnd,aboutProc,(LPARAM)hinst); + ShowWindow(about_hwnd,SW_SHOW); +#else +#ifdef LOC_MODAL_ABOUT + WASABI_API_DIALOGBOXPARAMW(IDD_ABOUT,hwnd,aboutProc,(LPARAM)hinst); +#else + DialogBoxParam((!hinst?g_hInstance:hinst),MAKEINTRESOURCE(IDD_ABOUT),hwnd,aboutProc,(LPARAM)hinst); +#endif +#endif +} + +#endif//_ABOUT_H_
\ No newline at end of file |