1 line
13 KiB
OpenEdge ABL
Executable File
1 line
13 KiB
OpenEdge ABL
Executable File
unit GlobalUtils;
|
|
|
|
interface
|
|
uses
|
|
SMS, Palettes, Globals;
|
|
|
|
procedure SetPage (secondPage: Boolean);
|
|
procedure SpinBall;
|
|
procedure GenericAlert (whatGives: Integer);
|
|
procedure DoTheSound (whichOne: Integer);
|
|
procedure DoTheBass (whichOne: Integer);
|
|
procedure DoTheMusic (whichOne: Integer);
|
|
function Randomize (range: Integer): Integer;
|
|
procedure CalcRoomScore;
|
|
procedure DoErrorSound (soundNumber: Integer);
|
|
procedure DissBlocks;
|
|
procedure DrawHiScores;
|
|
procedure HideMenuBar;
|
|
procedure ShowMenuBar;
|
|
procedure FatalError;
|
|
procedure RedrawWindowFrame;
|
|
|
|
implementation
|
|
|
|
{=================================}
|
|
|
|
procedure SetPage (secondPage: Boolean);
|
|
EXTERNAL;
|
|
|
|
{=================================}
|
|
|
|
procedure SpinBall;
|
|
var
|
|
tempByte: SignedByte;
|
|
|
|
begin
|
|
if (ballList = nil) then
|
|
Exit(SpinBall);
|
|
tempByte := HGetState(Handle(ballList));
|
|
HLock(Handle(ballList));
|
|
with ballList^^ do
|
|
begin
|
|
if (whichBall = -1) then
|
|
Exit(SpinBall);
|
|
if (whichBall >= kCursCount) then
|
|
whichBall := 1
|
|
else
|
|
whichBall := whichBall + 1;
|
|
if (useColorCursor) then
|
|
SetCCursor(ballC[whichBall])
|
|
else
|
|
SetCursor(ball[whichBall]^^);
|
|
end;
|
|
HSetState(Handle(ballList), tempByte);
|
|
end;
|
|
|
|
{=================================}
|
|
|
|
procedure GenericAlert;
|
|
var
|
|
dummyInt: Integer;
|
|
line1, line2: Str255;
|
|
alertHandle: AlertTHndl;
|
|
alertRect: Rect;
|
|
|
|
begin
|
|
if ((areFlipping) and (mainScreenHidden)) then
|
|
begin
|
|
mainScreenHidden := FALSE;
|
|
SetPage(mainScreenHidden);
|
|
end;
|
|
|
|
UseResFile(gliderResNum);
|
|
InitCursor;
|
|
if (whatGives > 0) then
|
|
begin
|
|
GetIndString(line1, rAlertStrIDs, whatGives);
|
|
line2 := '';
|
|
end
|
|
else
|
|
begin
|
|
GetIndString(line1, rAlertStrIDs, 1);
|
|
NumToString(whatGives, line2);
|
|
line2 := CONCAT('Error = ', line2);
|
|
end;
|
|
|
|
ParamText(line1, line2, '', '');
|
|
alertHandle := AlertTHndl(Get1Resource('ALRT', rAlertID));
|
|
if (alertHandle <> nil) then
|
|
begin
|
|
HNoPurge(Handle(alertHandle));
|
|
alertRect := alertHandle^^.boundsRect;
|
|
OffsetRect(alertRect, -alertRect.left, -alertRect.top);
|
|
dummyInt := (screenBits.bounds.right - alertRect.right) div 2;
|
|
OffsetRect(alertRect, dummyInt, 0);
|
|
dummyInt := (screenBits.bounds.bottom - alertRect.bottom) div 3;
|
|
OffsetRect(alertRect, 0, dummyInt);
|
|
alertHandle^^.boundsRect := alertRect;
|
|
HPurge(Handle(alertHandle));
|
|
end;
|
|
dummyInt := Alert(rAlertID, nil);
|
|
end;
|
|
|
|
{=================================}
|
|
|
|
procedure DoTheMusic;
|
|
begin
|
|
if (musicOn and soundOn) then
|
|
SMSStartChan(whichOne, 1);
|
|
end;
|
|
|
|
{=================================}
|
|
|
|
procedure DoTheBass;
|
|
begin
|
|
if (musicOn) then
|
|
SMSStart(whichOne);
|
|
end;
|
|
|
|
{=================================}
|
|
|
|
procedure DoTheSound;
|
|
begin
|
|
if (soundOn) then
|
|
SMSStart(whichOne);
|
|
end;
|
|
|
|
{=================================}
|
|
|
|
function Randomize;
|
|
var
|
|
rawResult: LongInt;
|
|
begin
|
|
rawResult := ABS(Random);
|
|
Randomize := (rawResult * range) div 32768;
|
|
end;
|
|
|
|
{=================================}
|
|
|
|
procedure CalcRoomScore;
|
|
var
|
|
index: Integer;
|
|
|
|
begin
|
|
roomScore := 0;
|
|
for index := 1 to 40 do
|
|
if (roomVisits[index]) then
|
|
roomScore := roomScore + (500 * (index div 10 + 1)) + (roomsPassed div 41) * 2000;
|
|
end;
|
|
|
|
{=================================}
|
|
|
|
procedure DoErrorSound;
|
|
var
|
|
dummyLong: LongInt;
|
|
tempVolume, i: Integer;
|
|
begin
|
|
GetSoundVol(tempVolume);
|
|
if (tempVolume <> 0) then
|
|
for i := 0 to soundNumber do
|
|
begin
|
|
FlashMenuBar(0);
|
|
Delay(8, dummyLong);
|
|
FlashMenuBar(0);
|
|
end;
|
|
end;
|
|
|
|
{=================================}
|
|
|
|
procedure DissBlocks;
|
|
var
|
|
h, v: Integer;
|
|
value: LongInt;
|
|
maskR: Rect;
|
|
begin
|
|
value := 1;
|
|
repeat
|
|
if (BTST(value, 0)) then
|
|
begin
|
|
value := BSR(value, 1);
|
|
value := BitXor(value, $240);
|
|
end
|
|
else
|
|
begin
|
|
value := BSR(value, 1);
|
|
end;
|
|
h := (value mod 32) * 16;
|
|
v := (value div 32) * 16;
|
|
SetRect(maskR, h, v, h + 16, v + 16);
|
|
if (inColor) then
|
|
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, maskR, maskR, srcCopy, wholeRgn)
|
|
else
|
|
CopyBits(offVirginMap, mainWndo^.portBits, maskR, maskR, srcCopy, wholeRgn);
|
|
until (value = 1);
|
|
if (inColor) then
|
|
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeArea, wholeArea, srcCopy, wholeRgn)
|
|
else
|
|
CopyBits(offVirginMap, mainWndo^.portBits, wholeArea, wholeArea, srcCopy, wholeRgn);
|
|
if (inColor) then
|
|
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, wholeRgn)
|
|
else
|
|
CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, wholeRgn);
|
|
end;
|
|
|
|
{=================================}
|
|
|
|
procedure DrawHiScores;
|
|
var
|
|
i, ranking: Integer;
|
|
leftRect, rightRect, hole, tempRect: Rect;
|
|
tempStr: Str255;
|
|
wasPort: GrafPtr;
|
|
begin
|
|
if (playing) then
|
|
begin
|
|
demoMode := Randomize(lastDemo) + 1;
|
|
Exit(DrawHiScores);
|
|
end;
|
|
|
|
GetPort(wasPort);
|
|
if (inColor) then
|
|
SetPort(GrafPtr(loadCPtr))
|
|
else
|
|
SetPort(offLoadPort);
|
|
PenNormal;
|
|
|
|
ranking := scoreList.rank;
|
|
|
|
SetRect(leftRect, 10, 30, 251, 332);
|
|
FillRect(leftRect, white);
|
|
FrameRect(leftRect);
|
|
PenPat(gray);
|
|
if (inColor) then
|
|
RGBForeColor(rgbLtBlue);
|
|
for i := 0 to 20 do
|
|
begin
|
|
MoveTo(leftRect.left + 1, leftRect.top + 35 + (i * 13));
|
|
LineTo(leftRect.right - 2, leftRect.top + 35 + (i * 13));
|
|
end;
|
|
if (inColor) then
|
|
RGBForeColor(rgbBlack);
|
|
if ((ranking < 20) and (inColor)) then
|
|
begin
|
|
RGBForeColor(rgbYellow);
|
|
i := (ranking * 13) + leftRect.top + 36;
|
|
SetRect(tempRect, leftRect.left + 32, i, leftRect.right - 2, i + 12);
|
|
PaintRect(tempRect);
|
|
RGBForeColor(rgbBlack);
|
|
end;
|
|
|
|
TextFont(16);
|
|
TextSize(12);
|
|
if (inColor) then
|
|
RGBForeColor(rgbRed);
|
|
MoveTo(leftRect.left + 33, leftRect.top + 30);
|
|
DrawString('Rank');
|
|
MoveTo(leftRect.left + 108, leftRect.top + 30);
|
|
DrawString('Name');
|
|
MoveTo(leftRect.left + 186, leftRect.top + 30);
|
|
DrawString('Room #');
|
|
if (inColor) then
|
|
RGBForeColor(rgbBlack);
|
|
for i := 0 to 19 do
|
|
begin
|
|
MoveTo(leftRect.left + 38, leftRect.top + 47 + (i * 13));
|
|
NumToString(i + 1, tempStr);
|
|
DrawString(tempStr);
|
|
MoveTo(leftRect.left + 58, leftRect.top + 47 + (i * 13));
|
|
DrawString(thisHouse.hiName[i]);
|
|
MoveTo(leftRect.left + 206, leftRect.top + 47 + (i * 13));
|
|
if (thisHouse.hiLevel[i] = 0) then
|
|
tempStr := '+'
|
|
else
|
|
NumToString(thisHouse.hiLevel[i], tempStr);
|
|
DrawString(tempStr);
|
|
end;
|
|
if ((ranking < 20) and (not inColor)) then
|
|
begin
|
|
i := (ranking * 13) + leftRect.top + 36;
|
|
SetRect(tempRect, leftRect.left + 32, i, leftRect.right - 2, i + 12);
|
|
InvertRect(tempRect);
|
|
end;
|
|
if (inColor) then
|
|
RGBForeColor(rgbViolet);
|
|
MoveTo(leftRect.left + 30, leftRect.top + 1);
|
|
LineTo(leftRect.left + 30, leftRect.bottom);
|
|
if (inColor) then
|
|
RGBForeColor(rgbBlack);
|
|
SetRect(hole, 0, 0, 12, 12);
|
|
OffsetRect(hole, leftRect.left + 10, leftRect.top + 30);
|
|
FillOval(hole, black);
|
|
OffsetRect(hole, 0, 30);
|
|
FillOval(hole, black);
|
|
OffsetRect(hole, 0, 85);
|
|
FillOval(hole, black);
|
|
OffsetRect(hole, 0, 85);
|
|
FillOval(hole, black);
|
|
OffsetRect(hole, 0, 30);
|
|
FillOval(hole, black);
|
|
|
|
PenNormal;
|
|
SetRect(rightRect, 261, 30, 502, 332);
|
|
FillRect(rightRect, white);
|
|
FrameRect(rightRect);
|
|
PenPat(gray);
|
|
if (inColor) then
|
|
RGBForeColor(rgbLtBlue);
|
|
for i := 0 to 20 do
|
|
begin
|
|
MoveTo(rightRect.left + 1, rightRect.top + 35 + (i * 13));
|
|
LineTo(rightRect.right - 2, rightRect.top + 35 + (i * 13));
|
|
end;
|
|
|
|
if (inColor) then
|
|
RGBForeColor(rgbBlack);
|
|
|
|
if ((ranking < 20) and (inColor)) then
|
|
begin
|
|
RGBForeColor(rgbYellow);
|
|
i := (ranking * 13) + rightRect.top + 36;
|
|
SetRect(tempRect, rightRect.left + 32, i, rightRect.right - 2, i + 12);
|
|
PaintRect(tempRect);
|
|
RGBForeColor(rgbBlack);
|
|
end;
|
|
|
|
TextFont(16);
|
|
TextSize(12);
|
|
if (inColor) then
|
|
RGBForeColor(rgbRed);
|
|
MoveTo(rightRect.left + 33, rightRect.top + 30);
|
|
DrawString('Score');
|
|
MoveTo(rightRect.left + 98, rightRect.top + 30);
|
|
DrawString('Room Name');
|
|
if (inColor) then
|
|
RGBForeColor(rgbBlack);
|
|
for i := 0 to 19 do
|
|
begin
|
|
MoveTo(rightRect.left + 33, rightRect.top + 47 + (i * 13));
|
|
NumToString(thisHouse.hiScores[i], tempStr);
|
|
DrawString(tempStr);
|
|
MoveTo(rightRect.left + 81, rightRect.top + 47 + (i * 13));
|
|
DrawString(thisHouse.hiRoom[i]);
|
|
end;
|
|
if ((ranking < 20) and (not inColor)) then
|
|
begin
|
|
i := (ranking * 13) + rightRect.top + 36;
|
|
SetRect(tempRect, rightRect.left + 32, i, rightRect.right - 2, i + 12);
|
|
InvertRect(tempRect);
|
|
end;
|
|
|
|
if (inColor) then
|
|
RGBForeColor(rgbViolet);
|
|
MoveTo(rightRect.left + 30, rightRect.top + 1);
|
|
LineTo(rightRect.left + 30, rightRect.bottom);
|
|
if (inColor) then
|
|
RGBForeColor(rgbBlack);
|
|
SetRect(hole, 0, 0, 12, 12);
|
|
OffsetRect(hole, rightRect.left + 10, rightRect.top + 30);
|
|
FillOval(hole, black);
|
|
OffsetRect(hole, 0, 30);
|
|
FillOval(hole, black);
|
|
OffsetRect(hole, 0, 85);
|
|
FillOval(hole, black);
|
|
OffsetRect(hole, 0, 85);
|
|
FillOval(hole, black);
|
|
OffsetRect(hole, 0, 30);
|
|
FillOval(hole, black);
|
|
|
|
if (inColor) then
|
|
begin
|
|
CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, leftRect, leftRect, srcCopy, wholeRgn);
|
|
CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, rightRect, rightRect, srcCopy, wholeRgn);
|
|
end
|
|
else
|
|
begin
|
|
CopyBits(offLoadMap, MainWndo^.portBits, leftRect, leftRect, srcCopy, wholeRgn);
|
|
CopyBits(offLoadMap, MainWndo^.portBits, rightRect, rightRect, srcCopy, wholeRgn);
|
|
end;
|
|
SetPort(wasPort);
|
|
demoMode := highScoreMode;
|
|
end;
|
|
|
|
{=================================}
|
|
|
|
function GetGrayRgn: RgnHandle;
|
|
inline
|
|
$2EB8, $09EE;
|
|
|
|
{=================================}
|
|
|
|
function GetMBarHeight: Integer;
|
|
inline
|
|
$3EB8, $0BAA;
|
|
|
|
{=================================}
|
|
|
|
procedure SetMBarHeight (newHeight: Integer);
|
|
inline
|
|
$31DF, $0BAA;
|
|
|
|
{=================================}
|
|
|
|
function GetWindowList: WindowPtr;
|
|
inline
|
|
$2EB8, $9D6;
|
|
|
|
{=================================}
|
|
|
|
function GetMBarRgn: RgnHandle;
|
|
var
|
|
theRect: Rect;
|
|
worldRgn, mBarRgn: RgnHandle;
|
|
begin
|
|
theRect := GetGrayRgn^^.rgnBBox;
|
|
UnionRect(theRect, screenBits.bounds, theRect);
|
|
worldRgn := NewRgn;
|
|
OpenRgn;
|
|
FrameRoundRect(theRect, 16, 16);
|
|
CloseRgn(worldRgn);
|
|
|
|
theRect := screenBits.bounds;
|
|
theRect.bottom := theRect.top + wasMBarHeight;
|
|
mBarRgn := NewRgn;
|
|
RectRgn(mBarRgn, theRect);
|
|
SectRgn(worldRgn, mBarRgn, mBarRgn);
|
|
|
|
DisposeRgn(worldRgn);
|
|
GetMBarRgn := mBarRgn;
|
|
end;
|
|
|
|
{=================================}
|
|
|
|
procedure HideMenuBar;
|
|
var
|
|
theRect: Rect;
|
|
mBarHeight: Integer;
|
|
grayRgn, menuBarRgn: RgnHandle;
|
|
startWindow: WindowPeek;
|
|
begin
|
|
mBarHeight := GetMBarHeight;
|
|
if (mBarHeight <> 0) then
|
|
begin
|
|
grayRgn := GetGrayRgn;
|
|
wasMBarHeight := mBarHeight;
|
|
menuBarRgn := GetMBarRgn;
|
|
SetMBarHeight(0);
|
|
UnionRgn(grayRgn, menuBarRgn, grayRgn);
|
|
|
|
startWindow := WindowPeek(GetWindowList);
|
|
PaintBehind(startWindow, menuBarRgn);
|
|
CalcVisBehind(startWindow, menuBarRgn);
|
|
DisposeRgn(menuBarRgn);
|
|
end;
|
|
end;
|
|
|
|
{=================================}
|
|
|
|
procedure ShowMenuBar;
|
|
var
|
|
grayRgn, menuBarRgn: RgnHandle;
|
|
begin
|
|
if (GetMBarHeight = 0) then
|
|
begin
|
|
grayRgn := GetGrayRgn;
|
|
menuBarRgn := GetMBarRgn;
|
|
SetMBarHeight(wasMBarHeight);
|
|
|
|
DiffRgn(grayRgn, menuBarRgn, grayRgn);
|
|
CalcVisBehind(WindowPeek(GetWindowList), menuBarRgn);
|
|
DisposeRgn(menuBarRgn);
|
|
DrawMenuBar;
|
|
end;
|
|
end;
|
|
|
|
{=================================}
|
|
|
|
procedure FatalError;
|
|
begin
|
|
InitCursor;
|
|
ShowMenuBar;
|
|
ExitToShell;
|
|
end;
|
|
|
|
{=================================}
|
|
|
|
procedure RedrawWindowFrame;
|
|
var
|
|
tempRect: Rect;
|
|
tempByte: SignedByte;
|
|
thePict: PicHandle;
|
|
begin
|
|
SetPort(GrafPtr(mainWndo));
|
|
PenNormal;
|
|
if (inColor) then
|
|
RGBForeColor(rgbBlack);
|
|
|
|
ClipRect(fullArea);
|
|
SetRect(tempRect, -rightOffset, -downOffset, 512 + (2 * rightOffset), 0);
|
|
FillRect(tempRect, black);
|
|
SetRect(tempRect, -rightOffset, 342, 512 + (2 * rightOffset), 342 + downOffset);
|
|
FillRect(tempRect, black);
|
|
SetRect(tempRect, -rightOffset, 0, 0, 342);
|
|
FillRect(tempRect, black);
|
|
SetRect(tempRect, 512, 0, 512 + rightOffset, 342);
|
|
FillRect(tempRect, black);
|
|
UseResFile(gliderResNum);
|
|
if (inColor) then
|
|
begin
|
|
SetRect(tempRect, -64, 0, 0, 342);
|
|
thePict := GetPicture(rSidePict1);
|
|
if (thePict <> nil) then
|
|
begin
|
|
tempByte := HGetState(Handle(thePict));
|
|
MoveHHi(Handle(thePict));
|
|
HLock(Handle(thePict));
|
|
DrawPicture(thePict, tempRect);
|
|
HSetState(Handle(thePict), tempByte);
|
|
end
|
|
else
|
|
GenericAlert(kErrNotEnoughMem);
|
|
ReleaseResource(Handle(thePict));
|
|
end;
|
|
if (inColor) then
|
|
begin
|
|
SetRect(tempRect, 512, 0, 512 + 64, 342);
|
|
thePict := GetPicture(rSidePict2);
|
|
if (thePict <> nil) then
|
|
begin
|
|
tempByte := HGetState(Handle(thePict));
|
|
MoveHHi(Handle(thePict));
|
|
HLock(Handle(thePict));
|
|
DrawPicture(thePict, tempRect);
|
|
HSetState(Handle(thePict), tempByte);
|
|
end
|
|
else
|
|
GenericAlert(kErrNotEnoughMem);
|
|
ReleaseResource(Handle(thePict));
|
|
end;
|
|
ClipRect(wholeArea);
|
|
end;
|
|
|
|
{=================================}
|
|
|
|
end. |