Pararena2/Sources/Replay.c

1 line
17 KiB
C
Raw Normal View History

/*============================================================*/ /*============================================================*/ /*== ==*/ /*== Instant Replay Handling Routines ==*/ /*== ==*/ /*============================================================*/ /*============================================================*/ /*======================================================== Includes */ #include "Globals.h" #include "UnivUtilities.h" #include "Replay.h" #include "Render.h" #include "RenderQD.h" #include "NetOpponent.h" #include "RenderAsm1.h" #include "RenderAsm4.h" /*======================================================== Functions */ /*======================================================== AmassReplayData */ void AmassReplayData (void) { short theFrame; if (canReplay) { replayData->frame++; if (replayData->frame >= kMaxReplayFrames) replayData->frame = 0; theFrame = replayData->frame; replayData->data[theFrame].playerIs = thePlayer.isRect; replayData->data[theFrame].opponentIs = theOpponent.isRect; replayData->data[theFrame].ballIs = theBall.isRect; if (leftGoalIsPlayers) replayData->data[theFrame].playerArraySrc = kPlayerSrc; else replayData->data[theFrame].playerArraySrc = kOpponentSrc; replayData->data[theFrame].playerDirSrc = thePlayer.dirFlagSrc; replayData->data[theFrame].playerPostSrc = thePlayer.postFlagSrc; replayData->data[theFrame].playerArrayMask = thePlayer.arrayFlagMask; replayData->data[theFrame].playerDirMask = thePlayer.dirFlagMask; replayData->data[theFrame].playerPostMask = thePlayer.postFlagMask; replayData->data[theFrame].playerMode = thePlayer.mode; if (leftGoalIsPlayers) replayData->data[theFrame].opponentArraySrc = kOpponentSrc; else replayData->data[theFrame].opponentArraySrc = kPlayerSrc; replayData->data[theFrame].opponentDirSrc = theOpponent.dirFlagSrc; replayData->data[theFrame].opponentPostSrc = theOpponent.postFlagSrc; replayData->data[theFrame].opponentArrayMask = theOpponent.arrayFlagMask; replayData->data[theFrame].opponentDirMask = theOpponent.dirFlagMask; replayData->data[theFrame].opponentPostMask = theOpponent.postFlagMask; replayData->data[theFrame].opponentMode = theOpponent.mode; replayData->data[theFrame].ballMode = theBall.mode; replayData->data[theFrame].wheresBall = whosGotBall; replayData->data[theFrame].ballDontDraw = theBall.dontDraw; } } /*======================================================== DoInstantReplay */ void DoInstantReplay (void) { Rect playerIsRect, opponentIsRect, ballIsRect, zoomFrame; RgnHandle wasClip, newClip; GrafPtr wasPort; long nowTime, waitFor, dummyLong; short theFrame, i, replayTickDelay, zoomWide, zoomHigh, wasFrame; char ballsMode; Boolean confirmed, doQuicktime; if (!canReplay) return; doQuicktime = (isColor && OptionKeyIsDown() && CommandKeyIsDown()); nowTime = Ticks; HandlePreGraphics(); RenderScene(); zoomFrame = replayRect; GetPort(&wasPort); SetPort((GrafPtr)mainWndo); wasClip = NewRgn(); if (wasClip != kNilPointer) CopyRgn((RgnHandle)((GrafPtr)mainWndo->visRgn), wasClip); newClip = NewRgn(); if (newClip != kNilPointer) { RectRgn(newClip, &screenBits.bounds); CopyRgn(newClip, (RgnHandle)((GrafPtr)mainWndo->visRgn)); } if (replayZooms) { InsetRect(&zoomFrame, 63, 63); for (i = 1; i < 65; i++) { PenPat(black); FrameRect(&zoomFrame); InsetRect(&zoomFrame, -1, -1); PenPat(white); FrameRect(&zoomFrame); } } else { FillRect(&zoomFrame, black); InsetRect(&zoomFrame, -1, -1); PenPat(white); FrameRect(&zoomFrame); } PenNormal(); SetPort((GrafPtr)wasPort); replayData->hVel = 0; replayData->vVel = 0; wasFrame = replayData->frame; replayData->frame++; if (replayData->frame >= kMaxReplayFrames) replayData->frame = 0; theFrame = replayData->frame; playerIsRect = replayData->data[theFrame].playerIs; opponentIsRect = replayData->data[theFrame].opponentIs; ballIsRect = replayData->data[theFrame].ba