home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Borland Programmer's Resource
/
Borland_Programmers_Resource_CD_1995.iso
/
games
/
yowsrc12
/
yowfncs.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-18
|
8KB
|
300 lines
//
// YOWFNCS - Yow! PIZZA? no, support functions!
//
// Version: 1.0 Copyright (C) 1991, Lantern Corp.
// Author: Edward Hutchins
// Revisions:
// 09/11/91 removed dependence on file dll - Ed.
//
#include "yow.h"
//
// globals
//
IMPORT HANDLE hAppInst FROM( yow.c );
IMPORT HWND hAppWnd FROM( yow.c );
IMPORT CHAR szAppName[8] FROM( yow.c );
IMPORT CHAR szDBase[FILENAME_SIZE] FROM( yow.c );
IMPORT CHAR szEndChar[2] FROM( yow.c );
//
// IsLastLine - return true if this line is marked as the "last" one
//
BOOL NEAR PASCAL IsLastLine( NPSTR npszLine )
{
if (!szEndChar[0]) return( TRUE );
while (*npszLine)
{
if (*npszLine == szEndChar[0])
{
*npszLine = '\0';
return( TRUE );
}
++npszLine;
}
return( FALSE );
}
//
// ReadYowLine - get another buffer full of text
//
INT NEAR PASCAL ReadYowLine( INT hFile, NPSTR npszBuff, INT nBuffSize,
NPSTR npszLine, INT nLineSize )
{
NPSTR npBuff = npszBuff;
NPSTR npStart = npszBuff;
NPSTR npEnd = npszBuff + nBuffSize - 1;
INT nRead = 0;
while (npBuff <= npEnd) switch (*npBuff)
{
case '\0':
{
INT nCnt = npEnd - npBuff;
nCnt = (INT)_lread( hFile, npBuff, nCnt );
if (nCnt > 0) npBuff[nCnt] = '\0';
}
if (*npBuff == '\0') goto Done;
break;
case '\x0d':
case '\x0a':
++nRead;
*npBuff++ = *npszLine++ = '\0';
if (*npBuff == '\x0a' || *npBuff == '\x0d') *npBuff++ = '\0';
goto Done;
default:
if (--nLineSize <= 0) goto Done;
*npszLine++ = *npBuff++;
break;
}
Done:
while (npBuff <= npEnd) *npStart++ = *npBuff++;
*npStart = *npszLine = '\0';
return( nRead );
}
//
// GetYowLine - get a line from the lines database
//
BOOL NEAR PASCAL GetYowLine( NPSTR npBuff, INT nSize )
{
INT hFile = _lopen( szDBase, OF_READ );
LONG lSize;
LOCAL LONG lPos;
BOOL bSuccess = FALSE;
INT nCnt, nLine;
CHAR szLineBuff[256];
CHAR szLine[256];
*npBuff = '\0';
if (hFile == -1) return( FALSE );
lSize = _llseek( hFile, 0, 2 );
if (lSize < 2) goto Abort;
for (nCnt = 10; nCnt; --nCnt)
{
lPos = (lPos << 1) ^ GetCurrentTime() ^ MAKELONG( rand(), rand() );
lPos %= lSize;
if (_llseek( hFile, lPos, 0 ) != lPos) break;
szLineBuff[0] = '\0';
while (ReadYowLine( hFile, szLineBuff, sizeof(szLineBuff),
szLine, sizeof(szLine) ) > 0)
{
if (IsLastLine( szLine )) break;
}
nLine = 0;
while (ReadYowLine( hFile, szLineBuff, sizeof(szLineBuff),
szLine, sizeof(szLine) ) > 0)
{
NPSTR npCpy = szLine;
bSuccess = IsLastLine( szLine );
if (nLine++)
{
*npBuff++ = '\x0d';
*npBuff++ = '\x0a';
nSize -= 2;
}
while (isspace(*npCpy)) ++npCpy;
while (*npCpy && --nSize > 0) *npBuff++ = *npCpy++;
*npBuff = '\0';
if (bSuccess) goto Abort;
}
}
Abort:
if (hFile != -1) _lclose( hFile );
return( bSuccess );
}
//
// InRect - move a rectangle in by one
//
VOID NEAR PASCAL InRect( NPRECT npRect )
{
RECT rect = *npRect;
++rect.top; ++rect.left; --rect.bottom; --rect.right;
*npRect = rect;
}
//
// TransRect - move a rectangle along the diagonal
//
VOID NEAR PASCAL TransRect( NPRECT npRect, INT nDist )
{
RECT rect = *npRect;
rect.top += nDist;
rect.left += nDist;
rect.bottom += nDist;
rect.right += nDist;
*npRect = rect;
}
//
// ShadowRect - draw a shadow rect
//
VOID NEAR PASCAL ShadowRect( HDC hDC, NPRECT npRect, HPEN hTL, HPEN hBR )
{
RECT rect = *npRect;
--rect.bottom; --rect.right;
SelectObject( hDC, hTL );
MoveTo( hDC, rect.right, rect.top );
LineTo( hDC, rect.left, rect.top );
LineTo( hDC, rect.left, rect.bottom );
SelectObject( hDC, hBR );
LineTo( hDC, rect.right, rect.bottom );
LineTo( hDC, rect.right, rect.top );
++rect.top; ++rect.left;
*npRect = rect;
}
//
// DrawYowBorder - draw a shaded rectangle around the yow display
//
VOID NEAR PASCAL DrawYowBorder( HDC hDC, NPRECT npRect )
{
HPEN hHiPen = GetStockObject( WHITE_PEN );
HPEN hBlackPen = GetStockObject( BLACK_PEN );
HPEN hLoPen = CreatePen( 0, 1, RGB( 128, 128, 128 ) );
RECT rect = *npRect;
SelectObject( hDC, GetStockObject( NULL_BRUSH ) );
ShadowRect( hDC, &rect, hHiPen, hLoPen );
ShadowRect( hDC, &rect, hHiPen, hLoPen );
InRect( &rect ); InRect( &rect );
ShadowRect( hDC, &rect, hLoPen, hHiPen );
ShadowRect( hDC, &rect, hBlackPen, hBlackPen );
ShadowRect( hDC, &rect, hHiPen, hLoPen );
if (hLoPen) DeleteObject( hLoPen );
}
//
// SwapBitmaps - switch bitmaps around
//
VOID NEAR PASCAL SwapBitmaps( HDC hDC, HDC hdcMem, INT x, INT y, INT cx, INT cy )
{
BitBlt( hdcMem, 0, 0, cx, cy, hDC, x, y, SRCINVERT );
BitBlt( hDC, x, y, cx, cy, hdcMem, 0, 0, SRCINVERT );
BitBlt( hdcMem, 0, 0, cx, cy, hDC, x, y, SRCINVERT );
}
//
// Yow - yow!
//
VOID FAR PASCAL Yow( INT nVirtKey )
{
HDC hDC = CreateScreenDC();
HDC hdcMem = CreateCompatibleDC( hDC );
HBITMAP hbm = NULL, hbmOld = NULL;
HFONT hfont = NULL, hfontOld = NULL;
INT x, y;
INT cx = GetSystemMetrics( SM_CXSCREEN );
INT cy = GetSystemMetrics( SM_CYSCREEN );
RECT rect;
BOOL bSuccess = FALSE;
CHAR szBuff[2048];
// fetch the data
if (!GetYowLine( szBuff, sizeof(szBuff) ))
{
MessageBeep( 0 );
return;
}
hfont = CreateFont( cx / 40, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE,
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_STROKE_PRECIS,
PROOF_QUALITY, DEFAULT_PITCH | FF_ROMAN, "Tms Rmn" );
if (!hfont) goto Abort;
// calculate the bounding box
rect.left = 0; rect.right = cx - 56;
rect.top = 0; rect.bottom = cy - 20;
SetBkMode( hDC, TRANSPARENT );
hfontOld = SelectObject( hDC, hfont );
DrawText( hDC, szBuff, -1, &rect, YOW_STYLE | DT_CALCRECT );
SelectObject( hDC, hfontOld );
hfontOld = HNULL;
// calculate the width and height, and the centered offset on the screen
x = (cx - (56 + rect.right - rect.left)) / 2;
cx = 40 + rect.right - rect.left; // kludge in some padding
y = (cy - (20 + rect.bottom - rect.top)) / 2;
cy = 4 + rect.bottom - rect.top;
// create the offscreen bitmap
hbm = CreateCompatibleBitmap( hDC, cx + 16, cy + 16 );
if (!hbm) goto Abort;
hbmOld = SelectObject( hdcMem, hbm );
hfontOld = SelectObject( hdcMem, hfont );
// set up the bitmap background
rect.top = rect.left = 0;
rect.right = 16 + cx; rect.bottom = 16 + cy;
FillRect( hdcMem, &rect, GetStockObject( LTGRAY_BRUSH ) );
DrawYowBorder( hdcMem, &rect );
// draw the fancy text
SetBkMode( hdcMem, TRANSPARENT );
rect.top = rect.left = 8;
rect.right = 8 + cx; rect.bottom = 8 + cy;
TransRect( &rect, 2 );
SetTextColor( hdcMem, RGB(255,255,255) );
DrawText( hdcMem, szBuff, -1, &rect, YOW_STYLE );
TransRect( &rect, -2 );
SetTextColor( hdcMem, RGB(128,128,128) );
DrawText( hdcMem, szBuff, -1, &rect, YOW_STYLE );
TransRect( &rect, 1 );
SetTextColor( hdcMem, RGB(0,0,0) );
DrawText( hdcMem, szBuff, -1, &rect, YOW_STYLE );
// keep the bitmap up till the key is released
SwapBitmaps( hDC, hdcMem, x, y, 16 + cx, 16 + cy );
while (GetAsyncKeyState( nVirtKey ) < 0) ;
SwapBitmaps( hDC, hdcMem, x, y, 16 + cx, 16 + cy );
bSuccess = TRUE;
Abort:
if (hbmOld) SelectObject( hdcMem, hbmOld );
if (hfontOld) SelectObject( hdcMem, hfontOld );
if (hdcMem) DeleteDC( hdcMem );
if (hDC) DeleteDC( hDC );
if (hfont) DeleteObject( hfont );
if (hbm) DeleteObject( hbm );
if (!bSuccess) MessageBeep( 0 );
}