mirror of
https://github.com/softdorothy/Glider4.git
synced 2025-02-18 19:30:23 +00:00
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.
1 line
35 KiB
OpenEdge ABL
Executable File
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. |