Glider4/Glider_405/Sources/G-PlaySetUp.p
John Calhoun e178486ce8 Initial check-in
There was an effort to organize the files a little bit for presenting
in this repository. I hope I have included everything needed for both
Glider 4.05 and the Room Editor 1.0.3. The code is in Pascal — THINK
Pascal was used to build the original. I’m not sure how someone would
open the project files (or for that matter the resource files) these
days. Never mind there is also a .o file (SMS.a) representing a
statically linked library (from hand-coded 68K assembly) for doing
performant 4-channel sound on 68K Macs in the day (this was licensed
from Patrick Buckland — I’m sure he won’t mind my preserving it here
for posterity, right?). Art files, sound files of unknown format…. What
a joy it will be sleuthing through these files…. Enjoy.
2016-01-26 20:30:26 -08:00

1 line
35 KiB
OpenEdge ABL
Executable File

unit PlaySetUp;
interface
uses
SMS, Balloons, Palettes, Globals, GlobalUtils, FileInNOut, PlayUtils;
procedure HorizonMouse;
procedure WrapItUp;
procedure OffAMortal;
procedure AdvanceARoom;
procedure RetreatARoom;
procedure UpAFlight (whatRoom: Integer);
procedure DownAFlight (whatRoom: Integer);
procedure Transport (whatRoom: Integer);
implementation
{=================================}
procedure HorizonMouse;
const
MBState = $172;
MTemp = $828;
RawMouse = $82C;
Mouse = $830;
CrsrNew = $8CE;
CrsrCouple = $8CF;
Couple = $FF;
Uncouple = $00;
var
horizon: Point;
lowGlob: Integer;
lowMem: Ptr;
pointPtr: ^Point;
begin
GetMouse(horizon);
horizon.v := 160;
lowMem := Pointer(rawMouse);
pointPtr := @lowMem^;
pointPtr^ := horizon;
lowMem := Pointer(MTemp);
pointPtr := @lowMem^;
pointPtr^ := horizon;
lowMem := Pointer(CrsrNew);
lowMem^ := $FFFF;
end;
{=================================}
procedure ClosingAnimation;
const
waitTicks = 4;
var
i, refNumber, whichTwist: Integer;
twisterDst, tinyGliderDst, tinyGliderSrc, wasRect, wasGlider, boltRect: Rect;
twisterSrc: array[0..3] of Rect;
timeWas: LongInt;
tempByte: SignedByte;
thePict: PicHandle;
boltWasCast, hasLetUpOnButton: Boolean;
{--------------}
procedure CastBolt;
const
cloudBottom = 140;
boltLength = 8;
var
i, start, finish: Integer;
begin
SetRect(boltRect, 512, cloudBottom, 0, (boltLength + 1) * 8 + cloudBottom + 2);
if (inColor) then
RGBForeColor(rgbWhite)
else
PenPat(white);
start := Randomize(100) + 200;
for i := 0 to boltLength do
begin
finish := Randomize(7) - 3 + start;
MoveTo(start, i * 8 + cloudBottom + 1);
LineTo(finish, (i + 1) * 8 + cloudBottom);
if (start <= boltRect.left) then
boltRect.left := start;
if (finish <= boltRect.left) then
boltRect.left := finish;
if (start >= boltRect.right) then
boltRect.right := start;
if (finish >= boltRect.right) then
boltRect.right := finish;
start := finish;
end;
if (inColor) then
RGBForeColor(rgbBlack)
else
PenPat(black);
boltWasCast := TRUE;
InsetRect(boltRect, -2, 0);
end;
{--------------}
begin
RedrawWindowFrame;
SetRect(twisterSrc[0], 208, 126, 256, 188);
SetRect(twisterSrc[1], 208, 189, 256, 251);
SetRect(twisterSrc[2], 208, 252, 256, 314);
SetRect(twisterSrc[3], 256, 268, 304, 330);
SetRect(tinyGliderSrc, 235, 315, 256, 325);
twisterDst := twisterSrc[0];
OffsetRect(twisterDst, -twisterDst.left, -twisterDst.top);
OffsetRect(twisterDst, 230, 138);
tinyGliderDst := tinyGliderSrc;
OffsetRect(tinyGliderDst, -tinyGliderDst.left, -tinyGliderDst.top);
OffsetRect(tinyGliderDst, 420, 90);
wasGlider := tinyGliderDst;
boltWasCast := FALSE;
if (inColor) then
SetPort(GrafPtr(virginCPtr))
else
SetPort(offVirginPort);
refNumber := OpenResFile(resourceName);
if (refNumber = -1) then
begin
UseResFile(gliderResNum);
GenericAlert(kErrGraphicsNotFound);
ShowMenuBar;
if (not DoOpen(kArtType)) then
Exit(ClosingAnimation);
refNumber := OpenResFile(resourceName);
if (refNumber = -1) then
begin
GenericAlert(kErrGraphicsNotFound);
ShowMenuBar;
Exit(ClosingAnimation);
end;
end;
thePict := GetPicture(rFarmPict);
if (thePict <> nil) then
begin
tempByte := HGetState(Handle(thePict));
MoveHHi(Handle(thePict));
HLock(Handle(thePict));
DrawPicture(thePict, wholeArea);
HSetState(Handle(thePict), tempByte);
ReleaseResource(Handle(thePict));
end
else
GenericAlert(kErrGraphicLoad);
CloseResFile(refNumber);
UseResFile(gliderResNum);
DissBlocks;
whichTwist := 0;
PenNormal;
if (inColor) then
SetPort(GrafPtr(mainWndo))
else
SetPort(mainWndo);
hasLetUpOnButton := FALSE;
for i := 1 to 200 do
begin
timeWas := TickCount + waitTicks;
wasRect := twisterDst;
whichTwist := i mod 4;
if ((i mod 4) = 0) then
begin
whichTwist := whichTwist + 1;
if (whichTwist > 3) then
whichTwist := 0;
OffsetRect(twisterDst, -1, 0);
wasRect.right := wasRect.right + 1;
end;
OffsetRect(tinyGliderDst, -2, -(i mod 2));
wasGlider := tinyGliderDst;
wasGlider.right := wasGlider.right + 2;
wasGlider.bottom := wasGlider.bottom + 1;
if (Randomize(20) = 0) then
CastBolt;
if (inColor) then
begin
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wasRect, wasRect, srcCopy, nil);
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, twisterSrc[whichTwist], twisterSrc[whichTwist], twisterDst);
CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wasRect, wasRect, srcCopy, nil);
end
else
begin
CopyBits(offVirginMap, offLoadMap, wasRect, wasRect, srcCopy, nil);
CopyMask(offPlayerMap, offMaskMap, offLoadMap, twisterSrc[whichTwist], twisterSrc[whichTwist], twisterDst);
CopyBits(offLoadMap, mainWndo^.portBits, wasRect, wasRect, srcCopy, nil);
end;
if (inColor) then
begin
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wasGlider, wasGlider, srcCopy, nil);
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, tinyGliderSrc, tinyGliderSrc, tinyGliderDst);
CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wasGlider, wasGlider, srcCopy, wholeRgn);
end
else
begin
CopyBits(offVirginMap, offLoadMap, wasGlider, wasGlider, srcCopy, nil);
CopyMask(offPlayerMap, offMaskMap, offLoadMap, tinyGliderSrc, tinyGliderSrc, tinyGliderDst);
CopyBits(offLoadMap, mainWndo^.portBits, wasGlider, wasGlider, srcCopy, wholeRgn);
end;
repeat
if (Button) then
begin
if (hasLetUpOnButton) then
Leave;
end
else
hasLetUpOnButton := TRUE;
GetKeys(theKeys);
if (theKeys[kReturnKeyMap]) then
Leave;
until (TickCount > timeWas);
timeWas := TickCount + waitTicks;
if (Button) then
begin
if (hasLetUpOnButton) then
Leave;
end
else
hasLetUpOnButton := TRUE;
GetKeys(theKeys);
if (theKeys[kReturnKeyMap]) then
Leave;
if (boltWasCast) then
begin
DoTheSound(17);
if (inColor) then
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, boltRect, boltRect, srcCopy, wholeRgn)
else
CopyBits(offVirginMap, mainWndo^.portBits, boltRect, boltRect, srcCopy, wholeRgn);
boltWasCast := FALSE;
end;
end;
end;
{=================================}
procedure GameOver;
const
timeBetween = 6;
var
i, i2, leftOff, topOff, whichLetter: Integer;
dummyLong: LongInt;
letters: array[0..6] of Rect;
dest: Rect;
tempStr: Str255;
hasLetUpOnButton: Boolean;
begin
SetRect(letters[0], 375, 33, 409, 78); {G}
SetRect(letters[1], 375, 77, 409, 122); {a}
SetRect(letters[2], 375, 121, 409, 166); {m}
SetRect(letters[3], 375, 165, 409, 210); {e}
SetRect(letters[4], 375, 209, 409, 254); {O}
SetRect(letters[5], 375, 253, 409, 298); {v}
SetRect(letters[6], 375, 297, 409, 342); {r}
hasLetUpOnButton := FALSE;
if (inColor) then
SetPort(GrafPtr(virginCPtr))
else
SetPort(offVirginPort);
FillRect(wholeArea, black);
NumToString(roomScore + suppScore, tempStr);
if (inColor) then
begin
PenNormal;
TextFont(204);
TextSize(32);
MoveTo(120, 80);
RGBForeColor(rgbYellow);
PenMode(srcOr);
DrawString(tempStr);
PenNormal;
RGBForeColor(rgbBlack);
TextFont(SystemFont);
TextSize(12);
end
else
begin
TextFont(204);
TextSize(32);
TextMode(patXOr);
MoveTo(120, 80);
DrawString(tempStr);
TextFont(SystemFont);
TextSize(12);
end;
DissBlocks;
SetRect(dest, 0, 0, 34, 45);
OffsetRect(dest, 113, 100);
DoTheSound(21);
if (inColor) then
CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, letters[0], dest, srcCopy, nil)
else
CopyBits(offPlayerMap, mainWndo^.portBits, letters[0], dest, srcCopy, nil);
OffsetRect(dest, 36, 0);
Delay(timeBetween, dummyLong);
DoTheSound(21);
if (inColor) then
CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, letters[1], dest, srcCopy, nil)
else
CopyBits(offPlayerMap, mainWndo^.portBits, letters[1], dest, srcCopy, nil);
OffsetRect(dest, 36, 0);
Delay(timeBetween, dummyLong);
DoTheSound(21);
if (inColor) then
CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, letters[2], dest, srcCopy, nil)
else
CopyBits(offPlayerMap, mainWndo^.portBits, letters[2], dest, srcCopy, nil);
OffsetRect(dest, 36, 0);
Delay(timeBetween, dummyLong);
DoTheSound(21);
if (inColor) then
CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, letters[3], dest, srcCopy, nil)
else
CopyBits(offPlayerMap, mainWndo^.portBits, letters[3], dest, srcCopy, nil);
OffsetRect(dest, 36, 0);
Delay(timeBetween, dummyLong);
DoTheSound(21);
if (inColor) then
CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, letters[4], dest, srcCopy, nil)
else
CopyBits(offPlayerMap, mainWndo^.portBits, letters[4], dest, srcCopy, nil);
OffsetRect(dest, 36, 0);
Delay(timeBetween, dummyLong);
DoTheSound(21);
if (inColor) then
CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, letters[5], dest, srcCopy, nil)
else
CopyBits(offPlayerMap, mainWndo^.portBits, letters[5], dest, srcCopy, nil);
OffsetRect(dest, 36, 0);
Delay(timeBetween, dummyLong);
DoTheSound(21);
if (inColor) then
CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, letters[3], dest, srcCopy, nil)
else
CopyBits(offPlayerMap, mainWndo^.portBits, letters[3], dest, srcCopy, nil);
OffsetRect(dest, 36, 0);
Delay(timeBetween, dummyLong);
DoTheSound(21);
if (inColor) then
CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, letters[6], dest, srcCopy, nil)
else
CopyBits(offPlayerMap, mainWndo^.portBits, letters[6], dest, srcCopy, nil);
for i := 1 to 20 do
begin
if (Button) then
begin
if (hasLetUpOnButton) then
Leave;
end
else
hasLetUpOnButton := TRUE;
GetKeys(theKeys);
if (theKeys[kReturnKeyMap]) then
Leave;
SetRect(dest, 0, 0, 34, 45);
OffsetRect(dest, 113, 100 + i * 8);
for i2 := 0 to 7 do
begin
SetRect(letters[0], 375, 33, 409, 78); {G}
SetRect(letters[1], 375, 77, 409, 122); {a}
SetRect(letters[2], 375, 121, 409, 166); {m}
SetRect(letters[3], 375, 165, 409, 210); {e}
SetRect(letters[4], 375, 209, 409, 254); {O}
SetRect(letters[5], 375, 253, 409, 298); {v}
SetRect(letters[6], 375, 297, 409, 342); {r}
if (i2 = 6) then
whichLetter := 3
else if (i2 = 7) then
whichLetter := 6
else
whichLetter := i2;
OffsetRect(dest, Randomize(i * 2 + 1) - i, 0);
Delay(1, dummyLong);
if (inColor) then
CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, letters[whichLetter], dest, srcCopy, nil)
else
CopyBits(offPlayerMap, mainWndo^.portBits, letters[whichLetter], dest, srcCopy, nil);
OffsetRect(dest, 36, 0);
end;
end;
for i := 1 to 200 do
begin
Delay(1, dummyLong);
if (Button) then
begin
if (hasLetUpOnButton) then
Leave;
end
else
hasLetUpOnButton := TRUE;
GetKeys(theKeys);
if (theKeys[kReturnKeyMap]) then
Leave;
end;
end;
{=================================}
procedure WrapItUp;
var
tempByte: SignedByte;
tempRect: Rect;
thePict: PicHandle;
begin
playing := FALSE;
pausing := FALSE;
if (hasMirror) then
begin
hasMirror := FALSE;
HUnlock(Handle(mirrorRgn));
DisposeRgn(mirrorRgn);
end;
if (hasWindow) then
begin
hasWindow := FALSE;
HUnlock(Handle(windowRgn));
DisposeRgn(windowRgn);
end;
if (hasToast) then
begin
hasToast := FALSE;
HUnlock(Handle(toastRgn));
DisposeRgn(toastRgn);
end;
ForceMainToVisible;
FlushEvents(everyEvent, 0);
theErr := PostEvent(KeyDown, 65);
RedrawWindowFrame;
GameOver;
ShowMenuBar;
if (inColor) then
SetPort(GrafPtr(virginCPtr))
else
SetPort(offVirginPort);
if (inColor) then
thePict := GetPicture(rColorIdleID)
else
thePict := GetPicture(rIdleID);
if (thePict <> nil) then
begin
tempByte := HGetState(Handle(thePict));
MoveHHi(Handle(thePict));
HLock(Handle(thePict));
DrawPicture(thePict, wholeArea);
HSetState(Handle(thePict), tempByte);
ReleaseResource(Handle(thePict));
end
else
GenericAlert(kErrGraphicLoad);
{$IFC DemoVersion}
MoveTo(13, 113);
TextFont(SystemFont);
if (inColor) then
begin
ForeColor(redColor);
TextMode(patOr);
DrawString('DEMO VERSION');
ForeColor(blackColor);
end
else
begin
TextMode(patXOr);
DrawString('DEMO VERSION');
end;
{$ENDC}
DissBlocks;
{$IFC not DemoVersion}
EnableItem(GetMenu(mGame), iLoadHouse);
{$ENDC}
DisableItem(GetMenu(mGame), iEndGame);
{$IFC not DemoVersion}
EnableItem(GetMenu(mGame), iLoadGame);
{$ENDC}
DisableItem(GetMenu(mGame), iSaveGame);
DisableItem(GetMenu(mGame), iSaveGameAs);
EnableItem(GetMenu(mOption), iHiScores);
InitCursor;
SortHiScores;
if (smsIsActive) then
SMSExit;
smsIsActive := FALSE;
end;
{=================================}
procedure AdvanceAFile;
var
i: Integer;
wasHouse, newHouse: string[32];
{----------}
procedure ExitGracefully;
begin
roomAt := 0;
roomsPassed := roomsPassed - 1;
ClosingAnimation;
WrapItUp;
Exit(AdvanceAFile);
end;
{----------}
begin
wasHouse := housesName;
housesName := thisHouse.nextFile;
fileWasLost := FALSE;
if (not GetHouse) then
ExitGracefully;
if (fileWasLost) then
begin
newHouse := housesName;
housesName := wasHouse;
if (not GetHouse) then
ExitGracefully;
thisHouse.nextFile := newHouse;
if (not WriteHouse) then
ExitGracefully;
housesName := thisHouse.nextFile;
if (not GetHouse) then
ExitGracefully;
end;
CalcRoomScore;
suppScore := suppScore + roomScore;
for i := 1 to 40 do
roomVisits[i] := FALSE;
roomScore := 0;
end;
{=================================}
procedure OffAMortal;
var
tempRect: Rect;
tempStr: Str255;
begin
with theGlider do
begin
if (inColor) then
begin
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeRect, wholeRect, srcCopy, wholeRgn);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeShado, wholeShado, srcCopy, wholeRgn);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeShado, wholeShado, srcCopy, wholeRgn);
end
else
begin
UnionRect(destRect, oldRect, wholeRect);
UnionRect(shadoDest, oldShado, wholeShado);
CopyBits(offVirginMap, offLoadMap, wholeRect, wholeRect, srcCopy, wholeRgn);
CopyBits(offVirginMap, offLoadMap, wholeShado, wholeShado, srcCopy, wholeRgn);
CopyBits(offVirginMap, mainWndo^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn);
CopyBits(offVirginMap, mainWndo^.portBits, wholeShado, wholeShado, srcCopy, wholeRgn);
end;
end;
if (hasMirror) then
begin
SetPort(GrafPtr(mainWndo));
EraseRgn(mirrorRgn);
if (inColor) then
SetPort(GrafPtr(loadCPtr))
else
SetPort(offLoadPort);
EraseRgn(mirrorRgn);
if (inColor) then
SetPort(GrafPtr(virginCPtr))
else
SetPort(offVirginPort);
end;
if (hasWindow) then
begin
SetPort(GrafPtr(mainWndo));
FillRgn(windowRgn, black);
if (inColor) then
SetPort(GrafPtr(loadCPtr))
else
SetPort(offLoadPort);
FillRgn(windowRgn, black);
if (inColor) then
SetPort(GrafPtr(virginCPtr))
else
SetPort(offVirginPort);
end;
mortals := mortals - 1;
if (mortals < 1) then
begin
WrapItUp;
Exit(OffAMortal);
end;
if (mortals < 4) then {hide a token glider}
begin
SetRect(tempRect, 470, 5, 505, 20);
OffsetRect(tempRect, -37 * (mortals - 1), 0);
if (inColor) then
SetPort(GrafPtr(virginCPtr))
else
SetPort(offVirginPort);
PenNormal;
PaintRect(tempRect);
if (inColor) then
begin
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, tempRect, tempRect, srcCopy, wholeRgn);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, tempRect, tempRect, srcCopy, wholeRgn);
end
else
begin
CopyBits(offVirginMap, offLoadMap, tempRect, tempRect, srcCopy, wholeRgn);
CopyBits(offVirginMap, mainWndo^.portBits, tempRect, tempRect, srcCopy, wholeRgn);
end;
SetRect(tempRect, 384, 5, 397, 20);
PaintRect(tempRect);
if (inColor) then
begin
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, tempRect, tempRect, srcCopy, nil);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, tempRect, tempRect, srcCopy, wholeRgn);
end
else
begin
CopyBits(offVirginMap, offLoadMap, tempRect, tempRect, srcCopy, nil);
CopyBits(offVirginMap, mainWndo^.portBits, tempRect, tempRect, srcCopy, wholeRgn);
end;
end
else
begin
if (inColor) then
SetPort(GrafPtr(virginCPtr))
else
SetPort(offVirginPort);
PenNormal;
SetRect(tempRect, 384, 5, 396, 20);
PaintRect(tempRect);
MoveTo(tempRect.left, tempRect.bottom - 2);
TextFont(16);
TextSize(12);
NumToString(mortals - 1, tempStr);
if (inColor) then
begin
RGBForeColor(rgbRed);
PenMode(srcOr);
DrawString(tempStr);
PenNormal;
RGBForeColor(rgbBlack);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, tempRect, tempRect, srcCopy, nil);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, tempRect, tempRect, srcCopy, wholeRgn);
end
else
begin
TextMode(patXOr);
DrawString(tempStr);
PenNormal;
CopyBits(offVirginMap, offLoadMap, tempRect, tempRect, srcCopy, nil);
CopyBits(offVirginMap, mainWndo^.portBits, tempRect, tempRect, srcCopy, wholeRgn);
end;
end;
ResetGlider;
end;
{=================================}
procedure CheckForTimeBonus;
var
tempStr: Str255;
tempRect: Rect;
timeBonus, dummyLong: LongInt;
i: Integer;
begin
timeBonus := 0;
if (loopsThruRoom < kBonusTimeToBeat) then
timeBonus := (kBonusTimeToBeat - loopsThruRoom) * ((roomAt div 5) + 1);
suppScore := suppScore + timeBonus;
loopsThruRoom := 0;
NumToString(timeBonus, tempStr);
tempStr := CONCAT('Time Bonus = ', tempStr);
SetRect(tempRect, 190, 100, 312, 117);
SetPort(GrafPtr(mainWndo));
if (inColor) then
begin
PenNormal;
PaintRect(tempRect);
PenMode(patXOr);
InsetRect(tempRect, 1, 1);
FrameRect(tempRect);
PenNormal;
InsetRect(tempRect, -1, -1);
RGBForeColor(rgbYellow);
TextFont(16);
TextSize(12);
PenMode(srcOr);
MoveTo(tempRect.left + 3, tempRect.bottom - 4);
DrawString(tempStr);
RGBForeColor(rgbBlack);
SetPort(GrafPtr(virginCPtr));
PenNormal;
PaintRect(tempRect);
PenMode(patXOr);
InsetRect(tempRect, 1, 1);
FrameRect(tempRect);
PenNormal;
InsetRect(tempRect, -1, -1);
RGBForeColor(rgbYellow);
PenNormal;
TextFont(16);
TextSize(12);
PenMode(srcOr);
MoveTo(tempRect.left + 3, tempRect.bottom - 4);
DrawString(tempStr);
RGBForeColor(rgbBlack);
end
else
begin
PenNormal;
PaintRect(tempRect);
PenMode(patXOr);
InsetRect(tempRect, 1, 1);
FrameRect(tempRect);
PenNormal;
InsetRect(tempRect, -1, -1);
TextFont(16);
TextSize(12);
TextMode(patXOr);
MoveTo(tempRect.left + 3, tempRect.bottom - 4);
DrawString(tempStr);
PenNormal;
SetPort(offVirginPort);
PenNormal;
PaintRect(tempRect);
PenMode(patXOr);
InsetRect(tempRect, 1, 1);
FrameRect(tempRect);
PenNormal;
InsetRect(tempRect, -1, -1);
TextFont(16);
TextSize(12);
TextMode(patXOr);
MoveTo(tempRect.left + 3, tempRect.bottom - 4);
DrawString(tempStr);
PenNormal;
SetPort(offLoadPort);
PenNormal;
PaintRect(tempRect);
PenMode(patXOr);
InsetRect(tempRect, 1, 1);
FrameRect(tempRect);
PenNormal;
InsetRect(tempRect, -1, -1);
TextFont(16);
TextSize(12);
TextMode(patXOr);
MoveTo(tempRect.left + 3, tempRect.bottom - 4);
DrawString(tempStr);
PenNormal;
end;
for i := 1 to 30 do
begin
HorizonMouse;
Delay(1, dummyLong);
end;
end;
{=================================}
procedure SetRoomState;
var
oldRoomScore: LongInt;
i: Integer;
begin
if (didntExitEntrance) then
roomVisits[roomAt] := TRUE;
bassLoop := 0;
playBassTime := kBonusTimeToBeat div kBassFract + kMinBassLoop;
StartScoreRolling;
oldRoomScore := roomScore;
CalcRoomScore;
if ((oldRoomScore < roomScore) and (didntExitEntrance)) then
CheckForTimeBonus;
loopsThruRoom := 0;
for i := 1 to nObjects do
case (eventKind[i, 0]) of
awardIt, extraIt, energizeIt, bandIt, trickIt:
begin
thisHouse.theRooms[roomAt].theObjects[i].amount := eventKind[i, 1];
end;
lightIt, airOnIt:
begin
if ((not lightsOut) and (not airOut)) then
thisHouse.theRooms[roomAt].conditionCode := 0;
end;
otherwise
end;
if (hasMirror) then
begin
SetPort(GrafPtr(mainWndo));
EraseRgn(mirrorRgn);
if (inColor) then
SetPort(GrafPtr(loadCPtr))
else
SetPort(offLoadPort);
EraseRgn(mirrorRgn);
if (inColor) then
SetPort(GrafPtr(virginCPtr))
else
SetPort(offVirginPort);
end;
with theGlider do
begin
if (inColor) then
begin
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, destRect, destRect, srcCopy, wholeRgn);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, shadoDest, shadoDest, srcCopy, wholeRgn);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, destRect, destRect, srcCopy, wholeRgn);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, shadoDest, shadoDest, srcCopy, wholeRgn);
end
else
begin
CopyBits(offVirginMap, offLoadMap, destRect, destRect, srcCopy, wholeRgn);
CopyBits(offVirginMap, offLoadMap, shadoDest, shadoDest, srcCopy, wholeRgn);
CopyBits(offVirginMap, mainWndo^.portBits, destRect, destRect, srcCopy, wholeRgn);
CopyBits(offVirginMap, mainWndo^.portBits, shadoDest, shadoDest, srcCopy, wholeRgn);
end;
end;
end;
{=================================}
procedure ScrollForward;
var
srcRect: Rect;
waitTicks: LongInt;
index: Integer;
begin
with theGlider do
begin
destRect.left := 0;
destRect.right := 48;
oldRect := destRect;
wholeRect := destRect;
shadoDest.left := 0;
shadoDest.right := 48;
oldShado := shadoDest;
wholeShado := shadoDest;
touchRect := destRect;
InsetRect(touchRect, 10, 5);
end;
SetRect(srcRect, 496, 0, 512, 342);
for index := 0 to 31 do
begin
HorizonMouse;
waitTicks := TickCount;
repeat
until (TickCount > waitTicks);
if (inColor) then
begin
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, srcRect, srcRect, srcCopy, nil);
SetPort(GrafPtr(mainWndo));
PenNormal;
MoveTo(srcRect.left - 1, srcRect.top);
Line(0, 322);
SetPort(GrafPtr(virginCPtr));
end
else
begin
CopyBits(offVirginMap, mainWndo^.portBits, srcRect, srcRect, srcCopy, nil);
SetPort(mainWndo);
PenNormal;
MoveTo(srcRect.left - 1, srcRect.top);
Line(0, 322);
SetPort(offVirginPort);
end;
srcRect.right := srcRect.right - 16;
srcRect.left := srcRect.left - 16;
end;
end;
{=================================}
procedure ScrollBackward;
var
srcRect: Rect;
waitTicks: LongInt;
index: Integer;
begin
with theGlider do
begin
destRect.left := 464;
destRect.right := 512;
oldRect := destRect;
wholeRect := destRect;
shadoDest.left := 464;
shadoDest.right := 512;
oldShado := shadoDest;
wholeShado := shadoDest;
touchRect := destRect;
InsetRect(touchRect, 10, 5);
end;
SetRect(srcRect, 0, 0, 16, 342);
if (inColor) then
CopyBits(GrafPtr(mainWndo)^.portBits, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, nil)
else
CopyBits(mainWndo^.portBits, offLoadMap, wholeArea, wholeArea, srcCopy, nil);
for index := 0 to 31 do
begin
HorizonMouse;
waitTicks := TickCount;
repeat
until (TickCount > waitTicks);
if (inColor) then
begin
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, srcRect, srcRect, srcCopy, nil);
SetPort(GrafPtr(mainWndo));
PenNormal;
MoveTo(srcRect.right, srcRect.top);
Line(0, 322);
SetPort(GrafPtr(virginCPtr));
end
else
begin
CopyBits(offVirginMap, mainWndo^.portBits, srcRect, srcRect, srcCopy, nil);
SetPort(mainWndo);
PenNormal;
MoveTo(srcRect.right, srcRect.top);
Line(0, 322);
SetPort(offVirginPort);
end;
srcRect.right := srcRect.right + 16;
srcRect.left := srcRect.left + 16;
end;
end;
{=================================}
procedure ScrollUp;
var
srcRect: Rect;
waitTicks: LongInt;
index, leftCorner: Integer;
begin
leftCorner := 232;
for index := 1 to 16 do
with thisHouse.theRooms[roomAt].theObjects[index] do
if (objectIs = dnStar) then
leftCorner := boundRect.left + 64;
with theGlider do
begin
destRect.left := leftCorner;
destRect.right := leftCorner + 48;
destRect.top := kFloorVert - 20;
destRect.bottom := kFloorVert;
oldRect := destRect;
wholeRect := destRect;
shadoDest.left := destRect.left;
shadoDest.right := destRect.right;
oldShado := shadoDest;
wholeShado := shadoDest;
touchRect := destRect;
InsetRect(touchRect, 10, 5);
end;
SetRect(srcRect, 0, 0, 512, 18);
for index := 0 to 18 do
begin
HorizonMouse;
waitTicks := TickCount;
repeat
until (TickCount > waitTicks);
if (inColor) then
begin
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, srcRect, srcRect, srcCopy, nil);
SetPort(GrafPtr(mainWndo));
PenNormal;
MoveTo(srcRect.left, srcRect.bottom);
Line(512, 0);
SetPort(GrafPtr(virginCPtr));
end
else
begin
CopyBits(offVirginMap, mainWndo^.portBits, srcRect, srcRect, srcCopy, nil);
SetPort(mainWndo);
PenNormal;
MoveTo(srcRect.left, srcRect.bottom);
Line(512, 0);
SetPort(offVirginPort);
end;
srcRect.bottom := srcRect.bottom + 18;
srcRect.top := srcRect.top + 18;
end;
end;
{=================================}
procedure ScrollDown;
var
srcRect: Rect;
waitTicks: LongInt;
index, leftCorner: Integer;
begin
leftCorner := 232;
for index := 1 to 16 do
with thisHouse.theRooms[roomAt].theObjects[index] do
if (objectIs = upStar) then
leftCorner := boundRect.left + 64;
with theGlider do
begin
destRect.left := leftCorner;
destRect.right := leftCorner + 48;
destRect.top := kCeilingVert + 20;
destRect.bottom := kCeilingVert + 40;
oldRect := destRect;
wholeRect := destRect;
shadoDest.left := destRect.left;
shadoDest.right := destRect.right;
oldShado := shadoDest;
wholeShado := shadoDest;
touchRect := destRect;
InsetRect(touchRect, 10, 5);
end;
SetRect(srcRect, 0, 324, 512, 342);
for index := 0 to 18 do
begin
waitTicks := TickCount;
repeat
until (TickCount > waitTicks);
if (inColor) then
begin
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, srcRect, srcRect, srcCopy, nil);
SetPort(GrafPtr(mainWndo));
PenNormal;
MoveTo(srcRect.left, srcRect.top - 1);
Line(512, 0);
SetPort(GrafPtr(virginCPtr));
end
else
begin
CopyBits(offVirginMap, mainWndo^.portBits, srcRect, srcRect, srcCopy, nil);
SetPort(mainWndo);
PenNormal;
MoveTo(srcRect.left, srcRect.top - 1);
Line(512, 0);
SetPort(offVirginPort);
end;
srcRect.bottom := srcRect.bottom - 18;
srcRect.top := srcRect.top - 18;
end;
end;
{=================================}
procedure AdvanceARoom;
begin
didntExitEntrance := (sideYouCantExit <> rightOfRoom);
SetRoomState;
enteredLeft := TRUE;
sideYouCantExit := leftOfRoom;
roomAt := roomAt + 1;
roomsPassed := roomsPassed + 1;
{$IFC DemoVersion}
if (roomAt > 5) then
begin
roomAt := 0;
roomsPassed := roomsPassed - 1;
ClosingAnimation;
WrapItUp;
Exit(AdvanceARoom);
end;
{$ENDC}
if (roomAt > thisHouse.numberORooms) then
begin
if ((thisHouse.nextFile = 'nil') or (thisHouse.nextFile = '')) then
begin
roomAt := 0;
roomsPassed := roomsPassed - 1;
ClosingAnimation;
WrapItUp;
Exit(AdvanceARoom);
end
else
begin
AdvanceAFile;
roomAt := 1;
end;
end;
if (roomAt <> 0) then
begin
ReadyRoom;
ScrollForward;
if (inColor) then
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, wholeRgn)
else
CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, wholeRgn);
end;
end;
{=================================}
procedure RetreatARoom;
begin
didntExitEntrance := (sideYouCantExit <> leftOfRoom);
SetRoomState;
enteredLeft := FALSE;
sideYouCantExit := rightOfRoom;
roomAt := roomAt - 1;
roomsPassed := roomsPassed - 1;
if (roomAt < 1) then
begin
roomAt := 0;
roomsPassed := roomsPassed - 1;
ClosingAnimation;
WrapItUp;
Exit(RetreatARoom);
end;
ReadyRoom;
ScrollBackward;
if (inColor) then
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, wholeRgn)
else
CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, wholeRgn);
end;
{=================================}
procedure UpAFlight;
var
addToIt: Integer;
begin
didntExitEntrance := (sideYouCantExit <> topOfRoom);
SetRoomState;
sideYouCantExit := bottomOfRoom;
addToIt := whatRoom - roomAt;
roomAt := whatRoom;
roomsPassed := roomsPassed + addToIt;
if ((roomAt > thisHouse.numberORooms) or (roomAt < 0)) then
begin
if ((thisHouse.nextFile = 'nil') or (thisHouse.nextFile = '') or (roomAt < 0)) then
begin
roomAt := 0;
roomsPassed := roomsPassed - 1;
ClosingAnimation;
WrapItUp;
Exit(UpAFlight);
end
else
begin
AdvanceAFile;
roomAt := roomAt - 40;
end;
end
else if (roomAt = 0) then
begin
roomAt := 0;
roomsPassed := roomsPassed - 1;
ClosingAnimation;
WrapItUp;
Exit(UpAFlight);
end;
if (roomAt <> 0) then
begin
ReadyRoom;
ScrollUp;
if (inColor) then
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, wholeRgn)
else
CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, wholeRgn);
end;
end;
{=================================}
procedure DownAFlight;
var
addToIt: Integer;
begin
didntExitEntrance := (sideYouCantExit <> bottomOfRoom);
SetRoomState;
sideYouCantExit := topOfRoom;
addToIt := whatRoom - roomAt;
roomAt := whatRoom;
roomsPassed := roomsPassed + addToIt;
if ((roomAt < 0) or (roomAt > thisHouse.numberORooms)) then
begin
if ((thisHouse.nextFile = 'nil') or (thisHouse.nextFile = '') or (roomAt < 0)) then
begin
roomAt := 0;
roomsPassed := roomsPassed - 1;
ClosingAnimation;
WrapItUp;
Exit(DownAFlight);
end
else
begin
AdvanceAFile;
roomAt := roomAt - 40;
end;
end
else if (roomAt = 0) then
begin
ClosingAnimation;
WrapItUp;
Exit(DownAFlight);
end;
if (roomAt <> 0) then
begin
ReadyRoom;
ScrollDown;
if (inColor) then
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, wholeRgn)
else
CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, wholeRgn);
end;
end;
{=================================}
procedure Transport;
var
addToIt, leftCorner, index, localRoomNumber: Integer;
newRoom: Boolean;
begin
newRoom := (whatRoom <> roomAt);
if (newRoom) then
begin
didntExitEntrance := TRUE;
SetRoomState;
sideYouCantExit := whoCares;
addToIt := whatRoom - roomAt;
roomAt := whatRoom;
roomsPassed := roomsPassed + addToIt;
if ((roomAt < 0) or (roomAt > thisHouse.numberORooms)) then
begin
if ((thisHouse.nextFile = 'nil') or (thisHouse.nextFile = '') or (roomAt < 0)) then
begin
ClosingAnimation;
roomAt := 0;
WrapItUp;
Exit(Transport);
end
else
begin
localRoomNumber := roomAt - thisHouse.numberORooms;
AdvanceAFile;
roomAt := localRoomNumber;
if (roomAt > thisHouse.numberORooms) then
begin
ClosingAnimation;
roomAt := 0;
WrapItUp;
Exit(Transport);
end
end;
end
else if (roomAt = 0) then
begin
ClosingAnimation;
WrapItUp;
Exit(Transport);
end;
if (roomAt <> 0) then
ReadyRoom;
end
else {we're transporting to the room we're in}
with theGlider do
if (inColor) then
begin
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, destRect, destRect, srcCopy, wholeRgn);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, shadoDest, shadoDest, srcCopy, wholeRgn);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, destRect, destRect, srcCopy, wholeRgn);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, shadoDest, shadoDest, srcCopy, wholeRgn);
end
else
begin
CopyBits(offVirginMap, offLoadMap, destRect, destRect, srcCopy, wholeRgn);
CopyBits(offVirginMap, offLoadMap, shadoDest, shadoDest, srcCopy, wholeRgn);
CopyBits(offVirginMap, mainWndo^.portBits, destRect, destRect, srcCopy, wholeRgn);
CopyBits(offVirginMap, mainWndo^.portBits, shadoDest, shadoDest, srcCopy, wholeRgn);
end;
if (roomAt <> 0) then
begin
leftCorner := 232;
for index := 1 to 16 do
with thisHouse.theRooms[roomAt].theObjects[index] do
if ((objectIs = celDct) and (isOn)) then
leftCorner := boundRect.left;
with theGlider do
begin
destRect.left := leftCorner;
destRect.right := leftCorner + 48;
destRect.top := kCeilingVert;
destRect.bottom := kCeilingVert + 20;
oldRect := destRect;
wholeRect := destRect;
shadoDest.left := destRect.left;
shadoDest.right := destRect.right;
oldShado := shadoDest;
wholeShado := shadoDest;
touchRect := destRect;
InsetRect(touchRect, 10, 5);
end;
if (newRoom) then
begin
HorizonMouse;
DissBlocks;
if (inColor) then
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, nil)
else
CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, nil);
end;
end;
end;
{=================================}
end.