mirror of
https://github.com/softdorothy/GliderPRO.git
synced 2024-11-29 07:49:46 +00:00
7a70d18ba6
Sources for Glider PRO, a Macintosh game written by John Calhoun and published by Casady & Greene, Inc. I believe it was using CodeWarrior IDE to create a fat (68K and PowerPC) binary.
1 line
14 KiB
C
Executable File
1 line
14 KiB
C
Executable File
|
|
//============================================================================
|
|
//----------------------------------------------------------------------------
|
|
// Dynamics2.c
|
|
//----------------------------------------------------------------------------
|
|
//============================================================================
|
|
|
|
|
|
#include "Externs.h"
|
|
#include "RectUtils.h"
|
|
|
|
|
|
#define kBalloonStop 8
|
|
#define kBalloonStart 310
|
|
#define kCopterStart 8
|
|
#define kCopterStop 310
|
|
#define kDartVelocity 6
|
|
#define kDartStop 310
|
|
#define kEnemyDropSpeed 8
|
|
|
|
|
|
extern dynaPtr dinahs;
|
|
extern short numBands;
|
|
extern Boolean evenFrame, twoPlayerGame, onePlayerLeft, playerDead;
|
|
|
|
|
|
//============================================================== Functions
|
|
//-------------------------------------------------------------- HandleBalloon
|
|
|
|
void HandleBalloon (short who)
|
|
{
|
|
Rect dest;
|
|
|
|
if (dinahs[who].moving)
|
|
{
|
|
if (dinahs[who].vVel < 0)
|
|
{
|
|
if (evenFrame)
|
|
{
|
|
dinahs[who].frame++;
|
|
if (dinahs[who].frame >= 6)
|
|
dinahs[who].frame = 0;
|
|
}
|
|
if (twoPlayerGame)
|
|
{
|
|
if (onePlayerLeft)
|
|
{
|
|
if (playerDead == theGlider.which)
|
|
CheckDynamicCollision(who, &theGlider2, false);
|
|
else
|
|
CheckDynamicCollision(who, &theGlider, false);
|
|
}
|
|
else
|
|
{
|
|
CheckDynamicCollision(who, &theGlider, false);
|
|
CheckDynamicCollision(who, &theGlider2, false);
|
|
}
|
|
}
|
|
else
|
|
CheckDynamicCollision(who, &theGlider, false);
|
|
|
|
if ((numBands > 0) && (DidBandHitDynamic(who)))
|
|
{
|
|
dinahs[who].frame = 6;
|
|
dinahs[who].vVel = kEnemyDropSpeed;
|
|
PlayPrioritySound(kPopSound, kPopPriority);
|
|
}
|
|
else
|
|
{
|
|
VOffsetRect(&dinahs[who].dest, dinahs[who].vVel);
|
|
dinahs[who].whole = dinahs[who].dest;
|
|
dinahs[who].whole.bottom -= dinahs[who].vVel;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (evenFrame)
|
|
{
|
|
dinahs[who].frame++;
|
|
if (dinahs[who].frame >= 8)
|
|
dinahs[who].frame = 6;
|
|
}
|
|
|
|
VOffsetRect(&dinahs[who].dest, dinahs[who].vVel);
|
|
dinahs[who].whole = dinahs[who].dest;
|
|
dinahs[who].whole.top -= dinahs[who].vVel;
|
|
}
|
|
|
|
if ((dinahs[who].dest.top <= kBalloonStop) ||
|
|
(dinahs[who].dest.bottom >= kBalloonStart))
|
|
{
|
|
dest = dinahs[who].whole;
|
|
QOffsetRect(&dest, playOriginH, playOriginV);
|
|
AddRectToWorkRects(&dest);
|
|
dest = dinahs[who].dest;
|
|
AddSparkle(&dest);
|
|
PlayPrioritySound(kEnemyOutSound, kEnemyOutPriority);
|
|
dinahs[who].moving = false;
|
|
dinahs[who].vVel = -2;
|
|
dinahs[who].timer = dinahs[who].count;
|
|
dinahs[who].dest.bottom = kBalloonStart;
|
|
dinahs[who].dest.top = dinahs[who].dest.bottom -
|
|
RectTall(&balloonSrc[0]);
|
|
dinahs[who].whole = dinahs[who].dest;
|
|
}
|
|
}
|
|
else // balloon is idle, waiting to appear
|
|
{
|
|
if (dinahs[who].active)
|
|
{
|
|
dinahs[who].timer--;
|
|
if (dinahs[who].timer <= 0)
|
|
{
|
|
dinahs[who].moving = true;
|
|
if (dinahs[who].count < kStartSparkle)
|
|
{
|
|
dest = dinahs[who].dest;
|
|
AddSparkle(&dest);
|
|
PlayPrioritySound(kEnemyInSound, kEnemyInPriority);
|
|
}
|
|
}
|
|
else if (dinahs[who].timer == kStartSparkle)
|
|
{
|
|
dest = dinahs[who].dest;
|
|
AddSparkle(&dest);
|
|
PlayPrioritySound(kEnemyInSound, kEnemyInPriority);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------- HandleCopter
|
|
|
|
void HandleCopter (short who)
|
|
{
|
|
Rect dest;
|
|
|
|
if (dinahs[who].moving) // is 'copter about?
|
|
{
|
|
if (dinahs[who].hVel != 0) // 'copter was not shot
|
|
{
|
|
dinahs[who].frame++;
|
|
if (dinahs[who].frame >= 8)
|
|
dinahs[who].frame = 0;
|
|
if (twoPlayerGame)
|
|
{
|
|
if (onePlayerLeft)
|
|
{
|
|
if (playerDead == theGlider.which)
|
|
CheckDynamicCollision(who, &theGlider2, false);
|
|
else
|
|
CheckDynamicCollision(who, &theGlider, false);
|
|
}
|
|
else
|
|
{
|
|
CheckDynamicCollision(who, &theGlider, false);
|
|
CheckDynamicCollision(who, &theGlider2, false);
|
|
}
|
|
}
|
|
else
|
|
CheckDynamicCollision(who, &theGlider, false);
|
|
if ((numBands > 0) && (DidBandHitDynamic(who)))
|
|
{
|
|
dinahs[who].frame = 8;
|
|
dinahs[who].hVel = 0;
|
|
dinahs[who].vVel = kEnemyDropSpeed;
|
|
PlayPrioritySound(kPaperCrunchSound, kPaperCrunchPriority);
|
|
}
|
|
else
|
|
{
|
|
HOffsetRect(&dinahs[who].dest, dinahs[who].hVel);
|
|
VOffsetRect(&dinahs[who].dest, dinahs[who].vVel);
|
|
dinahs[who].whole = dinahs[who].dest;
|
|
dinahs[who].whole.top -= dinahs[who].vVel;
|
|
if (dinahs[who].hVel < 0)
|
|
dinahs[who].whole.right -= dinahs[who].hVel;
|
|
else
|
|
dinahs[who].whole.left -= dinahs[who].hVel;
|
|
}
|
|
}
|
|
else // 'copter was shot
|
|
{
|
|
dinahs[who].frame++;
|
|
if (dinahs[who].frame >= 10)
|
|
dinahs[who].frame = 8;
|
|
VOffsetRect(&dinahs[who].dest, dinahs[who].vVel);
|
|
dinahs[who].whole = dinahs[who].dest;
|
|
dinahs[who].whole.top -= dinahs[who].vVel;
|
|
}
|
|
|
|
if ((dinahs[who].dest.top <= kCopterStart) ||
|
|
(dinahs[who].dest.bottom >= kCopterStop))
|
|
{
|
|
dest = dinahs[who].whole;
|
|
QOffsetRect(&dest, playOriginH, playOriginV);
|
|
AddRectToWorkRects(&dest);
|
|
dest = dinahs[who].dest;
|
|
AddSparkle(&dest);
|
|
PlayPrioritySound(kEnemyOutSound, kEnemyOutPriority);
|
|
dinahs[who].moving = false;
|
|
dinahs[who].vVel = 2;
|
|
if (dinahs[who].type == kCopterLf)
|
|
dinahs[who].hVel = -1;
|
|
else
|
|
dinahs[who].hVel = 1;
|
|
dinahs[who].timer = dinahs[who].count;
|
|
dinahs[who].dest.top = kCopterStart;
|
|
dinahs[who].dest.bottom = dinahs[who].dest.top +
|
|
RectTall(&copterSrc[0]);
|
|
dinahs[who].dest.left = dinahs[who].position;
|
|
dinahs[who].dest.right = dinahs[who].dest.left + 32;
|
|
dinahs[who].whole = dinahs[who].dest;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (dinahs[who].active)
|
|
{
|
|
dinahs[who].timer--;
|
|
if (dinahs[who].timer <= 0)
|
|
{
|
|
dinahs[who].moving = true;
|
|
if (dinahs[who].count < kStartSparkle)
|
|
{
|
|
dest = dinahs[who].dest;
|
|
AddSparkle(&dest);
|
|
PlayPrioritySound(kEnemyInSound, kEnemyInPriority);
|
|
}
|
|
}
|
|
else if (dinahs[who].timer == kStartSparkle)
|
|
{
|
|
dest = dinahs[who].dest;
|
|
AddSparkle(&dest);
|
|
PlayPrioritySound(kEnemyInSound, kEnemyInPriority);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------- HandleDart
|
|
|
|
void HandleDart (short who)
|
|
{
|
|
Rect dest;
|
|
|
|
if (dinahs[who].moving) // Dart has appeared
|
|
{
|
|
if (dinahs[who].hVel != 0) // meaning it isn't falling
|
|
{
|
|
if (twoPlayerGame)
|
|
{
|
|
if (onePlayerLeft)
|
|
{
|
|
if (playerDead == theGlider.which)
|
|
CheckDynamicCollision(who, &theGlider2, false);
|
|
else
|
|
CheckDynamicCollision(who, &theGlider, false);
|
|
}
|
|
else
|
|
{
|
|
CheckDynamicCollision(who, &theGlider, false);
|
|
CheckDynamicCollision(who, &theGlider2, false);
|
|
}
|
|
}
|
|
else
|
|
CheckDynamicCollision(who, &theGlider, false);
|
|
if ((numBands > 0) && (DidBandHitDynamic(who)))
|
|
{
|
|
if (dinahs[who].type == kDartLf)
|
|
dinahs[who].frame = 1;
|
|
else
|
|
dinahs[who].frame = 3;
|
|
dinahs[who].hVel = 0;
|
|
dinahs[who].vVel = kEnemyDropSpeed;
|
|
PlayPrioritySound(kPaperCrunchSound, kPaperCrunchPriority);
|
|
}
|
|
else
|
|
{
|
|
HOffsetRect(&dinahs[who].dest, dinahs[who].hVel);
|
|
VOffsetRect(&dinahs[who].dest, dinahs[who].vVel);
|
|
dinahs[who].whole = dinahs[who].dest;
|
|
dinahs[who].whole.top -= dinahs[who].vVel;
|
|
if (dinahs[who].hVel < 0)
|
|
dinahs[who].whole.right -= dinahs[who].hVel;
|
|
else
|
|
dinahs[who].whole.left -= dinahs[who].hVel;
|
|
}
|
|
}
|
|
else // dart is falling straight down
|
|
{
|
|
VOffsetRect(&dinahs[who].dest, dinahs[who].vVel);
|
|
dinahs[who].whole = dinahs[who].dest;
|
|
dinahs[who].whole.top -= dinahs[who].vVel;
|
|
}
|
|
|
|
if ((dinahs[who].dest.left <= 0) ||
|
|
(dinahs[who].dest.right >= kRoomWide) ||
|
|
(dinahs[who].dest.bottom >= kDartStop))
|
|
{
|
|
dest = dinahs[who].whole;
|
|
QOffsetRect(&dest, playOriginH, playOriginV);
|
|
AddRectToWorkRects(&dest);
|
|
dest = dinahs[who].dest;
|
|
AddSparkle(&dest);
|
|
PlayPrioritySound(kEnemyOutSound, kEnemyOutPriority);
|
|
dinahs[who].moving = false;
|
|
dinahs[who].vVel = 2;
|
|
if (dinahs[who].type == kDartLf)
|
|
{
|
|
dinahs[who].frame = 0;
|
|
dinahs[who].hVel = -kDartVelocity;
|
|
dinahs[who].dest.right = kRoomWide;
|
|
dinahs[who].dest.left = dinahs[who].dest.right -
|
|
RectWide(&dartSrc[0]);
|
|
}
|
|
else
|
|
{
|
|
dinahs[who].frame = 2;
|
|
dinahs[who].hVel = kDartVelocity;
|
|
dinahs[who].dest.left = 0;
|
|
dinahs[who].dest.right = dinahs[who].dest.left +
|
|
RectWide(&dartSrc[0]);
|
|
}
|
|
dinahs[who].timer = dinahs[who].count;
|
|
dinahs[who].dest.top = dinahs[who].position;
|
|
dinahs[who].dest.bottom = dinahs[who].dest.top +
|
|
RectTall(&dartSrc[0]);
|
|
dinahs[who].whole = dinahs[who].dest;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (dinahs[who].active)
|
|
{
|
|
dinahs[who].timer--;
|
|
if (dinahs[who].timer <= 0)
|
|
{
|
|
dinahs[who].moving = true;
|
|
if (dinahs[who].count < kStartSparkle)
|
|
{
|
|
dest = dinahs[who].dest;
|
|
AddSparkle(&dest);
|
|
PlayPrioritySound(kEnemyInSound, kEnemyInPriority);
|
|
}
|
|
}
|
|
else if (dinahs[who].timer == kStartSparkle)
|
|
{
|
|
dest = dinahs[who].dest;
|
|
AddSparkle(&dest);
|
|
PlayPrioritySound(kEnemyInSound, kEnemyInPriority);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------- HandleBall
|
|
|
|
void HandleBall (short who)
|
|
{
|
|
if (twoPlayerGame)
|
|
{
|
|
if (onePlayerLeft)
|
|
{
|
|
if (playerDead == theGlider.which)
|
|
CheckDynamicCollision(who, &theGlider2, false);
|
|
else
|
|
CheckDynamicCollision(who, &theGlider, false);
|
|
}
|
|
else
|
|
{
|
|
CheckDynamicCollision(who, &theGlider, false);
|
|
CheckDynamicCollision(who, &theGlider2, false);
|
|
}
|
|
}
|
|
else
|
|
CheckDynamicCollision(who, &theGlider, false);
|
|
|
|
if (dinahs[who].moving) // is ball bouncing?
|
|
{
|
|
VOffsetRect(&dinahs[who].dest, dinahs[who].vVel);
|
|
if (dinahs[who].dest.bottom >= dinahs[who].position) // bounce!
|
|
{
|
|
dinahs[who].whole = dinahs[who].dest;
|
|
dinahs[who].whole.top -= dinahs[who].vVel;
|
|
dinahs[who].whole.bottom = dinahs[who].position;
|
|
dinahs[who].dest.bottom = dinahs[who].position;
|
|
dinahs[who].dest.top = dinahs[who].dest.bottom - 32;
|
|
if (dinahs[who].active)
|
|
dinahs[who].vVel = dinahs[who].count;
|
|
else
|
|
{
|
|
dinahs[who].vVel = -((dinahs[who].vVel * 3) / 4);
|
|
if (dinahs[who].vVel == 0)
|
|
dinahs[who].moving = false; // stop bounce
|
|
}
|
|
if (dinahs[who].whole.bottom < dinahs[who].dest.bottom)
|
|
dinahs[who].whole.bottom = dinahs[who].dest.bottom;
|
|
PlayPrioritySound(kBounceSound, kBouncePriority);
|
|
if (dinahs[who].moving)
|
|
dinahs[who].frame = 1;
|
|
}
|
|
else
|
|
{
|
|
dinahs[who].whole = dinahs[who].dest;
|
|
if (dinahs[who].vVel > 0)
|
|
dinahs[who].whole.top -= dinahs[who].vVel;
|
|
else
|
|
dinahs[who].whole.bottom -= dinahs[who].vVel;
|
|
if (evenFrame)
|
|
dinahs[who].vVel++;
|
|
dinahs[who].frame = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (dinahs[who].active)
|
|
{
|
|
dinahs[who].vVel = dinahs[who].count;
|
|
dinahs[who].moving = true;
|
|
evenFrame = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------- HandleDrip
|
|
|
|
void HandleDrip (short who)
|
|
{
|
|
Rect dest;
|
|
|
|
if (dinahs[who].moving)
|
|
{
|
|
if (evenFrame)
|
|
dinahs[who].frame = 9 - dinahs[who].frame;
|
|
if (twoPlayerGame)
|
|
{
|
|
if (onePlayerLeft)
|
|
{
|
|
if (playerDead == theGlider.which)
|
|
CheckDynamicCollision(who, &theGlider2, false);
|
|
else
|
|
CheckDynamicCollision(who, &theGlider, false);
|
|
}
|
|
else
|
|
{
|
|
CheckDynamicCollision(who, &theGlider, false);
|
|
CheckDynamicCollision(who, &theGlider2, false);
|
|
}
|
|
}
|
|
else
|
|
CheckDynamicCollision(who, &theGlider, false);
|
|
|
|
VOffsetRect(&dinahs[who].dest, dinahs[who].vVel);
|
|
if (dinahs[who].dest.bottom >= dinahs[who].position)
|
|
{
|
|
dest = dinahs[who].whole;
|
|
QOffsetRect(&dest, playOriginH, playOriginV);
|
|
AddRectToWorkRects(&dest);
|
|
dinahs[who].dest.top = dinahs[who].hVel;
|
|
dinahs[who].dest.bottom = dinahs[who].dest.top + 12;
|
|
PlayPrioritySound(kDropSound, kDropPriority);
|
|
dinahs[who].vVel = 0;
|
|
dinahs[who].timer = dinahs[who].count;
|
|
dinahs[who].frame = 3;
|
|
dinahs[who].moving = false;
|
|
}
|
|
else
|
|
{
|
|
dinahs[who].whole = dinahs[who].dest;
|
|
dinahs[who].whole.top -= dinahs[who].vVel;
|
|
if (evenFrame)
|
|
dinahs[who].vVel++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (dinahs[who].active)
|
|
{
|
|
dinahs[who].timer--;
|
|
|
|
if (dinahs[who].timer == 6)
|
|
dinahs[who].frame = 0;
|
|
else if (dinahs[who].timer == 4)
|
|
dinahs[who].frame = 1;
|
|
else if (dinahs[who].timer == 2)
|
|
dinahs[who].frame = 2;
|
|
else if (dinahs[who].timer <= 0)
|
|
{
|
|
VOffsetRect(&dinahs[who].dest, 3);
|
|
dinahs[who].whole = dinahs[who].dest;
|
|
dinahs[who].moving = true;
|
|
dinahs[who].frame = 4;
|
|
PlayPrioritySound(kDripSound, kDripPriority);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------- HandleFish
|
|
|
|
void HandleFish (short who)
|
|
{
|
|
Rect dest;
|
|
|
|
if (dinahs[who].moving) // fish leaping
|
|
{
|
|
if ((dinahs[who].vVel >= 0) && (dinahs[who].frame < 7))
|
|
dinahs[who].frame++;
|
|
if (twoPlayerGame)
|
|
{
|
|
if (onePlayerLeft)
|
|
{
|
|
if (playerDead == theGlider.which)
|
|
CheckDynamicCollision(who, &theGlider2, false);
|
|
else
|
|
CheckDynamicCollision(who, &theGlider, false);
|
|
}
|
|
else
|
|
{
|
|
CheckDynamicCollision(who, &theGlider, false);
|
|
CheckDynamicCollision(who, &theGlider2, false);
|
|
}
|
|
}
|
|
else
|
|
CheckDynamicCollision(who, &theGlider, false);
|
|
|
|
VOffsetRect(&dinahs[who].dest, dinahs[who].vVel);
|
|
if (dinahs[who].dest.bottom >= dinahs[who].position) // splash down
|
|
{
|
|
dest = dinahs[who].whole;
|
|
QOffsetRect(&dest, playOriginH, playOriginV);
|
|
AddRectToWorkRects(&dest);
|
|
dinahs[who].dest.bottom = dinahs[who].position;
|
|
dinahs[who].dest.top = dinahs[who].dest.bottom - 16;
|
|
dinahs[who].whole = dinahs[who].dest;
|
|
dinahs[who].whole.top -= 2;
|
|
PlayPrioritySound(kDropSound, kDropPriority);
|
|
dinahs[who].vVel = dinahs[who].count;
|
|
dinahs[who].timer = dinahs[who].hVel;
|
|
dinahs[who].frame = 0;
|
|
dinahs[who].moving = false;
|
|
PlayPrioritySound(kFishInSound, kFishInPriority);
|
|
}
|
|
else
|
|
{
|
|
dinahs[who].whole = dinahs[who].dest;
|
|
if (dinahs[who].vVel > 0)
|
|
dinahs[who].whole.top -= dinahs[who].vVel;
|
|
else
|
|
dinahs[who].whole.bottom -= dinahs[who].vVel;
|
|
if (evenFrame)
|
|
dinahs[who].vVel++;
|
|
}
|
|
}
|
|
else // fish idle
|
|
{
|
|
dinahs[who].whole = dinahs[who].dest;
|
|
if ((dinahs[who].timer & 0x0003) == 0x0003)
|
|
{
|
|
dinahs[who].frame++;
|
|
if (dinahs[who].frame > 3)
|
|
dinahs[who].frame = 0;
|
|
if ((dinahs[who].frame == 1) || (dinahs[who].frame == 2))
|
|
{
|
|
dinahs[who].dest.top++;
|
|
dinahs[who].dest.bottom++;
|
|
dinahs[who].whole.bottom++;
|
|
}
|
|
else
|
|
{
|
|
dinahs[who].dest.top--;
|
|
dinahs[who].dest.bottom--;
|
|
dinahs[who].whole.top--;
|
|
}
|
|
}
|
|
if (dinahs[who].active)
|
|
{
|
|
dinahs[who].timer--;
|
|
if (dinahs[who].timer <= 0) // fish leaps
|
|
{
|
|
dinahs[who].whole = dinahs[who].dest;
|
|
dinahs[who].moving = true;
|
|
dinahs[who].frame = 4;
|
|
PlayPrioritySound(kFishOutSound, kFishOutPriority);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|