1 line
30 KiB
C
Executable File
1 line
30 KiB
C
Executable File
/*============================================================*/
|
|
/*============================================================*/
|
|
/*== ==*/
|
|
/*== QuickDraw Rendering Routines ==*/
|
|
/*== ==*/
|
|
/*============================================================*/
|
|
/*============================================================*/
|
|
|
|
|
|
/*======================================================== Includes */
|
|
|
|
#include "Globals.h"
|
|
#include "UnivUtilities.h"
|
|
#include "RenderQD.h"
|
|
#include "Render.h"
|
|
#include "PlayUtils.h"
|
|
|
|
|
|
/*======================================================== Functions */
|
|
/*======================================================== RenderSceneQD1 */
|
|
|
|
void RenderSceneQD1 (void)
|
|
|
|
{
|
|
Rect wholeBall, wholePlayer, wholeOpponent, wholeCursor;
|
|
|
|
/* find union of old & new position rects */
|
|
UnionRect(&thePlayer.isRect, &thePlayer.wasRect, &wholePlayer);
|
|
UnionRect(&theOpponent.isRect, &theOpponent.wasRect, &wholeOpponent);
|
|
UnionRect(&theBall.isRect, &theBall.wasRect, &wholeBall);
|
|
UnionRect(&boardCursor.isRect, &boardCursor.wasRect, &wholeCursor);
|
|
|
|
/* dick with the door */
|
|
if (theDoor.stateChanged)
|
|
{
|
|
CopyBits(&offPartsBits, &offWorkBits,
|
|
&theDoor.srcRects[theDoor.doorOpen][theDoor.doorState],
|
|
&theDoor.destRects[theDoor.doorOpen], srcCopy, kNilPointer);
|
|
CopyBits(&offWorkBits, &offBackBits,
|
|
&theDoor.destRects[theDoor.doorOpen],
|
|
&theDoor.destRects[theDoor.doorOpen], srcCopy, kNilPointer);
|
|
}
|
|
|
|
if ((showBoardCursor) && (!disableBoardCursor) && (drawThisFrame))
|
|
{
|
|
CopyMask(&offPartsBits, &offMaskMap, &offWorkBits, &boardCursor.srcRect,
|
|
&boardCursor.srcRect, &boardCursor.isRect);
|
|
}
|
|
|
|
if ((theBall.mode == kBallRolling) && (!theBall.dontDraw) && (drawThisFrame))
|
|
CopyMask(&offPartsBits, &offMaskMap, &offWorkBits, &theBall.srcRect,
|
|
&theBall.srcRect, &theBall.isRect);
|
|
|
|
/* mask the bastards to the work map - back to front! */
|
|
if (playerInBack)
|
|
{
|
|
if ((thePlayer.mode != kInStasis) && (drawThisFrame))
|
|
CopyMask(&offPartsBits, &offMaskMap, &offWorkBits, &thePlayer.srcRect,
|
|
&thePlayer.maskRect, &thePlayer.isRect);
|
|
if ((theOpponent.mode != kInStasis) && (drawThisFrame))
|
|
CopyMask(&offPartsBits, &offMaskMap, &offWorkBits, &theOpponent.srcRect,
|
|
&theOpponent.maskRect, &theOpponent.isRect);
|
|
}
|
|
else
|
|
{
|
|
if ((theOpponent.mode != kInStasis) && (drawThisFrame))
|
|
CopyMask(&offPartsBits, &offMaskMap,
|
|
&offWorkBits, &theOpponent.srcRect,
|
|
&theOpponent.maskRect, &theOpponent.isRect);
|
|
if ((thePlayer.mode != kInStasis) && (drawThisFrame))
|
|
CopyMask(&offPartsBits, &offMaskMap,
|
|
&offWorkBits, &thePlayer.srcRect,
|
|
&thePlayer.maskRect, &thePlayer.isRect);
|
|
}
|
|
|
|
/* blast them to the screen */
|
|
if ((thePlayer.mode != kInStasis) && (drawThisFrame))
|
|
{
|
|
CopyBits(&offWorkBits, &(mainWndo->portBits), &wholePlayer,
|
|
&wholePlayer, srcCopy, kNilPointer);
|
|
}
|
|
if ((theOpponent.mode != kInStasis) && (drawThisFrame))
|
|
{
|
|
CopyBits(&offWorkBits, &(mainWndo->portBits),
|
|
&wholeOpponent, &wholeOpponent, srcCopy, kNilPointer);
|
|
}
|
|
if ((theBall.mode == kBallRolling) && (drawThisFrame))
|
|
{
|
|
CopyBits(&offWorkBits, &(mainWndo->portBits), &wholeBall,
|
|
&wholeBall, srcCopy, kNilPointer);
|
|
}
|
|
else if (theBall.eraseTheBall)
|
|
{
|
|
CopyBits(&offWorkBits, &(mainWndo->portBits), &theBall.eraser,
|
|
&theBall.eraser, srcCopy, kNilPointer);
|
|
|
|
theBall.eraseTheBall = FALSE;
|
|
}
|
|
|
|
if ((showBoardCursor) && (!disableBoardCursor) && (drawThisFrame))
|
|
{
|
|
CopyBits(&offWorkBits, &(mainWndo->portBits), &wholeCursor, &wholeCursor,
|
|
srcCopy, kNilPointer);
|
|
}
|
|
|
|
/* and re-dick with the door */
|
|
if (theDoor.stateChanged)
|
|
{
|
|
CopyBits(&offWorkBits, &(mainWndo->portBits),
|
|
&theDoor.destRects[theDoor.doorOpen],
|
|
&theDoor.destRects[theDoor.doorOpen], srcCopy, kNilPointer);
|
|
CopyBits(&offPartsBits, &offBackBits,
|
|
&theDoor.srcRects[theDoor.doorOpen][theDoor.doorState],
|
|
&theDoor.destRects[theDoor.doorOpen], srcCopy, kNilPointer);
|
|
CopyBits(&offWorkBits, &offBackBits,
|
|
&theDoor.destRects[theDoor.doorOpen],
|
|
&theDoor.destRects[theDoor.doorOpen], srcCopy, kNilPointer);
|
|
}
|
|
|
|
/* plug up the holes on the work map */
|
|
if ((thePlayer.mode != kInStasis) && (drawThisFrame))
|
|
CopyBits(&offBackBits, &offWorkBits, &thePlayer.isRect,
|
|
&thePlayer.isRect, srcCopy, kNilPointer);
|
|
if ((theOpponent.mode != kInStasis) && (drawThisFrame))
|
|
CopyBits(&offBackBits, &offWorkBits,
|
|
&theOpponent.isRect, &theOpponent.isRect, srcCopy, kNilPointer);
|
|
if ((theBall.mode == kBallRolling) && (drawThisFrame))
|
|
CopyBits(&offBackBits, &offWorkBits, &theBall.isRect,
|
|
&theBall.isRect, srcCopy, kNilPointer);
|
|
if ((showBoardCursor) && (!disableBoardCursor) && (drawThisFrame))
|
|
CopyBits(&offBackBits, &offWorkBits, &boardCursor.isRect, &boardCursor.isRect,
|
|
srcCopy, kNilPointer);
|
|
}
|
|
|
|
|
|
/*======================================================== RenderSceneQDC */
|
|
|
|
void RenderSceneQDC (void)
|
|
|
|
{
|
|
Rect wholeBall, wholePlayer, wholeOpponent, wholeCursor;
|
|
|
|
/* find union of old & new position rects */
|
|
UnionRect(&thePlayer.isRect, &thePlayer.wasRect, &wholePlayer);
|
|
UnionRect(&theOpponent.isRect, &theOpponent.wasRect, &wholeOpponent);
|
|
UnionRect(&theBall.isRect, &theBall.wasRect, &wholeBall);
|
|
UnionRect(&boardCursor.isRect, &boardCursor.wasRect, &wholeCursor);
|
|
|
|
/* dick with the door */
|
|
if (theDoor.stateChanged)
|
|
{
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits, &((GrafPtr)offCWorkPtr)->portBits,
|
|
&theDoor.srcRects[theDoor.doorOpen][theDoor.doorState],
|
|
&theDoor.destRects[theDoor.doorOpen], srcCopy, kNilPointer);
|
|
CopyBits(&((GrafPtr)offCWorkPtr)->portBits, &((GrafPtr)offCBackPtr)->portBits,
|
|
&theDoor.destRects[theDoor.doorOpen],
|
|
&theDoor.destRects[theDoor.doorOpen], srcCopy, kNilPointer);
|
|
}
|
|
|
|
if ((showBoardCursor) && (!disableBoardCursor) && (drawThisFrame))
|
|
{
|
|
CopyMask(&((GrafPtr)offCPartsPtr)->portBits, &offMaskMap,
|
|
&((GrafPtr)offCWorkPtr)->portBits, &boardCursor.srcRect,
|
|
&boardCursor.srcRect, &boardCursor.isRect);
|
|
}
|
|
|
|
if ((theBall.mode == kBallRolling) && (!theBall.dontDraw) && (drawThisFrame))
|
|
CopyMask(&((GrafPtr)offCPartsPtr)->portBits, &offMaskMap,
|
|
&((GrafPtr)offCWorkPtr)->portBits, &theBall.srcRect,
|
|
&theBall.srcRect, &theBall.isRect);
|
|
|
|
/* mask the bastards to the work map - back to front! */
|
|
|
|
if (playerInBack)
|
|
{
|
|
if ((thePlayer.mode != kInStasis) && (drawThisFrame))
|
|
CopyMask(&((GrafPtr)offCPartsPtr)->portBits, &offMaskMap,
|
|
&((GrafPtr)offCWorkPtr)->portBits, &thePlayer.srcRect,
|
|
&thePlayer.maskRect, &thePlayer.isRect);
|
|
if ((theOpponent.mode != kInStasis) && (drawThisFrame))
|
|
CopyMask(&((GrafPtr)offCPartsPtr)->portBits, &offMaskMap,
|
|
&((GrafPtr)offCWorkPtr)->portBits, &theOpponent.srcRect,
|
|
&theOpponent.maskRect, &theOpponent.isRect);
|
|
}
|
|
else
|
|
{
|
|
if ((theOpponent.mode != kInStasis) && (drawThisFrame))
|
|
CopyMask(&((GrafPtr)offCPartsPtr)->portBits, &offMaskMap,
|
|
&((GrafPtr)offCWorkPtr)->portBits, &theOpponent.srcRect,
|
|
&theOpponent.maskRect, &theOpponent.isRect);
|
|
if ((thePlayer.mode != kInStasis) && (drawThisFrame))
|
|
CopyMask(&((GrafPtr)offCPartsPtr)->portBits, &offMaskMap,
|
|
&((GrafPtr)offCWorkPtr)->portBits, &thePlayer.srcRect,
|
|
&thePlayer.maskRect, &thePlayer.isRect);
|
|
}
|
|
|
|
/* blast them to the screen */
|
|
if ((thePlayer.mode != kInStasis) && (drawThisFrame))
|
|
{
|
|
CopyBits(&((GrafPtr)offCWorkPtr)->portBits, &(((GrafPtr)mainWndo)->portBits),
|
|
&wholePlayer, &wholePlayer, srcCopy, kNilPointer);
|
|
}
|
|
if ((theOpponent.mode != kInStasis) && (drawThisFrame))
|
|
{
|
|
CopyBits(&((GrafPtr)offCWorkPtr)->portBits, &(((GrafPtr)mainWndo)->portBits),
|
|
&wholeOpponent, &wholeOpponent, srcCopy, kNilPointer);
|
|
}
|
|
if ((theBall.mode == kBallRolling) && (drawThisFrame))
|
|
{
|
|
CopyBits(&((GrafPtr)offCWorkPtr)->portBits, &(((GrafPtr)mainWndo)->portBits),
|
|
&wholeBall, &wholeBall, srcCopy, kNilPointer);
|
|
}
|
|
else if (theBall.eraseTheBall)
|
|
{
|
|
CopyBits(&((GrafPtr)offCWorkPtr)->portBits, &(((GrafPtr)mainWndo)->portBits),
|
|
&theBall.eraser, &theBall.eraser, srcCopy, kNilPointer);
|
|
|
|
theBall.eraseTheBall = FALSE;
|
|
}
|
|
|
|
if ((showBoardCursor) && (!disableBoardCursor) && (drawThisFrame))
|
|
{
|
|
CopyBits(&((GrafPtr)offCWorkPtr)->portBits, &(((GrafPtr)mainWndo)->portBits),
|
|
&wholeCursor, &wholeCursor, srcCopy, kNilPointer);
|
|
}
|
|
|
|
/* and re-dick with the door */
|
|
if (theDoor.stateChanged)
|
|
{
|
|
CopyBits(&((GrafPtr)offCWorkPtr)->portBits, &(((GrafPtr)mainWndo)->portBits),
|
|
&theDoor.destRects[theDoor.doorOpen],
|
|
&theDoor.destRects[theDoor.doorOpen], srcCopy, kNilPointer);
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits, &((GrafPtr)offCBackPtr)->portBits,
|
|
&theDoor.srcRects[theDoor.doorOpen][theDoor.doorState],
|
|
&theDoor.destRects[theDoor.doorOpen], srcCopy, kNilPointer);
|
|
CopyBits(&((GrafPtr)offCWorkPtr)->portBits, &((GrafPtr)offCBackPtr)->portBits,
|
|
&theDoor.destRects[theDoor.doorOpen],
|
|
&theDoor.destRects[theDoor.doorOpen], srcCopy, kNilPointer);
|
|
}
|
|
|
|
/* plug up the holes on the work map */
|
|
if ((thePlayer.mode != kInStasis) && (drawThisFrame))
|
|
CopyBits(&((GrafPtr)offCBackPtr)->portBits, &((GrafPtr)offCWorkPtr)->portBits,
|
|
&thePlayer.isRect, &thePlayer.isRect, srcCopy, kNilPointer);
|
|
if ((theOpponent.mode != kInStasis) && (drawThisFrame))
|
|
CopyBits(&((GrafPtr)offCBackPtr)->portBits, &((GrafPtr)offCWorkPtr)->portBits,
|
|
&theOpponent.isRect, &theOpponent.isRect, srcCopy, kNilPointer);
|
|
if ((theBall.mode == kBallRolling) && (drawThisFrame))
|
|
CopyBits(&((GrafPtr)offCBackPtr)->portBits, &((GrafPtr)offCWorkPtr)->portBits,
|
|
&theBall.isRect, &theBall.isRect, srcCopy, kNilPointer);
|
|
if ((showBoardCursor) && (!disableBoardCursor) && (drawThisFrame))
|
|
CopyBits(&((GrafPtr)offCBackPtr)->portBits, &((GrafPtr)offCWorkPtr)->portBits,
|
|
&boardCursor.isRect, &boardCursor.isRect, srcCopy, kNilPointer);
|
|
}
|
|
|
|
|
|
/*======================================================== DisplayScoreDigitQD1 */
|
|
|
|
void DisplayScoreDigitQD1 (short place, short digit, short who)
|
|
|
|
{
|
|
CopyBits(&offPartsBits, &(mainWndo->portBits), &scoreDisplays[who].srcRects[digit],
|
|
&scoreDisplays[who].destRects[place], srcCopy, kNilPointer);
|
|
}
|
|
|
|
|
|
/*======================================================== DisplayScoreDigitQDC */
|
|
|
|
void DisplayScoreDigitQDC (short place, short digit, short who)
|
|
|
|
{
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits, &(((GrafPtr)mainWndo)->portBits),
|
|
&scoreDisplays[who].srcRects[digit],
|
|
&scoreDisplays[who].destRects[place], srcCopy, kNilPointer);
|
|
}
|
|
|
|
|
|
/*======================================================== DisplayPlayerFoulsQD1 */
|
|
|
|
void DisplayPlayerFoulsQD1 (short fouls)
|
|
|
|
{
|
|
Rect srcOnRect, srcOffRect;
|
|
short i, selector;
|
|
|
|
SetRect(&srcOnRect, 0, 56, 16, 62);
|
|
SetRect(&srcOffRect, 0, 50, 16, 56);
|
|
|
|
if (leftGoalIsPlayers)
|
|
selector = kLeftScoreSelector;
|
|
else
|
|
selector = kRightScoreSelector;
|
|
|
|
for (i = 0; i < 2; i++)
|
|
{
|
|
if (i < fouls)
|
|
CopyBits(&offPartsBits, &(mainWndo->portBits), &srcOnRect,
|
|
&scoreDisplays[selector].lightDest[i], srcCopy, kNilPointer);
|
|
else
|
|
CopyBits(&offPartsBits, &(mainWndo->portBits), &srcOffRect,
|
|
&scoreDisplays[selector].lightDest[i], srcCopy, kNilPointer);
|
|
}
|
|
}
|
|
|
|
|
|
/*======================================================== DisplayPlayerFoulsQDC */
|
|
|
|
void DisplayPlayerFoulsQDC (short fouls)
|
|
|
|
{
|
|
Rect srcOnRect, srcOffRect;
|
|
short i, selector;
|
|
|
|
SetRect(&srcOffRect, 0, 50, 16, 56);
|
|
|
|
if (leftGoalIsPlayers)
|
|
{
|
|
SetRect(&srcOnRect, 0, 56, 16, 62);
|
|
selector = kLeftScoreSelector;
|
|
}
|
|
else
|
|
{
|
|
SetRect(&srcOnRect, 16, 56, 32, 62);
|
|
selector = kRightScoreSelector;
|
|
}
|
|
|
|
for (i = 0; i < 2; i++)
|
|
{
|
|
if (i < fouls)
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits, &(((GrafPtr)mainWndo)->portBits),
|
|
&srcOnRect, &scoreDisplays[selector].lightDest[i],
|
|
srcCopy, kNilPointer);
|
|
else
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits, &(((GrafPtr)mainWndo)->portBits),
|
|
&srcOffRect, &scoreDisplays[selector].lightDest[i],
|
|
srcCopy, kNilPointer);
|
|
}
|
|
}
|
|
|
|
|
|
/*======================================================== DisplayOpponentFoulsQD1 */
|
|
|
|
void DisplayOpponentFoulsQD1 (short fouls)
|
|
|
|
{
|
|
Rect srcOnRect, srcOffRect;
|
|
short i, selector;
|
|
|
|
SetRect(&srcOnRect, 16, 56, 32, 62);
|
|
SetRect(&srcOffRect, 0, 50, 16, 56);
|
|
|
|
if (leftGoalIsPlayers)
|
|
selector = kRightScoreSelector;
|
|
else
|
|
selector = kLeftScoreSelector;
|
|
|
|
for (i = 0; i < 2; i++)
|
|
{
|
|
if (i < fouls)
|
|
CopyBits(&offPartsBits, &(mainWndo->portBits), &srcOnRect,
|
|
&scoreDisplays[selector].lightDest[i], srcCopy, kNilPointer);
|
|
else
|
|
CopyBits(&offPartsBits, &(mainWndo->portBits), &srcOffRect,
|
|
&scoreDisplays[selector].lightDest[i], srcCopy, kNilPointer);
|
|
}
|
|
}
|
|
|
|
|
|
/*======================================================== DisplayOpponentFoulsQDC */
|
|
|
|
void DisplayOpponentFoulsQDC (short fouls)
|
|
|
|
{
|
|
Rect srcOnRect, srcOffRect;
|
|
short i, selector;
|
|
|
|
SetRect(&srcOffRect, 0, 50, 16, 56);
|
|
|
|
if (leftGoalIsPlayers)
|
|
{
|
|
selector = kRightScoreSelector;
|
|
SetRect(&srcOnRect, 16, 56, 32, 62);
|
|
}
|
|
else
|
|
{
|
|
selector = kLeftScoreSelector;
|
|
SetRect(&srcOnRect, 0, 56, 16, 62);
|
|
}
|
|
|
|
for (i = 0; i < 2; i++)
|
|
{
|
|
if (i < fouls)
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits, &(((GrafPtr)mainWndo)->portBits),
|
|
&srcOnRect, &scoreDisplays[selector].lightDest[i],
|
|
srcCopy, kNilPointer);
|
|
else
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits, &(((GrafPtr)mainWndo)->portBits),
|
|
&srcOffRect, &scoreDisplays[selector].lightDest[i],
|
|
srcCopy, kNilPointer);
|
|
}
|
|
}
|
|
|
|
|
|
/*======================================================== TwinkleAStarQD1 */
|
|
|
|
void TwinkleAStarQD1 (short whichStar)
|
|
|
|
{
|
|
GrafPtr wasPort;
|
|
|
|
GetPort(&wasPort);
|
|
SetPort((GrafPtr)mainWndo);
|
|
PenMode(patXor);
|
|
MoveTo(starList[whichStar].h, starList[whichStar].v);
|
|
Line(0, 0);
|
|
PenNormal();
|
|
SetPort((GrafPtr)wasPort);
|
|
}
|
|
|
|
|
|
/*======================================================== TwinkleAStarQDC */
|
|
|
|
void TwinkleAStarQDC (short whichStar, short color)
|
|
|
|
{
|
|
GrafPtr wasPort;
|
|
|
|
GetPort(&wasPort);
|
|
SetPort((GrafPtr)mainWndo);
|
|
RGBForeColor(&starColors[color]);
|
|
MoveTo(starList[whichStar].h, starList[whichStar].v);
|
|
Line(0, 0);
|
|
RGBForeColor(&RGBBlackColor);
|
|
SetPort((GrafPtr)wasPort);
|
|
}
|
|
|
|
|
|
/*======================================================== DrawOffscreenAStarQD1 */
|
|
|
|
void DrawOffscreenAStarQD1 (short whichStar)
|
|
|
|
{
|
|
GrafPtr wasPort;
|
|
|
|
GetPort(&wasPort);
|
|
SetPort(offBackPtr);
|
|
PenMode(patXor);
|
|
MoveTo(starList[whichStar].h, starList[whichStar].v);
|
|
Line(0, 0);
|
|
PenNormal();
|
|
SetPort(offWorkPtr);
|
|
PenMode(patXor);
|
|
MoveTo(starList[whichStar].h, starList[whichStar].v);
|
|
Line(0, 0);
|
|
PenNormal();
|
|
SetPort((GrafPtr)wasPort);
|
|
}
|
|
|
|
|
|
/*======================================================== DrawOffscreenAStarQDC */
|
|
|
|
void DrawOffscreenAStarQDC (short whichStar, short color)
|
|
|
|
{
|
|
GrafPtr wasPort;
|
|
|
|
GetPort(&wasPort);
|
|
|
|
SetPort((GrafPtr)offCBackPtr);
|
|
RGBForeColor(&starColors[color]);
|
|
MoveTo(starList[whichStar].h, starList[whichStar].v);
|
|
Line(0, 0);
|
|
RGBForeColor(&RGBBlackColor);
|
|
|
|
SetPort((GrafPtr)offCWorkPtr);
|
|
RGBForeColor(&starColors[color]);
|
|
MoveTo(starList[whichStar].h, starList[whichStar].v);
|
|
Line(0, 0);
|
|
RGBForeColor(&RGBBlackColor);
|
|
|
|
SetPort((GrafPtr)wasPort);
|
|
}
|
|
|
|
|
|
/*======================================================== UpdateArrowsQD1 */
|
|
|
|
void UpdateArrowsQD1 (void)
|
|
|
|
{
|
|
switch (whosGotBall)
|
|
{
|
|
case kBallIsNotHere:
|
|
case kBallRollsFreely:
|
|
CopyBits(&offPartsBits, &(mainWndo->portBits), &leftArrowStorage,
|
|
&leftArrowDest, srcCopy, mainWndo->visRgn);
|
|
CopyBits(&offPartsBits, &offBackBits, &leftArrowStorage, &leftArrowDest,
|
|
srcCopy, kNilPointer);
|
|
CopyBits(&offPartsBits, &offWorkBits, &leftArrowStorage, &leftArrowDest,
|
|
srcCopy, kNilPointer);
|
|
|
|
CopyBits(&offPartsBits, &(mainWndo->portBits), &rightArrowStorage,
|
|
&rightArrowDest, srcCopy, mainWndo->visRgn);
|
|
CopyBits(&offPartsBits, &offBackBits, &rightArrowStorage, &rightArrowDest,
|
|
srcCopy, kNilPointer);
|
|
CopyBits(&offPartsBits, &offWorkBits, &rightArrowStorage, &rightArrowDest,
|
|
srcCopy, kNilPointer);
|
|
break;
|
|
case kPlayerHasBall:
|
|
if (thePlayer.whichGoal == kLeftGoal)
|
|
{
|
|
CopyMask(&offPartsBits, &offMaskMap, &offBackBits, &leftArrowSrc,
|
|
&leftArrowSrc, &leftArrowDest);
|
|
CopyBits(&offBackBits, &offWorkBits, &leftArrowDest, &leftArrowDest,
|
|
srcCopy, kNilPointer);
|
|
CopyBits(&offBackBits, &(mainWndo->portBits), &leftArrowDest,
|
|
&leftArrowDest, srcCopy, mainWndo->visRgn);
|
|
|
|
CopyBits(&offPartsBits, &(mainWndo->portBits), &rightArrowStorage,
|
|
&rightArrowDest, srcCopy, mainWndo->visRgn);
|
|
CopyBits(&offPartsBits, &offBackBits, &rightArrowStorage,
|
|
&rightArrowDest, srcCopy, kNilPointer);
|
|
CopyBits(&offPartsBits, &offWorkBits, &rightArrowStorage,
|
|
&rightArrowDest, srcCopy, kNilPointer);
|
|
}
|
|
else
|
|
{
|
|
CopyMask(&offPartsBits, &offMaskMap, &offBackBits, &rightArrowSrc,
|
|
&rightArrowSrc, &rightArrowDest);
|
|
CopyBits(&offBackBits, &(mainWndo->portBits), &rightArrowDest,
|
|
&rightArrowDest, srcCopy, mainWndo->visRgn);
|
|
CopyBits(&offBackBits, &offWorkBits, &rightArrowDest, &rightArrowDest,
|
|
srcCopy, kNilPointer);
|
|
|
|
CopyBits(&offPartsBits, &(mainWndo->portBits), &leftArrowStorage,
|
|
&leftArrowDest, srcCopy, mainWndo->visRgn);
|
|
CopyBits(&offPartsBits, &offBackBits, &leftArrowStorage,
|
|
&leftArrowDest, srcCopy, kNilPointer);
|
|
CopyBits(&offPartsBits, &offWorkBits, &leftArrowStorage,
|
|
&leftArrowDest, srcCopy, kNilPointer);
|
|
}
|
|
break;
|
|
case kOpponentHasBall:
|
|
if (theOpponent.whichGoal == kLeftGoal)
|
|
{
|
|
CopyMask(&offPartsBits, &offMaskMap, &offBackBits, &leftArrowSrc,
|
|
&leftArrowSrc, &leftArrowDest);
|
|
CopyBits(&offBackBits, &offWorkBits, &leftArrowDest, &leftArrowDest,
|
|
srcCopy, kNilPointer);
|
|
CopyBits(&offBackBits, &(mainWndo->portBits), &leftArrowDest,
|
|
&leftArrowDest, srcCopy, mainWndo->visRgn);
|
|
|
|
CopyBits(&offPartsBits, &(mainWndo->portBits), &rightArrowStorage,
|
|
&rightArrowDest, srcCopy, mainWndo->visRgn);
|
|
CopyBits(&offPartsBits, &offBackBits, &rightArrowStorage,
|
|
&rightArrowDest, srcCopy, kNilPointer);
|
|
CopyBits(&offPartsBits, &offWorkBits, &rightArrowStorage,
|
|
&rightArrowDest, srcCopy, kNilPointer);
|
|
}
|
|
else
|
|
{
|
|
CopyMask(&offPartsBits, &offMaskMap, &offBackBits, &rightArrowSrc,
|
|
&rightArrowSrc, &rightArrowDest);
|
|
CopyBits(&offBackBits, &(mainWndo->portBits), &rightArrowDest,
|
|
&rightArrowDest, srcCopy, mainWndo->visRgn);
|
|
CopyBits(&offBackBits, &offWorkBits, &rightArrowDest, &rightArrowDest,
|
|
srcCopy, kNilPointer);
|
|
|
|
CopyBits(&offPartsBits, &(mainWndo->portBits), &leftArrowStorage,
|
|
&leftArrowDest, srcCopy, mainWndo->visRgn);
|
|
CopyBits(&offPartsBits, &offBackBits, &leftArrowStorage,
|
|
&leftArrowDest, srcCopy, kNilPointer);
|
|
CopyBits(&offPartsBits, &offWorkBits, &leftArrowStorage,
|
|
&leftArrowDest, srcCopy, kNilPointer);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
/*======================================================== UpdateArrowsQDC */
|
|
|
|
void UpdateArrowsQDC (void)
|
|
|
|
{
|
|
switch (whosGotBall)
|
|
{
|
|
case kBallIsNotHere:
|
|
case kBallRollsFreely:
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits,
|
|
&(((GrafPtr)mainWndo)->portBits), &leftArrowStorage,
|
|
&leftArrowDest, srcCopy, mainWndo->visRgn);
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits,
|
|
&((GrafPtr)offCBackPtr)->portBits, &leftArrowStorage,
|
|
&leftArrowDest, srcCopy, kNilPointer);
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits,
|
|
&((GrafPtr)offCWorkPtr)->portBits, &leftArrowStorage,
|
|
&leftArrowDest, srcCopy, kNilPointer);
|
|
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits,
|
|
&(((GrafPtr)mainWndo)->portBits), &rightArrowStorage,
|
|
&rightArrowDest, srcCopy, mainWndo->visRgn);
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits,
|
|
&((GrafPtr)offCBackPtr)->portBits, &rightArrowStorage,
|
|
&rightArrowDest, srcCopy, kNilPointer);
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits,
|
|
&((GrafPtr)offCWorkPtr)->portBits, &rightArrowStorage,
|
|
&rightArrowDest, srcCopy, kNilPointer);
|
|
break;
|
|
case kPlayerHasBall:
|
|
if (thePlayer.whichGoal == kLeftGoal)
|
|
{
|
|
CopyMask(&((GrafPtr)offCPartsPtr)->portBits, &offMaskMap,
|
|
&(((GrafPtr)mainWndo)->portBits), &leftArrowSrc,
|
|
&leftArrowSrc, &leftArrowDest);
|
|
CopyBits(&(((GrafPtr)mainWndo)->portBits),
|
|
&((GrafPtr)offCBackPtr)->portBits,
|
|
&leftArrowDest, &leftArrowDest, srcCopy, mainWndo->visRgn);
|
|
CopyBits(&(((GrafPtr)mainWndo)->portBits),
|
|
&((GrafPtr)offCWorkPtr)->portBits,
|
|
&leftArrowDest, &leftArrowDest, srcCopy, mainWndo->visRgn);
|
|
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits,
|
|
&(((GrafPtr)mainWndo)->portBits), &rightArrowStorage,
|
|
&rightArrowDest, srcCopy, mainWndo->visRgn);
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits,
|
|
&((GrafPtr)offCBackPtr)->portBits, &rightArrowStorage,
|
|
&rightArrowDest, srcCopy, kNilPointer);
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits,
|
|
&((GrafPtr)offCWorkPtr)->portBits, &rightArrowStorage,
|
|
&rightArrowDest, srcCopy, kNilPointer);
|
|
}
|
|
else
|
|
{
|
|
CopyMask(&((GrafPtr)offCPartsPtr)->portBits, &offMaskMap,
|
|
&(((GrafPtr)mainWndo)->portBits), &rightArrowSrc,
|
|
&rightArrowSrc, &rightArrowDest);
|
|
CopyBits(&(((GrafPtr)mainWndo)->portBits),
|
|
&((GrafPtr)offCBackPtr)->portBits, &rightArrowDest,
|
|
&rightArrowDest, srcCopy, mainWndo->visRgn);
|
|
CopyBits(&(((GrafPtr)mainWndo)->portBits),
|
|
&((GrafPtr)offCWorkPtr)->portBits, &rightArrowDest,
|
|
&rightArrowDest, srcCopy, mainWndo->visRgn);
|
|
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits,
|
|
&(((GrafPtr)mainWndo)->portBits), &leftArrowStorage,
|
|
&leftArrowDest, srcCopy, mainWndo->visRgn);
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits,
|
|
&((GrafPtr)offCBackPtr)->portBits, &leftArrowStorage,
|
|
&leftArrowDest, srcCopy, kNilPointer);
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits,
|
|
&((GrafPtr)offCWorkPtr)->portBits, &leftArrowStorage,
|
|
&leftArrowDest, srcCopy, kNilPointer);
|
|
}
|
|
break;
|
|
case kOpponentHasBall:
|
|
if (theOpponent.whichGoal == kLeftGoal)
|
|
{
|
|
CopyMask(&((GrafPtr)offCPartsPtr)->portBits, &offMaskMap,
|
|
&(((GrafPtr)mainWndo)->portBits), &leftArrowSrc,
|
|
&leftArrowSrc, &leftArrowDest);
|
|
CopyBits(&(((GrafPtr)mainWndo)->portBits),
|
|
&((GrafPtr)offCBackPtr)->portBits,
|
|
&leftArrowDest, &leftArrowDest, srcCopy, mainWndo->visRgn);
|
|
CopyBits(&(((GrafPtr)mainWndo)->portBits),
|
|
&((GrafPtr)offCWorkPtr)->portBits,
|
|
&leftArrowDest, &leftArrowDest, srcCopy, mainWndo->visRgn);
|
|
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits,
|
|
&(((GrafPtr)mainWndo)->portBits), &rightArrowStorage,
|
|
&rightArrowDest, srcCopy, mainWndo->visRgn);
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits,
|
|
&((GrafPtr)offCBackPtr)->portBits, &rightArrowStorage,
|
|
&rightArrowDest, srcCopy, kNilPointer);
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits,
|
|
&((GrafPtr)offCWorkPtr)->portBits, &rightArrowStorage,
|
|
&rightArrowDest, srcCopy, kNilPointer);
|
|
}
|
|
else
|
|
{
|
|
CopyMask(&((GrafPtr)offCPartsPtr)->portBits, &offMaskMap,
|
|
&(((GrafPtr)mainWndo)->portBits), &rightArrowSrc,
|
|
&rightArrowSrc, &rightArrowDest);
|
|
CopyBits(&(((GrafPtr)mainWndo)->portBits),
|
|
&((GrafPtr)offCBackPtr)->portBits, &rightArrowDest,
|
|
&rightArrowDest, srcCopy, mainWndo->visRgn);
|
|
CopyBits(&(((GrafPtr)mainWndo)->portBits),
|
|
&((GrafPtr)offCWorkPtr)->portBits, &rightArrowDest,
|
|
&rightArrowDest, srcCopy, mainWndo->visRgn);
|
|
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits,
|
|
&(((GrafPtr)mainWndo)->portBits), &leftArrowStorage,
|
|
&leftArrowDest, srcCopy, mainWndo->visRgn);
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits,
|
|
&((GrafPtr)offCBackPtr)->portBits, &leftArrowStorage,
|
|
&leftArrowDest, srcCopy, kNilPointer);
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits,
|
|
&((GrafPtr)offCWorkPtr)->portBits, &leftArrowStorage,
|
|
&leftArrowDest, srcCopy, kNilPointer);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
/*======================================================== RedrawWholeScreen */
|
|
|
|
void RedrawWholeScreen (void)
|
|
|
|
{
|
|
Rect tempRect;
|
|
short i;
|
|
|
|
if (isColor)
|
|
CopyBits(&((GrafPtr)offCBackPtr)->portBits, &((GrafPtr)offCWorkPtr)->portBits,
|
|
&offWorkRect, &offWorkRect, srcCopy, kNilPointer);
|
|
else
|
|
CopyBits(&offBackBits, &offWorkBits, &offWorkRect, &offWorkRect, srcCopy,
|
|
kNilPointer);
|
|
|
|
RenderScene();
|
|
|
|
if (isColor)
|
|
CopyBits(&((GrafPtr)offCWorkPtr)->portBits, &(((GrafPtr)mainWndo)->portBits),
|
|
&offWorkRect, &offWorkRect, srcCopy, ((GrafPtr)mainWndo)->visRgn);
|
|
else
|
|
CopyBits(&offWorkBits, &(mainWndo->portBits), &offWorkRect, &offWorkRect,
|
|
srcCopy, mainWndo->visRgn);
|
|
|
|
UpdatePlayerScore();
|
|
DisplayPlayerFouls(playerFouls);
|
|
UpdateOpponentScore();
|
|
DisplayOpponentFouls(opponentFouls);
|
|
UpdateArrows();
|
|
|
|
tempRect = leftTimingDest;
|
|
tempRect.bottom = tempRect.top;
|
|
if (isColor)
|
|
UpdateBallTimersQDC(&tempRect);
|
|
else
|
|
UpdateBallTimersQD1(&tempRect);
|
|
|
|
tempRect = rightTimingDest;
|
|
tempRect.bottom = tempRect.top;
|
|
if (isColor)
|
|
UpdateBallTimersQDC(&tempRect);
|
|
else
|
|
UpdateBallTimersQD1(&tempRect);
|
|
|
|
UpdateBallTimers(&thePlayer);
|
|
UpdateBallTimers(&theOpponent);
|
|
}
|
|
|
|
|
|
/*======================================================== ReplayBackToWorkQD1 */
|
|
|
|
void ReplayBackToWorkQD1 (void)
|
|
|
|
{
|
|
CopyBits(&offBackBits, &offWorkBits, &cameraRect, &replayRect, srcCopy, kNilPointer);
|
|
}
|
|
|
|
|
|
/*======================================================== ReplayBackToWorkQDC */
|
|
|
|
void ReplayBackToWorkQDC (void)
|
|
|
|
{
|
|
CopyBits(&((GrafPtr)offCBackPtr)->portBits, &((GrafPtr)offCWorkPtr)->portBits,
|
|
&cameraRect, &replayRect, srcCopy, kNilPointer);
|
|
}
|
|
|
|
|
|
/*======================================================== ReplayWorkToMainQD1 */
|
|
|
|
void ReplayWorkToMainQD1 (void)
|
|
|
|
{
|
|
CopyBits(&offWorkBits, &(mainWndo->portBits), &replayRect, &replayRect, srcCopy,
|
|
kNilPointer);
|
|
}
|
|
|
|
|
|
/*======================================================== ReplayWorkToMainQDC */
|
|
|
|
void ReplayWorkToMainQDC (void)
|
|
|
|
{
|
|
CopyBits(&((GrafPtr)offCWorkPtr)->portBits, &(((GrafPtr)mainWndo)->portBits),
|
|
&replayRect, &replayRect, srcCopy, kNilPointer);
|
|
}
|
|
|
|
|
|
//======================================================== DumpPict
|
|
|
|
Boolean DumpPict (short frameNumber)
|
|
|
|
{
|
|
Str255 nameStr, digitStr;
|
|
Rect offReplayRect;
|
|
PicHandle thePict;
|
|
CTabHandle thisCMHandle;
|
|
CGrafPtr offCReplayPtr;
|
|
CGrafPort offCReplayPort;
|
|
GDHandle thisGDevice;
|
|
GrafPtr wasPort;
|
|
Ptr offReplayPix;
|
|
long longCount, longZero, bytesAvail, sizeOfOff;
|
|
OSErr err;
|
|
short i, vrefnum, globalRef, replayRowBytes, digit;
|
|
|
|
globalRef = 0;
|
|
if (GetVInfo(0, (StringPtr)nameStr, &vrefnum, &bytesAvail) != noErr)
|
|
return (FALSE);
|
|
|
|
PasStringCopy("\pReplay.000", nameStr);
|
|
|
|
digit = frameNumber % 10;
|
|
nameStr[10] = digit + 48;
|
|
|
|
frameNumber /= 10;
|
|
digit = frameNumber % 10;
|
|
nameStr[9] = digit + 48;
|
|
|
|
frameNumber /= 10;
|
|
digit = frameNumber % 10;
|
|
nameStr[8] = digit + 48;
|
|
|
|
do
|
|
{
|
|
err = Create(nameStr, vrefnum, 'ttxt', 'PICT');
|
|
if (err != noErr)
|
|
{
|
|
if (err == dupFNErr)
|
|
nameStr[10]++;
|
|
else
|
|
return (FALSE);
|
|
}
|
|
} while (err != noErr);
|
|
|
|
if (FSOpen(nameStr, vrefnum, &globalRef) != 0)
|
|
return (FALSE);
|
|
|
|
longZero = 0L;
|
|
longCount = 4L;
|
|
for (i = 0; i < (512 / 4); i++)
|
|
{
|
|
err = FSWrite(globalRef, &longCount, &longZero);
|
|
if (err != noErr)
|
|
return (FALSE);
|
|
}
|
|
|
|
GetPort(&wasPort);
|
|
SetPort((GrafPtr)mainWndo);
|
|
|
|
thisGDevice = GetMainDevice();
|
|
offCReplayPtr = &offCReplayPort;
|
|
OpenCPort(offCReplayPtr);
|
|
SetRect(&offReplayRect, 0, 0, replayRect.right - replayRect.left,
|
|
replayRect.bottom - replayRect.top);
|
|
replayRowBytes = (((4 * offReplayRect.right) + 15) >> 4) << 1;
|
|
sizeOfOff = (long)offReplayRect.bottom * (long)replayRowBytes;
|
|
offReplayPix = NewPtr(sizeOfOff);
|
|
if (offReplayPix == kNilPointer)
|
|
DeathError(kErrNoMemory);
|
|
(**(*offCReplayPtr).portPixMap).baseAddr = offReplayPix;
|
|
(**(*offCReplayPtr).portPixMap).rowBytes = (short)replayRowBytes + 0x8000;
|
|
(**(*offCReplayPtr).portPixMap).bounds = offReplayRect;
|
|
SetPort((GrafPtr)offCReplayPtr);
|
|
ClipRect(&offReplayRect);
|
|
thisCMHandle = (**(**thisGDevice).gdPMap).pmTable;
|
|
err = HandToHand((Handle *)&thisCMHandle);
|
|
if (err != noErr)
|
|
return (FALSE);
|
|
(**(*offCReplayPtr).portPixMap).pmTable = thisCMHandle;
|
|
PmForeColor(kBlackColor4Bit);
|
|
PmBackColor(kWhiteColor4Bit);
|
|
CopyBits(&(((GrafPtr)mainWndo)->portBits), &((GrafPtr)offCReplayPtr)->portBits,
|
|
&replayRect, &offReplayRect, srcCopy, kNilPointer);
|
|
|
|
SetPort((GrafPtr)offCReplayPtr);
|
|
thePict = OpenPicture(&offReplayRect);
|
|
if (thePict == kNilPointer)
|
|
return (FALSE);
|
|
CopyBits(&((GrafPtr)offCReplayPtr)->portBits, &((GrafPtr)offCReplayPtr)->portBits,
|
|
&offReplayRect, &offReplayRect, srcCopy, kNilPointer);
|
|
ClosePicture();
|
|
|
|
HLock((Handle)thePict);
|
|
longCount = GetHandleSize((Handle)thePict);
|
|
|
|
if (FSWrite(globalRef, &longCount, *thePict) != noErr)
|
|
return (FALSE);
|
|
HUnlock((Handle)thePict);
|
|
|
|
if (FSClose(globalRef) != noErr)
|
|
return (FALSE);
|
|
|
|
KillPicture(thePict);
|
|
|
|
if (offCReplayPtr != kNilPointer)
|
|
CloseCPort(offCReplayPtr);
|
|
if (offReplayPix != kNilPointer)
|
|
DisposPtr(offReplayPix);
|
|
|
|
SetPort(wasPort);
|
|
return (TRUE);
|
|
}
|
|
|
|
/*======================================================== UpdateBallTimersQD1 */
|
|
|
|
void UpdateBallTimersQD1 (Rect *dest)
|
|
|
|
{
|
|
GrafPtr wasPort;
|
|
|
|
if (dest->top == dest->bottom)
|
|
{
|
|
dest->bottom = dest->top + 26;
|
|
CopyBits(&offPartsBits, &(mainWndo->portBits), &timingSource, dest, srcCopy,
|
|
kNilPointer);
|
|
}
|
|
else
|
|
{
|
|
GetPort((GrafPtr *)&wasPort);
|
|
SetPort((GrafPtr)mainWndo);
|
|
PaintRect(dest);
|
|
SetPort((GrafPtr)wasPort);
|
|
}
|
|
}
|
|
|
|
|
|
/*======================================================== UpdateBallTimersQDC */
|
|
|
|
void UpdateBallTimersQDC (Rect *dest)
|
|
|
|
{
|
|
GrafPtr wasPort;
|
|
|
|
if (dest->top == dest->bottom)
|
|
{
|
|
dest->bottom = dest->top + 26;
|
|
CopyBits(&((GrafPtr)offCPartsPtr)->portBits, &(((GrafPtr)mainWndo)->portBits),
|
|
&timingSource, dest, srcCopy, kNilPointer);
|
|
}
|
|
else
|
|
{
|
|
GetPort((GrafPtr *)&wasPort);
|
|
SetPort((GrafPtr)mainWndo);
|
|
PaintRect(dest);
|
|
SetPort((GrafPtr)wasPort);
|
|
}
|
|
}
|
|
|