NT4/private/windows/ep/idlewild/stars/stars.c
2020-09-30 17:12:29 +02:00

203 lines
2.9 KiB
C

#ifdef PM
#include <cstd.h>
#define INCL_WIN
#define INCL_GPI
#include <os2.h>
INT _acrtused = 0;
#endif
#ifdef WIN
#include <windows.h>
#include <port1632.h>
#endif
#include "std.h"
#include "scrsave.h"
INT rand();
INT dxScreen, dyScreen;
INT dxScreenD2, dyScreenD2;
typedef struct _str
{
SHORT x, y, z;
SHORT xo, yo;
} STR;
#define istrMax 64
STR rgstr [istrMax];
#define dzStep 4
#define magic 256
BOOL APIENTRY CoolProc(hwnd, wm, wParam, lParam)
HWND hwnd;
WORD wm;
WPARAM wParam;
LONG lParam;
{
switch (wm)
{
case WM_INITDIALOG:
MessageBeep(0);
MessageBeep(0);
MessageBeep(0);
MessageBeep(0);
MessageBeep(0);
MessageBeep(0);
MessageBeep(0);
return TRUE;
case WM_COMMAND:
EndDialog(hwnd, TRUE);
return TRUE;
}
return FALSE;
}
BOOL EXPENTRY ScrSaveProc(SHORT ssm, LONG l1, LONG l2, LONG l3)
{
CHAR FAR * lpsz;
CHAR FAR * lpch;
switch (ssm)
{
default:
return fFalse;
case SSM_DIALOG:
MessageBeep(0);
MessageBeep(0);
MessageBeep(0);
MessageBeep(0);
MessageBeep(0);
MessageBeep(0);
MessageBeep(0);
/* {
FARPROC lpproc;
lpproc = MakeProcInstance(CoolProc, (HANDLE) l1);
DialogBox((HANDLE) l1, "Cool", (HWND) l2, lpproc);
FreeProcInstance(lpproc);
}*/
break;
case SSM_OPEN:
lpsz = (PSZ) l1;
lpch = "Stars";
while ((*lpsz++ = *lpch++) != '\0')
;
lpsz = (PSZ) l2;
lpch = "Drifting Through Space\n\nby Brad Christian";
while ((*lpsz++ = *lpch++) != '\0')
;
dxScreen = GetSystemMetrics(SM_CXSCREEN);
dyScreen = GetSystemMetrics(SM_CYSCREEN);
dxScreenD2 = dxScreen / 2;
dyScreenD2 = dyScreen / 2;
break;
case SSM_ANIMATE:
Animate((CVS) l1);
break;
}
return fTrue;
}
Animate(CVS hps)
{
INT x, y;
INT istr;
STR * pstr;
pstr = rgstr;
for (istr = 0; istr < istrMax; istr += 1, pstr += 1)
{
if ((pstr->z -= dzStep) <= 0)
MakeStar(pstr);
x = pstr->x * magic / pstr->z + dxScreenD2;
y = pstr->y * magic / pstr->z + dyScreenD2;
SetPel(hps, pstr->xo, pstr->yo, 0);
if (x < 0 || y < 0 || x >= dxScreen || y >= dyScreen)
MakeStar(pstr);
else
{
SetPel(hps, x, y, 256 - pstr->z);
pstr->xo = x;
pstr->yo = y;
}
}
}
MakeStar(STR * pstr)
{
pstr->x = WRand(dxScreen) - dxScreenD2;
pstr->y = WRand(dyScreen) - dyScreenD2;
pstr->z = WRand(256) + 1;
}
#ifdef PM
LONG mpbrghtclr [] =
{
CLR_BLACK,
CLR_DARKGRAY,
CLR_PALEGRAY,
CLR_WHITE,
CLR_YELLOW
};
#endif
#ifdef PM
SetPel(HPS hps, INT x, INT y, INT brght)
{
RECTL rectl;
rectl.xLeft = x;
rectl.xRight = x + 1;
rectl.yBottom = y;
rectl.yTop = y + 1;
if (brght != 0)
{
brght >>= 5; // 0 <= brght <= 7
if (brght > 3)
{
rectl.xRight += 1;
rectl.yTop += 1;
brght >>= 1;
}
brght += 1;
}
else
{
rectl.xRight += 1;
rectl.yTop += 1;
}
WinFillRect(hps, &rectl, mpbrghtclr[brght]);
}
#endif
#ifdef WIN
SetPel(HDC hdc, INT x, INT y, INT brght)
{
SetPixel(hdc, x, y, ((LONG) brght << 16) | (brght << 8) | brght);
}
#endif