Glider4/Glider_405/Sources/G-PlayActive.p

1 line
72 KiB
OpenEdge ABL
Executable File
Raw Blame History

unit PlayActive;
interface
uses
SMS, Palettes, Globals, GlobalUtils, FileInNOut, PlayUtils, PlaySetUp;
procedure Coordinate;
var
timeIs: LongInt;
hotRect: Rect;
sliding: Boolean;
{=================================}
implementation
{=================================}
procedure CenterMouse;
const
MBState = $172;
MTemp = $828;
RawMouse = $82C;
Mouse = $830;
CrsrNew = $8CE;
CrsrCouple = $8CF;
Couple = $FF;
Uncouple = $00;
var
center: Point;
lowGlob: Integer;
lowMem: Ptr;
pointPtr: ^Point;
begin
SetPt(center, 256, 171);
lowMem := Pointer(rawMouse);
pointPtr := @lowMem^;
pointPtr^ := center;
lowMem := Pointer(MTemp);
pointPtr := @lowMem^;
pointPtr^ := center;
lowMem := Pointer(CrsrNew);
lowMem^ := $FFFF;
end;
{=================================}
procedure IncInt (var i: integer);
inline
$205F, {MOVEA.W (A7)+, A0 }
$5250; {ADDQ.W #$1, (A0) }
{=================================}
procedure IncLong (var l: longint);
inline
$205F, {MOVEA.L (A7)+, A0 }
$5290; {ADDQ.L #$1, (A0) }
{=================================}
procedure FloatTheScore (whatPoints: Integer);
var
tempStr: Str255;
begin
with floatPoints do
begin
if (out) then
begin
if (inColor) then
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, whereR, whereR, srcCopy, wholeRgn)
else
CopyBits(offVirginMap, mainWndo^.portBits, whereR, whereR, srcCopy, wholeRgn);
if (areFlipping) then
CopyBits(offVirginMap, offLoadMap, whereR, whereR, srcCopy, wholeRgn);
end;
out := TRUE;
whereR := theGlider.destRect;
if (inColor) then
whereR.top := whereR.bottom
else
whereR.top := whereR.top - 30;
whereR.bottom := whereR.top + 12;
NumToString(whatPoints, tempStr);
saysWhat := tempStr;
SetPort(GrafPtr(mainWndo));
if (inColor) then
begin
PenNormal;
TextFont(16);
TextSize(12);
MoveTo(whereR.left, whereR.bottom - 2);
RGBForeColor(rgbYellow);
PenMode(srcOr);
DrawString(saysWhat);
PenNormal;
RGBForeColor(rgbBlack);
tickStamp := TickCount + 120;
SetPort(GrafPtr(virginCPtr))
end
else
begin
TextFont(201);
TextMode(patBic);
MoveTo(whereR.left, whereR.bottom - 2);
DrawString(tempStr);
TextFont(200);
TextMode(patOr);
MoveTo(whereR.left, whereR.bottom - 2);
DrawString(tempStr);
tickStamp := TickCount + 120;
PenNormal;
SetPort(offVirginPort);
end;
if (areFlipping) then
begin
SetPort(offLoadPort);
TextFont(201);
TextMode(patBic);
MoveTo(whereR.left, whereR.bottom - 2);
DrawString(tempStr);
TextFont(200);
TextMode(patOr);
MoveTo(whereR.left, whereR.bottom - 2);
DrawString(tempStr);
tickStamp := TickCount + 120;
PenNormal;
SetPort(offVirginPort);
end;
end;
end;
{=================================}
procedure Collision (whatKind, who: Integer);
var
tempStr: Str255;
tempRect, srcR, destReserve: Rect;
tempInt: Integer;
begin
case (whatKind) of
ignoreIt:
;
crashIt:
begin
lifeNormal := FALSE;
with theGlider do
begin
DoTheSound(1);
mode := fadingOut;
destRect.top := destRect.bottom - 20;
if (isForward) then
srcNum := 0
else
srcNum := 2;
end;
end;
liftIt:
if (not airOut) then
liftAmount := -7;
dropIt:
if (not airOut) then
liftAmount := 7;
moveIt:
begin
DoTheSound(16);
Transport(eventKind[who, 1]);
hotRect := nullRect; {don't die in rest of SearchRects}
end;
turnItLeft:
begin
shiftAmount := -7;
if (lifeNormal) then
with theGlider do
if (isRight) then
begin
lifeNormal := FALSE;
theGlider.mode := turnRt2Lf;
end;
end;
turnItRight:
begin
shiftAmount := 7;
if (lifeNormal) then
with theGlider do
if (not isRight) then
begin
lifeNormal := FALSE;
theGlider.mode := turnLf2Rt;
end;
end;
burnIt:
begin
liftAmount := -7;
if ((lifeNormal) and (theGlider.destRect.bottom > eventKind[who, 1])) then
with theGlider do
begin
DoTheSound(8);
lifeNormal := FALSE;
if (isRight) then
phase := 1;
mode := burning;
timeStamp := TickCount + 300;
destRect.top := destRect.bottom - 36;
end;
end;
awardIt: {clock}
if (eventKind[who, 1] <> 0) then
begin
DoTheSound(5);
StartScoreRolling;
suppScore := suppScore + eventKind[who, 1];
FloatTheScore(eventKind[who, 1]);
eventKind[who, 1] := 0;
thisHouse.theRooms[roomAt].theObjects[who].amount := 0;
destReserve := eventRect[who];
OffsetRect(destReserve, -destReserve.left, -destReserve.top);
OffsetRect(destReserve, reserveRects[who].left, reserveRects[who].top);
if (not lightsOut) then
if (inColor) then
begin
CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, BitMapPtr(virginCPtr^.portPixMap^)^, destReserve, eventRect[who], srcCopy, nil);
CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, destReserve, eventRect[who], srcCopy, nil);
CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, destReserve, eventRect[who], srcCopy, wholeRgn);
end
else
begin
CopyBits(offReserveMap, offVirginMap, destReserve, eventRect[who], srcCopy, nil);
CopyBits(offReserveMap, offLoadMap, destReserve, eventRect[who], srcCopy, nil);
CopyBits(offReserveMap, mainWndo^.portBits, destReserve, eventRect[who], srcCopy, wholeRgn);
end;
end;
extraIt: {folded piece of paper}
if (eventKind[who, 1] <> 0) then
begin
DoTheSound(10);
StartScoreRolling;
suppScore := suppScore + eventKind[who, 1];
FloatTheScore(eventKind[who, 1]);
eventKind[who, 1] := 0;
thisHouse.theRooms[roomAt].theObjects[who].amount := 0;
IncInt(mortals);
if (mortals <= 4) then
begin
SetRect(tempRect, 507, 5, 542, 20);
OffsetRect(tempRect, -37 * (mortals - 1), 0);
SetRect(srcR, 0, 318, 35, 333);
if (inColor) then
begin
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, srcR, srcR, tempRect);
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
CopyMask(offPlayerMap, offMaskMap, offVirginMap, srcR, srcR, tempRect);
CopyBits(offVirginMap, offLoadMap, tempRect, tempRect, srcCopy, wholeRgn);
CopyBits(offVirginMap, mainWndo^.portBits, tempRect, tempRect, srcCopy, wholeRgn);
end;
if (mortals = 4) then
begin
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;
end
else
begin
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;
destReserve := eventRect[who];
OffsetRect(destReserve, -destReserve.left, -destReserve.top);
OffsetRect(destReserve, reserveRects[who].left, reserveRects[who].top);
if (not lightsOut) then
if (inColor) then
begin
CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, BitMapPtr(virginCPtr^.portPixMap^)^, destReserve, eventRect[who], srcCopy, nil);
CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, destReserve, eventRect[who], srcCopy, nil);
CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, destReserve, eventRect[who], srcCopy, wholeRgn);
end
else
begin
CopyBits(offReserveMap, offVirginMap, destReserve, eventRect[who], srcCopy, nil);
CopyBits(offReserveMap, offLoadMap, destReserve, eventRect[who], srcCopy, nil);
CopyBits(offReserveMap, mainWndo^.portBits, destReserve, eventRect[who], srcCopy, wholeRgn);
end;
end;
spillIt: {grease upright}
begin
eventRect[who].left := eventRect[who].right;
eventRect[who].right := eventRect[who].right;
eventRect[who].top := eventRect[who].bottom - 5;
eventKind[who, 0] := ignoreIt; {signal to the cycleOb loop that a spill has occurred}
thisHouse.theRooms[roomAt].theObjects[who].isOn := FALSE;
end;
slideIt: {grease spilt}
begin
with theGlider do
begin
tempInt := eventRect[who].top - touchRect.bottom + 1;
destRect.top := destRect.top + tempInt;
destRect.bottom := destRect.bottom + tempInt;
touchRect.top := touchRect.top + tempInt;
touchRect.bottom := touchRect.bottom + tempInt;
end;
sliding := TRUE;
end;
bandIt: {rubber bands}
if (eventKind[who, 1] <> 0) then
begin
DoTheSound(12);
theGlider.bands := theGlider.bands + eventKind[who, 1];
FloatTheScore(eventKind[who, 1]);
eventKind[who, 1] := 0;
thisHouse.theRooms[roomAt].theObjects[who].amount := 0;
PopTokenBand;
UpdateBandNumbers;
destReserve := eventRect[who];
OffsetRect(destReserve, -destReserve.left, -destReserve.top);
OffsetRect(destReserve, reserveRects[who].left, reserveRects[who].top);
if (not lightsOut) then
if (inColor) then
begin
CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, BitMapPtr(virginCPtr^.portPixMap^)^, destReserve, eventRect[who], srcCopy, nil);
CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, destReserve, eventRect[who], srcCopy, nil);
CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, destReserve, eventRect[who], srcCopy, wholeRgn);
end
else
begin
CopyBits(offReserveMap, offVirginMap, destReserve, eventRect[who], srcCopy, nil);
CopyBits(offReserveMap, offLoadMap, destReserve, eventRect[who], srcCopy, nil);
CopyBits(offReserveMap, mainWndo^.portBits, destReserve, eventRect[who], srcCopy, wholeRgn);
end;
end;
energizeIt: {battery}
if (eventKind[who, 1] <> 0) then
begin
DoTheSound(9);
theGlider.energy := theGlider.energy + eventKind[who, 1];
FloatTheScore(eventKind[who, 1]);
eventKind[who, 1] := 0;
thisHouse.theRooms[roomAt].theObjects[who].amount := 0;
PopTokenBattery;
UpdateBatteryEnergy;
destReserve := eventRect[who];
OffsetRect(destReserve, -destReserve.left, -destReserve.top);
OffsetRect(destReserve, reserveRects[who].left, reserveRects[who].top);
if (not lightsOut) then
if (inColor) then
begin
CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, BitMapPtr(virginCPtr^.portPixMap^)^, destReserve, eventRect[who], srcCopy, nil);
CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, destReserve, eventRect[who], srcCopy, nil);
CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, destReserve, eventRect[who], srcCopy, wholeRgn);
end
else
begin
CopyBits(offReserveMap, offVirginMap, destReserve, eventRect[who], srcCopy, nil);
CopyBits(offReserveMap, offLoadMap, destReserve, eventRect[who], srcCopy, nil);
CopyBits(offReserveMap, mainWndo^.portBits, destReserve, eventRect[who], srcCopy, wholeRgn);
end;
end;
trickIt: {good move!}
if (eventKind[who, 1] <> 0) then
begin
DoTheSound(kWhistleSound);
StartScoreRolling;
suppScore := suppScore + eventKind[who, 1];
FloatTheScore(eventKind[who, 1]);
eventKind[who, 1] := 0;
end;
lightIt:
if (lightsOut) then
begin
DoTheSound(18);
lightsOut := FALSE;
thisHouse.theRooms[roomAt].conditionCode := 0;
LoadABackground(thisHouse.theRooms[roomAt].backPictID);
ArrangeTiles;
DrawAllObjects;
DrawHeadline;
if (inColor) then
begin
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, wholeRgn);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeArea, wholeArea, srcCopy, wholeRgn);
end
else
begin
CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, wholeRgn);
CopyBits(offVirginMap, mainWndo^.portBits, wholeArea, wholeArea, srcCopy, wholeRgn);
end;
end;
airOnIt:
if (airOut) then
begin
DoTheSound(3);
airOut := FALSE;
end;
zapIt:
if (eventKind[who, 1] <> 0) then
begin
lifeNormal := FALSE;
DoTheSound(24);
with theGlider do
begin
mode := fadingOut;
destRect.top := destRect.bottom - 20;
if (isForward) then
srcNum := 0
else
srcNum := 2;
end;
end;
toggleIt:
if (eventKind[who, 2] < TickCount) then
begin
DoTheSound(18);
tempInt := eventKind[who, 1];
with thisHouse.theRooms[roomAt].theObjects[tempInt] do
begin
isOn := not isOn;
case objectIs of
lftFan:
if (eventKind[tempInt, 0] = ignoreIt) then
begin
DoTheSound(3);
eventKind[tempInt, 0] := turnItLeft;
end
else
eventKind[tempInt, 0] := ignoreIt;
ritFan:
if (eventKind[tempInt, 0] = ignoreIt) then
begin
DoTheSound(3);
eventKind[tempInt, 0] := turnItRight;
end
else
eventKind[tempInt, 0] := ignoreIt;
shredr:
if (eventKind[tempInt, 0] = ignoreIt) then
eventKind[tempInt, 0] := shredIt
else
eventKind[tempInt, 0] := ignoreIt;
otherwise
end; {case}
end; {with}
eventKind[who, 2] := TickCount + 90;
end;
playIt:
if (eventKind[who, 1] < TickCount) then
begin
DoTheSound(15);
eventKind[who, 1] := TickCount + 120;
end;
ascendIt:
begin
lifeNormal := FALSE;
theGlider.mode := ascending;
UpAFlight(eventKind[who, 1]);
hotRect := nullRect; {don't die in rest of SearchRects}
end;
descendIt:
begin
lifeNormal := FALSE;
theGlider.mode := descending;
DownAFlight(eventKind[who, 1]);
hotRect := nullRect; {don't die in rest of SearchRects}
end;
shredIt:
begin
lifeNormal := FALSE;
with theGlider do
begin
mode := shredding;
destRect.top := eventRect[who].bottom;
destRect.bottom := destRect.top;
destRect.left := eventRect[who].left + 12;
destRect.right := destRect.left + 48;
shadoDest.left := destRect.left;
shadoDest.right := destRect.right;
phase := 0;
end;
end;
steamIt:
begin
liftAmount := -7;
shiftAmount := -7;
end;
otherwise
end; {case}
end;
{=================================}
procedure SearchRects;
var
index, outside: Integer;
tempRect: Rect;
{----------------}
function RectLap (rect1, rect2: Rect): Boolean;
var
dumRect: Rect;
begin
RectLap := FALSE;
if (rect1.right < rect2.left) then
Exit(RectLap);
if (rect2.right < rect2.left) then
Exit(RectLap);
if (rect1.bottom < rect2.top) then
Exit(RectLap);
if (rect2.bottom < rect2.top) then
Exit(RectLap);
RectLap := SectRect(rect1, rect2, dumRect);
end;
{----------------}
procedure BiteIt;
begin
with theGlider do
begin
DoTheSound(1);
lifeNormal := FALSE;
mode := fadingOut;
destRect.top := destRect.bottom - 20;
if (isForward) then
srcNum := 0
else
srcNum := 2;
end;
end;
{----------------}
procedure GetItLegal;
begin
{do a bump sound here}
with theGlider do
begin
with destRect do
begin
left := left + outside;
right := right + outside;
end;
with shadoDest do
begin
left := left + outside;
right := right + outside;
end;
with touchRect do
begin
left := left + outside;
right := right + outside;
end;
end;
end;
{----------------}
begin
with theGlider do
begin
hotRect := touchRect; {get 'hot rect'}
if (rightIsOpen) then {check right edge}
begin
if (destRect.left > 500) then
begin
AdvanceARoom;
Exit(SearchRects);
end
end
else if (destRect.right > 512) then
begin
outside := 512 - destRect.right;
GetItLegal;
end;
if (leftIsOpen) then {check left edge}
begin
if (destRect.right < 12) then
begin
RetreatARoom;
Exit(SearchRects);
end;
end
else if (destRect.left < 0) then
begin
outside := -destRect.left;
GetItLegal;
end;
if (destRect.bottom > kFloorLimit) then {check floor}
BiteIt;
end; {---with theGlider do---}
shiftAmount := 0;
for index := 1 to nObjects do
if (RectLap(eventRect[index], hotRect)) then
Collision(eventKind[index, 0], index);
if (nAnimates <> 0) then
for index := 1 to nAnimates do
if (RectLap(theAnimates[index].destRect, hotRect)) then
begin
BiteIt;
Leave;
end;
end;
{=================================}
procedure HandleBand;
var
index: Integer;
tempRect: Rect;
{----------------}
function RectLap (rect1, rect2: Rect): Boolean;
var
dumRect: Rect;
begin
RectLap := FALSE;
if (rect1.right < rect2.left) then
Exit(RectLap);
if (rect2.right < rect2.left) then
Exit(RectLap);
if (rect1.bottom < rect2.top) then
Exit(RectLap);
if (rect2.bottom < rect2.top) then
Exit(RectLap);
RectLap := SectRect(rect1, rect2, dumRect);
end;
{----------------}
begin
with theBand do
begin
if ((whole.left > 512) or (whole.left < -16)) then
bandBorne := FALSE;
IncInt(phase);
if (phase > 2) then
phase := 0;
whole := dest;
with dest do
begin
left := left + velocity;
right := right + velocity;
end;
if (velocity > 0) then
whole.right := whole.right + velocity
else
whole.left := whole.left + velocity;
if (nAnimates > 0) then
for index := 1 to nAnimates do
with theAnimates[index] do
if (vertOff <> 12) then
if (RectLap(destRect, dest)) then
begin
case kind of
0:
DoTheSound(6);
1:
DoTheSound(6);
2:
DoTheSound(19);
otherwise
end;
phase := -1;
StartScoreRolling;
suppScore := suppScore + 100 * (3 - kind);
horiOff := 0;
vertOff := 12;
end;
end; {with}
end;
{=================================}
procedure GetInput;
const
holdKey = 1;
dropKey = 2;
absMouse = 3;
relMouse = 4;
var
pull: Integer;
thePt: Point;
dest: Rect;
{--------------------}
procedure PushIt (howFast: Integer);
begin
with theGlider do
if (energy > 0) then
begin
energy := energy - 1;
DoTheSound(26);
UpdateBatteryEnergy;
if (energy = 0) then
begin
SetRect(dest, 308, 5, 335, 20);
FillRect(dest, black);
if (inColor) then
begin
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, dest, dest, srcCopy, wholeRgn);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, dest, dest, srcCopy, wholeRgn)
end
else
begin
CopyBits(offVirginMap, mainWndo^.portBits, dest, dest, srcCopy, wholeRgn);
CopyBits(offVirginMap, offLoadMap, dest, dest, srcCopy, wholeRgn);
end;
end;
forVel := howFast;
end;
end;
{--------------------}
procedure FireBand;
begin
with theGlider do
if (bands > 0) then
begin
DoTheSound(11);
bands := bands - 1;
UpdateBandNumbers;
if (bands = 0) then
begin
SetRect(dest, 346, 5, 368, 20);
FillRect(dest, black);
if (inColor) then
begin
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, dest, dest, srcCopy, wholeRgn);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, dest, dest, srcCopy, wholeRgn);
end
else
begin
CopyBits(offVirginMap, mainWndo^.portBits, dest, dest, srcCopy, wholeRgn);
CopyBits(offVirginMap, offLoadMap, dest, dest, srcCopy, wholeRgn);
end;
end;
bandBorne := TRUE;
with theBand do
begin
dest.top := destRect.top + 6;
dest.bottom := dest.top + 7;
if (isRight) then
begin
dest.left := destRect.right;
velocity := 16;
end
else
begin
dest.left := destRect.left - 16;
velocity := -16;
end;
dest.right := dest.left + 16;
whole := dest;
old := dest;
end;
end;
end;
{--------------------}
begin
with theGlider do
begin
case controlMethod of
holdKey:
begin
if (theKeys[leftKey]) then
if (isRight) then
begin
isForward := FALSE;
srcNum := 1;
forVel := -kMaxThrust;
end
else
begin
isForward := TRUE;
srcNum := 2;
forVel := -kMaxThrust;
end
else if (theKeys[rightKey]) then
if (isRight) then
begin
isForward := TRUE;
srcNum := 0;
forVel := kMaxThrust;
end
else
begin
isForward := FALSE;
srcNum := 3;
forVel := kMaxThrust;
end
else {no key of import down}
begin
if (isRight) then
begin
isForward := TRUE;
srcNum := 0;
forVel := 0;
end
else
begin
isForward := TRUE;
srcNum := 2;
forVel := 0;
end;
end;
if (theKeys[bandKey] and (not bandBorne)) then {fire rubber bands}
FireBand;
if (theKeys[energyKey]) then
begin
if (((isRight) and (isForward)) or ((not isRight) and (not isForward))) then
PushIt(16)
else
PushIt(-16);
end;
end;
dropKey:
begin
if (((isRight) and (isForward)) or ((not isRight) and (not isForward))) then
forVel := kMaxThrust
else
forVel := -kMaxThrust;
if (theKeys[leftKey]) then
if (isRight) then
begin
isForward := FALSE;
srcNum := 1;
forVel := -kMaxThrust;
end
else
begin
isForward := TRUE;
srcNum := 2;
forVel := -kMaxThrust;
end
else if (theKeys[rightKey]) then
if (isRight) then
begin
isForward := TRUE;
srcNum := 0;
forVel := kMaxThrust;
end
else
begin
isForward := FALSE;
srcNum := 3;
forVel := kMaxThrust;
end;
if (theKeys[bandKey] and (not bandBorne)) then {fire rubber bands}
FireBand;
if (theKeys[energyKey]) then
begin
if (((isRight) and (isForward)) or ((not isRight) and (not isForward))) then
PushIt(16)
else
PushIt(-16);
end;
end; {end - dropKey}
absMouse:
begin
if ((theKeys[bandKey]) and (not bandBorne)) then
FireBand;
GetMouse(thePt);
HorizonMouse;
pull := (thePt.h - 256) div 32;
if (pull > kMaxThrust) then
pull := kMaxThrust
else if (pull < -kMaxThrust) then
pull := -kMaxThrust;
forVel := pull;
if (isRight) then
if (forVel < 0) then
begin
isForward := FALSE;
srcNum := 1;
if (theKeys[energyKey]) then
PushIt(-16);
if (button) then
begin
if (not buttonFires) then
PushIt(-16)
else if ((not bandBorne) and (buttonFires)) then
FireBand;
end;
end
else
begin
isForward := TRUE;
srcNum := 0;
if (theKeys[energyKey]) then
PushIt(16);
if (button) then
begin
if (not buttonFires) then
PushIt(16)
else if ((not bandBorne) and (buttonFires)) then
FireBand;
end;
end
else
begin
if (forVel < 0) then
begin
isForward := TRUE;
srcNum := 2;
if (theKeys[energyKey]) then
PushIt(-16);
if (button) then
begin
if (not buttonFires) then
PushIt(-16)
else if ((not bandBorne) and (buttonFires)) then
FireBand;
end;
end
else
begin
isForward := FALSE;
srcNum := 3;
if (theKeys[energyKey]) then
PushIt(16);
if (button) then
begin
if (not buttonFires) then
PushIt(16)
else if ((not bandBorne) and (buttonFires)) then
FireBand;
end;
end;
end;
end; {end - absMouse}
relMouse:
begin
if (theKeys[bandKey] and (not bandBorne)) then {fire rubber bands}
FireBand;
GetMouse(thePt);
forVel := (thePt.h - 256);
if (forVel > kMaxThrust) then
forVel := kMaxThrust
else if (forVel < -kMaxThrust) then
forVel := -kMaxThrust;
CenterMouse;
if (isRight) then
if (forVel < 0) then
begin
isForward := FALSE;
srcNum := 1;
if (theKeys[energyKey]) then
PushIt(-16);
if (button) then
begin
if (not buttonFires) then
PushIt(-16)
else if ((not bandBorne) and (buttonFires)) then
FireBand;
end;
end
else
begin
isForward := TRUE;
srcNum := 0;
if (theKeys[energyKey]) then
PushIt(16);
if (button) then
begin
if (not buttonFires) then
PushIt(16)
else if ((not bandBorne) and (buttonFires)) then
FireBand;
end;
end
else
begin
if (forVel < 0) then
begin
isForward := TRUE;
srcNum := 2;
if (theKeys[energyKey]) then
PushIt(-16);
if (button) then
begin
if (not buttonFires) then
PushIt(-16)
else if ((not bandBorne) and (buttonFires)) then
FireBand;
end;
end
else
begin
isForward := FALSE;
srcNum := 3;
if (theKeys[energyKey]) then
PushIt(16);
if (button) then
begin
if (not buttonFires) then
PushIt(16)
else if ((not bandBorne) and (buttonFires)) then
FireBand;
end;
end;
end;
end; {end - relMouse}
otherwise
end; {case}
end; {with theGlider}
end;
{=================================}
procedure MoveGlider;
begin
if (windowOpen) then {randomly move glider}
begin
liftAmount := liftAmount + Randomize(11) - 5;
shiftAmount := shiftAmount + Randomize(11) - 5;
end;
with theGlider do
begin
liftAmount := liftAmount + 1; {add gravity}
if (sliding) then
begin
liftAmount := 0; {zero out lift}
sliding := FALSE;
end
else
begin {vertical offset of glider}
destRect.top := destRect.top + liftAmount;
destRect.bottom := destRect.bottom + liftAmount;
touchRect.top := touchRect.top + liftAmount;
touchRect.bottom := touchRect.bottom + liftAmount;
end;
forVel := forVel + shiftAmount; {horizontal offset of glider}
destRect.left := destRect.left + forVel;
destRect.right := destRect.right + forVel;
touchRect.left := destRect.left + 10; {touch rect is inset from dest}
touchRect.right := destRect.right - 10;
shadoDest.left := destRect.left; {shadow has same l. & r. as dest}
shadoDest.right := destRect.right;
end;
end;
{=================================}
procedure MoveAnimates;
var
index: Integer;
tempRect: Rect;
{----------------}
function RectLap (rect1, rect2: Rect): Boolean;
var
dumRect: Rect;
begin
RectLap := FALSE;
if (rect1.right < rect2.left) then
Exit(RectLap);
if (rect2.right < rect2.left) then
Exit(RectLap);
if (rect1.bottom < rect2.top) then
Exit(RectLap);
if (rect2.bottom < rect2.top) then
Exit(RectLap);
RectLap := SectRect(rect1, rect2, dumRect);
end;
{----------------}
begin
for index := 1 to nAnimates do
with theAnimates[index] do
begin
if (unSeen) then
begin
if (TickCount > tickStamp) then
begin
ResetAnimate(-1, index);
unSeen := FALSE;
end;
end
else
begin
if (phase > -1) then
begin
IncInt(phase);
if (phase > 7) then
phase := 0;
end;
wholeRect := destRect;
with destRect do
begin
case kind of
0:
begin
left := left + horiOff;
right := right + horiOff;
top := top + vertOff;
bottom := bottom + vertOff;
wholeRect.left := wholeRect.left + horiOff;
wholeRect.bottom := wholeRect.bottom + vertOff;
end;
1:
begin
left := left + horiOff;
right := right + horiOff;
top := top + vertOff;
bottom := bottom + vertOff;
wholeRect.left := wholeRect.left + horiOff;
wholeRect.bottom := wholeRect.bottom + vertOff;
end;
2:
begin
top := top + vertOff;
bottom := bottom + vertOff;
if (vertOff > 0) then
wholeRect.bottom := wholeRect.bottom + vertOff
else
wholeRect.top := wholeRect.top + vertOff;
end;
otherwise
end; {case kind of}
end; {with destRect}
if (not unseen) then
if (not RectLap(wholeRect, wholeArea)) then
begin
tickStamp := TickCount + delay;
destRect := nullRect;
wholeRect := nullRect;
unSeen := TRUE;
end;
end; {if NOT (unSeen)}
end; {with / for}
end;
{=================================}
procedure MoveCycleObs;
var
index, diff: Integer;
begin
for index := 1 to nCycleObs do
with cycleObjects[index] do
case kindIs of
candle:
begin
IncLong(position);
if (position > 50) then
position := 48;
end;
grease:
begin
if (eventKind[tiedTo, 0] = ignoreIt) then
begin
DoTheSound(14);
eventKind[tiedTo, 0] := slideIt;
reset := 1;
end
else if ((reset <> 0) and (reset <> 999)) then
begin
reset := reset + 1;
if (reset > 4) then
begin
velocity := velocity + 1;
eventRect[tiedTo].right := eventRect[tiedTo].right + 1;
if (velocity > position) then
reset := 999;
end
else
begin
if (reset < 3) then
accel := 58
else
accel := 59;
end;
end;
end;
outlet:
begin
if (accel = 25) then
begin
if (TickCount > position) then
begin
accel := binaryFlip + 51; {go into zap mode}
position := TickCount;
eventKind[tiedTo, 1] := 1;
end;
end
else
begin
if (TickCount > (position + 60)) then
begin
accel := 25; {stop zapping}
position := TickCount + reset;
eventKind[tiedTo, 1] := 0;
end
else
begin
DoTheSound(24); {zapping}
accel := binaryFlip + 51;
end;
end;
end;
drip:
begin
if (phase < 57) then
begin
if (binaryFlip <> 0) then
begin
IncInt(phase);
if (phase = 57) then
position := position + 160;
end;
end
else
begin
velocity := velocity + accel;
position := position + velocity;
if (position > reset) then
begin
DoTheSound(7);
velocity := 0;
position := holdRect.bottom * 32;
if (inColor) then
begin
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, eventRect[tiedTo], eventRect[tiedTo], srcCopy, wholeRgn);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, eventRect[tiedTo], eventRect[tiedTo], srcCopy, wholeRgn);
end
else
begin
CopyBits(offVirginMap, offLoadMap, eventRect[tiedTo], eventRect[tiedTo], srcCopy, wholeRgn);
CopyBits(offVirginMap, mainWndo^.portBits, eventRect[tiedTo], eventRect[tiedTo], srcCopy, wholeRgn);
end;
eventRect[tiedTo] := holdRect;
phase := 53;
end;
wholeRect := eventRect[tiedTo];
with eventRect[tiedTo] do
begin
diff := LoWord(BSR(position, 5)) - bottom;
bottom := bottom + diff;
top := top + diff;
end;
wholeRect.bottom := wholeRect.bottom + diff
end; {else }
end; {drip}
toastr:
if (phase <> 0) then
begin
if (binaryFlip = 0) then
begin
phase := phase + 1;
if (phase > 65) then
phase := 60;
end;
velocity := velocity + accel;
position := position + velocity;
if (position > reset) then
begin
DoTheSound(22);
velocity := -velocity;
position := reset;
reset := TickCount + thisHouse.theRooms[roomAt].theObjects[tiedTo].extra;
phase := 0;
end;
wholeRect := eventRect[tiedTo];
with eventRect[tiedTo] do
begin
diff := LoWord(BSR(position, 5)) - bottom;
bottom := bottom + diff;
top := top + diff;
end;
if (diff > 0) then
wholeRect.bottom := wholeRect.bottom + diff
else
wholeRect.top := wholeRect.top + diff;
end
else
begin
if (TickCount > reset) then
begin
DoTheSound(23);
reset := position;
phase := 60;
end;
end; {toastr}
ball:
begin
velocity := velocity + accel;
position := position + velocity;
if (position > reset) then
begin
DoTheSound(4);
velocity := -velocity;
position := reset;
end;
wholeRect := eventRect[tiedTo];
with eventRect[tiedTo] do
begin
diff := LoWord(BSR(position, 5)) - bottom;
bottom := bottom + diff;
top := top + diff;
end;
if (diff > 0) then
wholeRect.bottom := wholeRect.bottom + diff
else
wholeRect.top := wholeRect.top + diff;
end; {ball}
fshBwl:
if (phase <> 0) then
begin
if ((velocity > -16) and (velocity < 16)) then
phase := 69
else
begin
if (velocity < 0) then
phase := 66
else
phase := 68;
end;
velocity := velocity + accel;
position := position + velocity;
if (position > reset) then
begin
DoTheSound(7);
velocity := -velocity;
position := reset;
reset := TickCount + thisHouse.theRooms[roomAt].theObjects[tiedTo].extra;
phase := 0;
end;
wholeRect := eventRect[tiedTo];
with eventRect[tiedTo] do
begin
diff := LoWord(BSR(position, 5)) - bottom;
bottom := bottom + diff;
top := top + diff;
end;
if (diff > 0) then
wholeRect.bottom := wholeRect.bottom + diff
else
wholeRect.top := wholeRect.top + diff;
end
else
begin
if (TickCount > reset) then
begin
DoTheSound(7);
reset := position;
phase := 66;
end;
end; {fish bowl}
teaKtl:
begin
if (TickCount > reset) then
begin
eventKind[tiedTo, 0] := steamIt;
if (phase = 0) then
DoTheSound(25);
phase := phase + 1;
if (phase > 10) then
begin
phase := 0;
eventKind[tiedTo, 0] := ignoreIt;
reset := TickCount + position;
end;
end;
end;
otherwise
end; {case / with / index}
end;
{=================================}
procedure MonitorStorm;
begin
with theLightning do
begin
if (whatPhase = 0) then
begin
if (TickCount > whatTime) then
whatPhase := 1;
end
else if (whatPhase > 3) then
begin
whatPhase := 0;
whichBolt := Randomize(3) + 1;
whatTime := TickCount + Randomize(300);
DoTheSound(17);
end
else
whatPhase := whatPhase + 1;
end;
end;
{=================================}
procedure DrawFlipScene;
var
index, tempInt: Integer;
tempRect, tempSmRect: Rect;
begin
if (mainScreenHidden) then
begin
if (hasWindow) then
if (theLightning.whatPhase <> 0) then
with theLightning do
begin
if (whatPhase = 4) then
begin
SetPort(mainWndo);
SetClip(windowRgn);
PenNormal;
FillRgn(windowRgn, black);
ClipRect(wholeArea);
SetPort(offLoadPort);
SetClip(windowRgn);
FillRgn(windowRgn, black);
ClipRect(wholeArea);
SetPort(offVirginPort);
end
else
begin
SetPort(mainWndo);
SetClip(windowRgn);
PenNormal;
PenSize(2, 2);
PenMode(patXOr);
MoveTo(theBolts[whichBolt, 0, 0], theBolts[whichBolt, 0, 1]);
for index := 1 to 7 do
begin
LineTo(theBolts[whichBolt, index, 0], theBolts[whichBolt, index, 1]);
Move(0, 2);
end;
ClipRect(wholeArea);
SetPort(offVirginPort);
end;
end;
{-----pop masks on-----}
if (hasMirror) then
with theGlider do
begin
tempSmRect := destRect;
tempSmRect.left := tempSmRect.left - 16;
tempSmRect.right := tempSmRect.right - 16;
tempSmRect.top := tempSmRect.top - 32;
tempSmRect.bottom := tempSmRect.bottom - 32;
SetPort(mainWndo);
SetClip(mirrorRgn);
CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, glideRct[srcNum], glideRct[srcNum], tempSmRect);
ClipRect(wholeArea);
SetPort(offVirginPort);
end;
if (nCycleObs > 0) then
for index := 1 to nCycleObs do
with cycleObjects[index] do
begin
case kindIs of
candle:
CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, srcRect[position], srcRect[position], wholeRect);
outlet:
CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, srcRect[accel], srcRect[accel], wholeRect);
grease:
begin
CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, srcRect[accel], srcRect[accel], wholeRect);
SetPort(offLoadPort);
PenNormal;
PenSize(2, 2);
MoveTo(velocity - 2, wholeRect.bottom - 2);
if (velocity > wholeRect.right + 1) then
Line(2, 0);
PenNormal;
SetPort(offVirginPort);
PenNormal;
PenSize(2, 2);
MoveTo(velocity - 2, wholeRect.bottom - 2);
if (velocity > wholeRect.right + 1) then
Line(2, 0);
PenNormal;
end;
ball:
CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, srcRect[kindIs], srcRect[kindIs], eventRect[tiedTo]);
drip:
CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, srcRect[phase], srcRect[phase], eventRect[tiedTo]);
toastr:
if (phase <> 0) then
begin
SetPort(mainWndo);
SetClip(toastRgn);
CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, srcRect[phase], srcRect[phase], eventRect[tiedTo]);
ClipRect(wholeArea);
SetPort(offVirginPort);
end;
fshBwl:
if (phase <> 0) then
CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, srcRect[phase], srcRect[phase], eventRect[tiedTo])
else
CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, srcRect[69], srcRect[69], eventRect[tiedTo]);
otherwise
end; {case}
end;
with theGlider do
begin
if (isRight) then
CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, shadoRct[0], shadoRct[0], shadoDest)
else
CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, shadoRct[1], shadoRct[1], shadoDest);
if (lifeNormal) then
CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, glideRct[srcNum], glideRct[srcNum], destRect)
else
case mode of
fadingIn, fadingOut:
begin
tempInt := nextPhase[mode, phase];
if (not isRight) then
tempInt := tempInt + 7;
CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, glideRct[srcNum], glideRct[tempInt], destRect);
end;
turnLf2Rt, turnRt2Lf:
begin
tempInt := nextPhase[mode, phase];
CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, glideRct[tempInt], glideRct[tempInt], destRect);
end;
burning, ascending, descending:
CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, glideRct[srcNum], glideRct[srcNum], destRect);
shredding:
begin
SetRect(tempRect, 256, 208 - (destRect.bottom - destRect.top), 304, 208);
CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, tempRect, tempRect, destRect);
end;
otherwise
end; {case}
end;
if (nAnimates > 0) then
for index := 1 to nAnimates do
with theAnimates[index] do
CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, animateRct[kind, phase], animateRct[kind, phase], destRect);
if (bandBorne) then
with theBand do
CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, bandRct[phase], bandRct[phase], dest);
with (floatPoints) do
if ((out) and (tickCount > tickStamp)) then
begin
out := FALSE;
CopyBits(offVirginMap, offLoadMap, whereR, whereR, srcCopy, wholeRgn);
CopyBits(offVirginMap, mainWndo^.portBits, whereR, whereR, srcCopy, wholeRgn);
end;
{-----flip to 'other' page-----}
mainScreenHidden := not mainScreenHidden;
SetPage(mainScreenHidden);
{-----restore 'other' page-----}
if (hasMirror) then
with theGlider do
begin
tempSmRect := oldRect;
tempSmRect.left := tempSmRect.left - 16;
tempSmRect.right := tempSmRect.right - 16;
tempSmRect.top := tempSmRect.top - 32;
tempSmRect.bottom := tempSmRect.bottom - 32;
CopyBits(offVirginMap, offLoadMap, tempSmRect, tempSmRect, srcCopy, wholeRgn);
end;
with theGlider do
begin
CopyBits(offVirginMap, offLoadMap, oldRect, oldRect, srcCopy, wholeRgn);
CopyBits(offVirginMap, offLoadMap, oldShado, oldShado, srcCopy, wholeRgn);
oldRect := destRect;
oldShado := shadoDest;
end;
if (nAnimates > 0) then
for index := 1 to nAnimates do
with theAnimates[index] do
begin
CopyBits(offVirginMap, offLoadMap, oldRect, oldRect, srcCopy, nil);
oldRect := destRect;
end;
if (nCycleObs > 0) then
for index := 1 to nCycleObs do
with cycleObjects[index] do
begin
CopyBits(offVirginMap, offLoadMap, oldRect, oldRect, srcCopy, nil);
oldRect := wholeRect;
end;
if (bandBorne) then
with theBand do
begin
CopyBits(offVirginMap, offLoadMap, old, old, srcCopy, nil);
old := dest;
end;
end
else {main screen is NOT hidden (is visible)}
begin
if (hasWindow) then
if (theLightning.whatPhase <> 0) then
with theLightning do
begin
if (whatPhase = 4) then
begin
SetPort(mainWndo);
SetClip(windowRgn);
PenNormal;
FillRgn(windowRgn, black);
ClipRect(wholeArea);
SetPort(offLoadPort);
SetClip(windowRgn);
FillRgn(windowRgn, black);
ClipRect(wholeArea);
SetPort(offVirginPort);
end
else
begin
SetPort(offLoadPort);
SetClip(windowRgn);
PenNormal;
PenSize(2, 2);
PenMode(patXOr);
MoveTo(theBolts[whichBolt, 0, 0], theBolts[whichBolt, 0, 1]);
for index := 1 to 7 do
begin
LineTo(theBolts[whichBolt, index, 0], theBolts[whichBolt, index, 1]);
Move(0, 2);
end;
ClipRect(wholeArea);
SetPort(offVirginPort);
end;
end;
{-----pop masks on-----}
if (hasMirror) then
with theGlider do
begin
tempSmRect := destRect;
tempSmRect.left := tempSmRect.left - 16;
tempSmRect.right := tempSmRect.right - 16;
tempSmRect.top := tempSmRect.top - 32;
tempSmRect.bottom := tempSmRect.bottom - 32;
SetPort(offLoadPort);
SetClip(mirrorRgn);
CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[srcNum], glideRct[srcNum], tempSmRect);
ClipRect(wholeArea);
SetPort(offVirginPort);
end;
if (nCycleObs > 0) then
for index := 1 to nCycleObs do
with cycleObjects[index] do
begin
case kindIs of
candle:
CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[position], srcRect[position], wholeRect);
outlet:
CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[accel], srcRect[accel], wholeRect);
grease:
begin
CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[accel], srcRect[accel], wholeRect);
SetPort(mainWndo);
PenNormal;
PenSize(2, 2);
MoveTo(velocity - 2, wholeRect.bottom - 2);
if (velocity > wholeRect.right + 1) then
Line(2, 0);
PenNormal;
SetPort(offVirginPort);
PenNormal;
PenSize(2, 2);
MoveTo(velocity - 2, wholeRect.bottom - 2);
if (velocity > wholeRect.right + 1) then
Line(2, 0);
PenNormal;
end;
ball:
CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[kindIs], srcRect[kindIs], eventRect[tiedTo]);
drip:
CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[phase], srcRect[phase], eventRect[tiedTo]);
toastr:
if (phase <> 0) then
begin
SetPort(offLoadPort);
SetClip(toastRgn);
CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[phase], srcRect[phase], eventRect[tiedTo]);
ClipRect(wholeArea);
SetPort(offVirginPort);
end;
fshBwl:
if (phase <> 0) then
CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[phase], srcRect[phase], eventRect[tiedTo])
else
CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[69], srcRect[69], eventRect[tiedTo]);
otherwise
end; {case}
end;
with theGlider do
begin
if (isRight) then
CopyMask(offPlayerMap, offMaskMap, offLoadMap, shadoRct[0], shadoRct[0], shadoDest)
else
CopyMask(offPlayerMap, offMaskMap, offLoadMap, shadoRct[1], shadoRct[1], shadoDest);
if (lifeNormal) then
CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[srcNum], glideRct[srcNum], destRect)
else
case mode of
fadingIn, fadingOut:
begin
tempInt := nextPhase[mode, phase];
if (not isRight) then
tempInt := tempInt + 7;
CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[srcNum], glideRct[tempInt], destRect);
end;
turnLf2Rt, turnRt2Lf:
begin
tempInt := nextPhase[mode, phase];
CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[tempInt], glideRct[tempInt], destRect);
end;
burning, ascending, descending:
CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[srcNum], glideRct[srcNum], destRect);
shredding:
begin
SetRect(tempRect, 256, 208 - (destRect.bottom - destRect.top), 304, 208);
CopyMask(offPlayerMap, offMaskMap, offLoadMap, tempRect, tempRect, destRect);
end;
otherwise
end; {case}
end;
if (nAnimates > 0) then
for index := 1 to nAnimates do
with theAnimates[index] do
CopyMask(offPlayerMap, offMaskMap, offLoadMap, animateRct[kind, phase], animateRct[kind, phase], destRect);
if (bandBorne) then
with theBand do
CopyMask(offPlayerMap, offMaskMap, offLoadMap, bandRct[phase], bandRct[phase], dest);
with (floatPoints) do
if ((out) and (tickCount > tickStamp)) then
begin
out := FALSE;
CopyBits(offVirginMap, offLoadMap, whereR, whereR, srcCopy, wholeRgn);
CopyBits(offVirginMap, mainWndo^.portBits, whereR, whereR, srcCopy, wholeRgn);
end;
{-----flip to 'other' page-----}
mainScreenHidden := not mainScreenHidden;
SetPage(mainScreenHidden);
{-----restore 'other' page-----}
if (hasMirror) then
with theGlider do
begin
tempSmRect := oldRect;
tempSmRect.left := tempSmRect.left - 16;
tempSmRect.right := tempSmRect.right - 16;
tempSmRect.top := tempSmRect.top - 32;
tempSmRect.bottom := tempSmRect.bottom - 32;
CopyBits(offVirginMap, mainWndo^.portBits, tempSmRect, tempSmRect, srcCopy, wholeRgn);
end;
with theGlider do
begin
CopyBits(offVirginMap, mainWndo^.portBits, oldRect, oldRect, srcCopy, wholeRgn);
CopyBits(offVirginMap, mainWndo^.portBits, oldShado, oldShado, srcCopy, wholeRgn);
oldRect := destRect;
oldShado := shadoDest;
end;
if (nAnimates > 0) then
for index := 1 to nAnimates do
with theAnimates[index] do
begin
CopyBits(offVirginMap, mainWndo^.portBits, oldRect, oldRect, srcCopy, nil);
oldRect := destRect;
end;
if (nCycleObs > 0) then
for index := 1 to nCycleObs do
with cycleObjects[index] do
begin
CopyBits(offVirginMap, mainWndo^.portBits, oldRect, oldRect, srcCopy, nil);
oldRect := wholeRect;
end;
if (bandBorne) then
with theBand do
begin
CopyBits(offVirginMap, mainWndo^.portBits, old, old, srcCopy, nil);
old := dest;
end;
end;
end;
{=================================}
procedure DrawScene;
var
index, tempInt: Integer;
tempRect, tempSmRect: Rect;
begin
if (hasWindow) then
if (theLightning.whatPhase <> 0) then
with theLightning do
begin
SetPort(mainWndo);
SetClip(windowRgn);
PenNormal;
if (whatPhase = 4) then
FillRgn(windowRgn, black)
else
begin
PenSize(2, 2);
PenMode(patXOr);
MoveTo(theBolts[whichBolt, 0, 0], theBolts[whichBolt, 0, 1]);
for index := 1 to 7 do
begin
LineTo(theBolts[whichBolt, index, 0], theBolts[whichBolt, index, 1]);
Move(0, 2);
end;
end;
ClipRect(wholeArea);
SetPort(offVirginPort);
end;
if (hasMirror) then
begin
tempRect := theGlider.oldRect;
tempRect.left := tempRect.left - 16;
tempRect.right := tempRect.right - 16;
tempRect.top := tempRect.top - 32;
tempRect.bottom := tempRect.bottom - 32;
CopyBits(offVirginMap, offLoadMap, tempRect, tempRect, srcCopy, mirrorRgn);
end;
with theGlider do
begin
UnionRect(destRect, oldRect, wholeRect);
UnionRect(shadoDest, oldShado, wholeShado);
CopyBits(offVirginMap, offLoadMap, oldRect, oldRect, srcCopy, wholeRgn);
CopyBits(offVirginMap, offLoadMap, oldShado, oldShado, srcCopy, wholeRgn);
oldRect := destRect;
oldShado := shadoDest;
end;
if (nAnimates > 0) then
for index := 1 to nAnimates do
with theAnimates[index] do
CopyBits(offVirginMap, offLoadMap, oldRect, oldRect, srcCopy, nil);
if (nCycleObs > 0) then
for index := 1 to nCycleObs do
with cycleObjects[index] do
CopyBits(offVirginMap, offLoadMap, oldRect, oldRect, srcCopy, nil);
if (bandBorne) then
with theBand do
CopyBits(offVirginMap, offLoadMap, old, old, srcCopy, nil);
{-----pop masks on-----}
if (hasMirror) then
with theGlider do
begin
tempSmRect := destRect;
tempSmRect.left := tempSmRect.left - 16;
tempSmRect.right := tempSmRect.right - 16;
tempSmRect.top := tempSmRect.top - 32;
tempSmRect.bottom := tempSmRect.bottom - 32;
SetPort(offLoadPort);
SetClip(mirrorRgn);
CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[srcNum], glideRct[srcNum], tempSmRect);
ClipRect(wholeArea);
SetPort(offVirginPort);
UnionRect(tempRect, tempSmRect, tempRect);
end;
if (nCycleObs > 0) then
for index := 1 to nCycleObs do
with cycleObjects[index] do
begin
case kindIs of
candle:
CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[position], srcRect[position], wholeRect);
outlet, grease:
CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[accel], srcRect[accel], wholeRect);
ball:
CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[kindIs], srcRect[kindIs], eventRect[tiedTo]);
drip:
CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[phase], srcRect[phase], eventRect[tiedTo]);
toastr:
if (phase <> 0) then
begin
SetPort(offLoadPort);
SetClip(toastRgn);
CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[phase], srcRect[phase], eventRect[tiedTo]);
ClipRect(wholeArea);
SetPort(offVirginPort);
end;
fshBwl:
if (phase <> 0) then
CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[phase], srcRect[phase], eventRect[tiedTo])
else
CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[69], srcRect[69], eventRect[tiedTo]);
otherwise
end; {case}
oldRect := wholeRect;
end;
with theGlider do
begin
if (isRight) then
CopyMask(offPlayerMap, offMaskMap, offLoadMap, shadoRct[0], shadoRct[0], shadoDest)
else
CopyMask(offPlayerMap, offMaskMap, offLoadMap, shadoRct[1], shadoRct[1], shadoDest);
if (lifeNormal) then
CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[srcNum], glideRct[srcNum], destRect)
else
case mode of
fadingIn, fadingOut:
begin
tempInt := nextPhase[mode, phase];
if (not isRight) then
tempInt := tempInt + 7;
CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[srcNum], glideRct[tempInt], destRect);
end;
turnLf2Rt, turnRt2Lf:
begin
tempInt := nextPhase[mode, phase];
CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[tempInt], glideRct[tempInt], destRect);
end;
burning, ascending, descending:
CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[srcNum], glideRct[srcNum], destRect);
shredding:
begin
SetRect(tempRect, 256, 208 - (destRect.bottom - destRect.top), 304, 208);
CopyMask(offPlayerMap, offMaskMap, offLoadMap, tempRect, tempRect, destRect);
end;
otherwise
end; {case}
end;
if (nAnimates > 0) then
for index := 1 to nAnimates do
with theAnimates[index] do
begin
CopyMask(offPlayerMap, offMaskMap, offLoadMap, animateRct[kind, phase], animateRct[kind, phase], destRect);
oldRect := wholeRect;
end;
if (bandBorne) then
with theBand do
begin
CopyMask(offPlayerMap, offMaskMap, offLoadMap, bandRct[phase], bandRct[phase], dest);
old := dest;
end;
{-----pop to visible screen-----}
with (floatPoints) do
if ((out) and (tickCount > tickStamp)) then
begin
out := FALSE;
CopyBits(offVirginMap, mainWndo^.portBits, whereR, whereR, srcCopy, wholeRgn);
end;
if (hasMirror) then
CopyBits(offLoadMap, mainWndo^.portBits, tempRect, tempRect, srcCopy, mirrorRgn);
if (nCycleObs > 0) then
for index := 1 to nCycleObs do
with cycleObjects[index] do
begin
if (kindIs <> grease) then
CopyBits(offLoadMap, mainWndo^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn)
else
begin
CopyBits(offLoadMap, mainWndo^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn);
SetPort(mainWndo);
PenNormal;
PenSize(2, 2);
MoveTo(wholeRect.right, wholeRect.bottom - 2);
if (velocity > wholeRect.right + 1) then
LineTo(velocity, wholeRect.bottom - 2);
PenNormal;
SetPort(offVirginPort);
PenNormal;
PenSize(2, 2);
MoveTo(wholeRect.right, wholeRect.bottom - 2);
if (velocity > wholeRect.right + 1) then
LineTo(velocity, wholeRect.bottom - 2);
PenNormal;
end;
end;
with theGlider do
begin
CopyBits(offLoadMap, mainWndo^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn);
CopyBits(offLoadMap, mainWndo^.portBits, wholeShado, wholeShado, srcCopy, wholeRgn);
end;
if (nAnimates > 0) then
for index := 1 to nAnimates do
with theAnimates[index] do
CopyBits(offLoadMap, mainWndo^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn);
if (bandBorne) then
with theBand do
CopyBits(offLoadMap, mainWndo^.portBits, whole, whole, srcCopy, wholeRgn);
end;
{=================================}
procedure DrawCScene;
var
index, tempInt: Integer;
tempRect, tempSmRect: Rect;
begin
if ((hasWindow) and (theLightning.whatPhase <> 0)) then
with theLightning do
begin
SetPort(GrafPtr(mainWndo));
SetClip(windowRgn);
PenNormal;
if (whatPhase = 4) then
FillRgn(windowRgn, black)
else
begin
PenMode(srcXOr);
PenSize(2, 2);
MoveTo(theBolts[whichBolt, 0, 0], theBolts[whichBolt, 0, 1]);
for index := 1 to 7 do
begin
LineTo(theBolts[whichBolt, index, 0], theBolts[whichBolt, index, 1]);
Move(0, 2);
end;
end;
ClipRect(wholeArea);
SetPort(GrafPtr(virginCPtr));
end;
if (hasMirror) then
begin
with theGlider do
UnionRect(destRect, oldRect, tempRect);
tempRect.left := tempRect.left - 32;
tempRect.right := tempRect.right - 32;
tempRect.top := tempRect.top - 32;
tempRect.bottom := tempRect.bottom - 32;
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, tempRect, tempRect, srcCopy, mirrorRgn);
end;
with theGlider do
begin
UnionRect(destRect, oldRect, wholeRect);
UnionRect(shadoDest, oldShado, wholeShado);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, oldRect, oldRect, srcCopy, wholeRgn);
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, oldShado, oldShado, srcCopy, wholeRgn);
oldRect := destRect;
oldShado := shadoDest;
end;
if (nAnimates > 0) then
for index := 1 to nAnimates do
with theAnimates[index] do
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, oldRect, oldRect, srcCopy, wholeRgn);
if (nCycleObs > 0) then
for index := 1 to nCycleObs do
with cycleObjects[index] do
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, oldRect, oldRect, srcCopy, wholeRgn);
if (bandBorne) then
with theBand do
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, old, old, srcCopy, wholeRgn);
{-----pop masks on-----}
if (hasMirror) then
with theGlider do
begin
tempSmRect := destRect;
tempSmRect.left := tempSmRect.left - 32;
tempSmRect.right := tempSmRect.right - 32;
tempSmRect.top := tempSmRect.top - 32;
tempSmRect.bottom := tempSmRect.bottom - 32;
SetPort(GrafPtr(loadCPtr));
SetClip(mirrorRgn);
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, glideRct[srcNum], glideRct[srcNum], tempSmRect);
ClipRect(wholeArea);
SetPort(GrafPtr(virginCPtr));
end;
if (nCycleObs > 0) then
for index := 1 to nCycleObs do
with cycleObjects[index] do
begin
case kindIs of
candle:
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[position], srcRect[position], wholeRect);
outlet, grease:
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[accel], srcRect[accel], wholeRect);
ball:
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[kindIs], srcRect[kindIs], eventRect[tiedTo]);
drip:
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[phase], srcRect[phase], eventRect[tiedTo]);
toastr:
if (phase <> 0) then
begin
SetPort(GrafPtr(loadCPtr));
SetClip(toastRgn);
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[phase], srcRect[phase], eventRect[tiedTo]);
ClipRect(wholeArea);
SetPort(GrafPtr(virginCPtr));
end;
fshBwl:
begin
if (phase <> 0) then
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[phase], srcRect[phase], eventRect[tiedTo])
else
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[69], srcRect[69], eventRect[tiedTo]);
end;
otherwise
;
end; {case}
oldRect := wholeRect;
end;
with theGlider do
begin
if (isRight) then
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, shadoRct[0], shadoRct[0], shadoDest)
else
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, shadoRct[1], shadoRct[1], shadoDest);
if (lifeNormal) then
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, glideRct[srcNum], glideRct[srcNum], destRect)
else
case mode of
fadingIn, fadingOut:
begin
tempInt := nextPhase[mode, phase];
if (not isRight) then
tempInt := tempInt + 7;
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, glideRct[srcNum], glideRct[tempInt], destRect);
end;
turnLf2Rt, turnRt2Lf:
begin
tempInt := nextPhase[mode, phase];
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, glideRct[tempInt], glideRct[tempInt], destRect);
end;
burning, ascending, descending:
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, glideRct[srcNum], glideRct[srcNum], destRect);
shredding:
begin
SetRect(tempRect, 256, 208 - (destRect.bottom - destRect.top), 304, 208);
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, tempRect, tempRect, destRect);
end;
otherwise
end; {case}
end;
if (nAnimates > 0) then
for index := 1 to nAnimates do
with theAnimates[index] do
begin
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, animateRct[kind, phase], animateRct[kind, phase], destRect);
oldRect := wholeRect;
end;
if (bandBorne) then
with theBand do
begin
CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, bandRct[phase], bandRct[phase], dest);
old := dest;
end;
{-----pop to visible screen-----}
with (floatPoints) do
if (out) then
begin
if (tickCount > tickStamp) then
begin
out := FALSE;
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, whereR, whereR, srcCopy, wholeRgn);
end
else
begin
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, whereR, whereR, srcCopy, wholeRgn);
SetPort(GrafPtr(mainWndo));
PenNormal;
whereR.right := whereR.right + 2;
whereR.left := whereR.left + 2;
whereR.top := whereR.top - 1;
whereR.bottom := whereR.bottom - 1;
TextFont(16);
TextSize(12);
MoveTo(whereR.left, whereR.bottom - 2);
if (binaryFlip = 0) then
RGBForeColor(rgbBlue)
else
RGBForeColor(rgbRed);
PenMode(srcOr);
DrawString(saysWhat);
PenNormal;
RGBForeColor(rgbBlack);
SetPort(GrafPtr(virginCPtr))
end;
end;
if (hasMirror) then
CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, tempRect, tempRect, srcCopy, mirrorRgn);
if (nCycleObs > 0) then
for index := 1 to nCycleObs do
with cycleObjects[index] do
begin
if (kindIs <> grease) then
CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn)
else
begin
CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn);
SetPort(GrafPtr(mainWndo));
PenNormal;
PenSize(2, 2);
MoveTo(wholeRect.right, wholeRect.bottom - 2);
if (velocity > wholeRect.right + 1) then
LineTo(velocity, wholeRect.bottom - 2);
PenNormal;
SetPort(GrafPtr(virginCPtr));
PenNormal;
PenSize(2, 2);
MoveTo(wholeRect.right, wholeRect.bottom - 2);
if (velocity > wholeRect.right + 1) then
LineTo(velocity, wholeRect.bottom - 2);
PenNormal;
end;
end;
with theGlider do
begin
CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn);
CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeShado, wholeShado, srcCopy, wholeRgn);
end;
if (nAnimates > 0) then
for index := 1 to nAnimates do
with theAnimates[index] do
CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn);
if (bandBorne) then
with theBand do
CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, whole, whole, srcCopy, wholeRgn);
end;
{=================================}
procedure DoSpecial;
begin
GetKeys(theKeys);
with theGlider do
case mode of
fadingIn:
begin
if (phase = 1) then
DoTheSound(2);
IncInt(phase);
if (phase > 16) then
begin
if (isRight) then
srcNum := 0
else
srcNum := 2;
lifeNormal := TRUE;
phase := 0;
mode := normal;
end
end;
fadingOut:
begin
IncInt(phase);
if (isRight) then
srcNum := 0
else
srcNum := 2;
if (phase > 16) then
OffAMortal;
end;
turnRt2Lf:
begin
IncInt(phase);
if (phase > 11) then
begin
lifeNormal := TRUE;
phase := 0;
mode := normal;
shiftAmount := 0;
isRight := FALSE;
end;
SearchRects;
destRect.left := destRect.left + shiftAmount;
destRect.right := destRect.right + shiftAmount;
touchRect.left := touchRect.left + shiftAmount;
touchRect.right := touchRect.right + shiftAmount;
shadoDest.left := shadoDest.left + shiftAmount;
shadoDest.right := shadoDest.right + shiftAmount;
end;
turnLf2Rt:
begin
IncInt(phase);
if (phase > 11) then
begin
lifeNormal := TRUE;
phase := 0;
mode := normal;
shiftAmount := 0;
isRight := TRUE;
end;
SearchRects;
destRect.left := destRect.left + shiftAmount;
destRect.right := destRect.right + shiftAmount;
touchRect.left := touchRect.left + shiftAmount;
touchRect.right := touchRect.right + shiftAmount;
shadoDest.left := shadoDest.left + shiftAmount;
shadoDest.right := shadoDest.right + shiftAmount;
end;
burning:
begin
phase := 1 - phase;
if (isRight) then
begin
srcNum := 24 + phase;
forVel := 1;
end
else
begin
srcNum := 26 + phase;
forVel := -1;
end;
SearchRects;
MoveGlider;
if (TickCount > timeStamp) then
begin
DoTheSound(1);
mode := fadingOut;
phase := 0;
destRect.top := destRect.bottom - 20;
if (isForward) then
srcNum := 0
else
srcNum := 2;
end;
end;
ascending:
begin
destRect.left := destRect.left - 2;
destRect.right := destRect.left + 48;
destRect.top := destRect.top - 6;
destRect.bottom := destRect.top + 20;
shadoDest.left := destRect.left;
shadoDest.right := destRect.right;
touchRect := destRect;
InsetRect(touchRect, 10, 5);
if (destRect.top < 220) then
begin
lifeNormal := TRUE;
phase := 0;
mode := normal;
end;
end;
descending:
begin
destRect.left := destRect.left + 2;
destRect.right := destRect.left + 48;
destRect.top := destRect.top + 6;
destRect.bottom := destRect.top + 20;
shadoDest.left := destRect.left;
shadoDest.right := destRect.right;
touchRect := destRect;
InsetRect(touchRect, 10, 5);
if (destRect.top > 120) then
begin
lifeNormal := TRUE;
phase := 0;
mode := normal;
end;
end;
shredding:
begin
if (phase = 0) then
begin
DoTheSound(20);
destRect.bottom := destRect.bottom + 1;
if (destRect.bottom >= destRect.top + 36) then
phase := 1;
end
else
begin
destRect.top := destRect.top + 8;
destRect.bottom := destRect.bottom + 8;
if (destRect.top > 342) then
begin
phase := 0;
OffAMortal;
end;
end;
end; {end - shred}
otherwise
end;
end;
{=================================}
procedure LetsPause;
begin
if (smsIsActive) then
SMSExit;
smsIsActive := FALSE;
demoMode := Randomize(lastDemo) + 1;
pausing := TRUE;
ForceMainToVisible;
InitCursor;
ShowMenuBar;
SetItem(GetMenu(mGame), iBegin, 'Continue Game<6D>');
DrawMenuBar;
FlushEvents(everyEvent, 0);
theErr := PostEvent(KeyDown, 65);
end;
{=================================}
procedure LetsQuit;
begin
ForceMainToVisible;
ShowMenuBar;
{$IFC DemoVersion}
playing := FALSE;
pausing := FALSE;
doneFlag := TRUE;
{$ELSEC}
if DoQuit then
begin
playing := FALSE;
pausing := FALSE;
doneFlag := TRUE;
end
else
begin
if (SaveGame) then
begin
playing := FALSE;
pausing := FALSE;
doneFlag := TRUE;
end
else
begin
SetCursor(noCursor^^);
SetPort(GrafPtr(mainWndo));
BeginUpdate(GrafPtr(mainWndo));
if (inColor) then
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeArea, wholeArea, srcCopy, nil)
else
CopyBits(offVirginMap, mainWndo^.portBits, wholeArea, wholeArea, srcCopy, nil);
EndUpdate(GrafPtr(mainWndo));
if (inColor) then
SetPort(GrafPtr(virginCPtr))
else
SetPort(offVirginPort);
end;
end;
{$ENDC}
end;
{=================================}
procedure LetsSave;
begin
{$IFC not DemoVersion}
InitCursor;
SpinBall;
ForceMainToVisible;
if (not SaveGame) then
;
SpinBall;
SetCursor(noCursor^^);
SetPort(GrafPtr(mainWndo));
BeginUpdate(GrafPtr(mainWndo));
if (inColor) then
CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeArea, wholeArea, srcCopy, nil)
else
CopyBits(offVirginMap, mainWndo^.portBits, wholeArea, wholeArea, srcCopy, nil);
EndUpdate(GrafPtr(mainWndo));
if (inColor) then
SetPort(GrafPtr(virginCPtr))
else
SetPort(offVirginPort);
{$ENDC}
end;
{=================================}
procedure LetsEnd;
begin
SetItem(GetMenu(mGame), iBegin, 'Begin Game<6D>');
WrapItUp;
DrawMenuBar;
end;
{=================================}
procedure Coordinate;
var
i: Integer;
begin
GetKeys(theKeys);
while ((playing) and (not pausing)) do
begin
timeIs := TickCount;
liftAmount := 2;
binaryFlip := BitXOr(binaryFlip, 1);
if (bandBorne) then
HandleBand;
if (lifeNormal) then
begin
SearchRects;
GetKeys(theKeys);
GetInput;
MoveGlider;
end
else
DoSpecial;
if (playing) then
begin
if (nAnimates > 0) then
MoveAnimates;
if (nCycleObs > 0) then
MoveCycleObs;
if (hasWindow) then
MonitorStorm;
if (areFlipping) then
DrawFlipScene
else
begin
if (inColor) then
DrawCScene
else
DrawScene;
end;
if (scoreIsRolling) then
BumpTheScore;
end;
if (theKeys[kCommandKeyMap]) and (theKeys[kQKeyMap]) then
LetsQuit;
if (theKeys[kCommandKeyMap]) and (theKeys[kSKeyMap]) then
LetsSave;
if (theKeys[kCommandKeyMap]) and (theKeys[kEKeyMap]) then
LetsEnd;
if (theKeys[kTabKeyMap]) then
LetsPause;
SetCursor(noCursor^^);
repeat
until (TickCount >= (timeIs + 2));
loopsThruRoom := loopsThruRoom + 1;
bassLoop := bassLoop + 1;
if (bassLoop >= playBassTime) then
begin
bassLoop := 0;
DoTheBass(kDuhDumSound);
playBassTime := (kBonusTimeToBeat - loopsThruRoom) div kBassFract + kMinBassLoop;
if (playBassTime < kMinBassLoop) then
playBassTime := kMinBassLoop;
end;
end;
FlushEvents(everyEvent, 0);
InitCursor;
DrawMenuBar;
if (scoreList.rank <> 20) then
DrawHiScores;
end;
{=================================}
end.