mirror of
https://github.com/softdorothy/GliderPRO.git
synced 2024-11-22 20:31:19 +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
15 KiB
C
Executable File
1 line
15 KiB
C
Executable File
|
|
//============================================================================
|
|
//----------------------------------------------------------------------------
|
|
// Dynamics3.c
|
|
//----------------------------------------------------------------------------
|
|
//============================================================================
|
|
|
|
|
|
#include "Externs.h"
|
|
#include "RectUtils.h"
|
|
|
|
|
|
#define kBalloonStart 310
|
|
#define kCopterStart 8
|
|
#define kDartVelocity 6
|
|
|
|
|
|
dynaPtr dinahs;
|
|
short numDynamics;
|
|
|
|
extern Rect breadSrc[];
|
|
extern short numLights;
|
|
extern Boolean evenFrame;
|
|
|
|
|
|
//============================================================== Functions
|
|
//-------------------------------------------------------------- HandleDynamics
|
|
|
|
// This is the master function that calls all the specific handlers above.
|
|
|
|
void HandleDynamics (void)
|
|
{
|
|
short i;
|
|
|
|
for (i = 0; i < numDynamics; i++)
|
|
{
|
|
switch (dinahs[i].type)
|
|
{
|
|
case kSparkle:
|
|
HandleSparkleObject(i);
|
|
break;
|
|
|
|
case kToaster:
|
|
HandleToast(i);
|
|
break;
|
|
|
|
case kMacPlus:
|
|
HandleMacPlus(i);
|
|
break;
|
|
|
|
case kTV:
|
|
HandleTV(i);
|
|
break;
|
|
|
|
case kCoffee:
|
|
HandleCoffee(i);
|
|
break;
|
|
|
|
case kOutlet:
|
|
HandleOutlet(i);
|
|
break;
|
|
|
|
case kVCR:
|
|
HandleVCR(i);
|
|
break;
|
|
|
|
case kStereo:
|
|
HandleStereo(i);
|
|
break;
|
|
|
|
case kMicrowave:
|
|
HandleMicrowave(i);
|
|
break;
|
|
|
|
case kBalloon:
|
|
HandleBalloon(i);
|
|
break;
|
|
|
|
case kCopterLf:
|
|
case kCopterRt:
|
|
HandleCopter(i);
|
|
break;
|
|
|
|
case kDartLf:
|
|
case kDartRt:
|
|
HandleDart(i);
|
|
break;
|
|
|
|
case kBall:
|
|
HandleBall(i);
|
|
break;
|
|
|
|
case kDrip:
|
|
HandleDrip(i);
|
|
break;
|
|
|
|
case kFish:
|
|
HandleFish(i);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------- HandleDynamics
|
|
|
|
// This is the master function that calls all the various rendering handlersÉ
|
|
// above.
|
|
|
|
void RenderDynamics (void)
|
|
{
|
|
short i;
|
|
|
|
for (i = 0; i < numDynamics; i++)
|
|
{
|
|
switch (dinahs[i].type)
|
|
{
|
|
case kToaster:
|
|
RenderToast(i);
|
|
break;
|
|
|
|
case kBalloon:
|
|
RenderBalloon(i);
|
|
break;
|
|
|
|
case kCopterLf:
|
|
case kCopterRt:
|
|
RenderCopter(i);
|
|
break;
|
|
|
|
case kDartLf:
|
|
case kDartRt:
|
|
RenderDart(i);
|
|
break;
|
|
|
|
case kBall:
|
|
RenderBall(i);
|
|
break;
|
|
|
|
case kDrip:
|
|
RenderDrip(i);
|
|
break;
|
|
|
|
case kFish:
|
|
RenderFish(i);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------- ZeroDinahs
|
|
|
|
// This clears all dynamics - zeros them all out. Used to initialize them.
|
|
|
|
void ZeroDinahs (void)
|
|
{
|
|
short i;
|
|
|
|
for (i = 0; i < kMaxDynamicObs; i++)
|
|
{
|
|
dinahs[i].type = kObjectIsEmpty;
|
|
QSetRect(&dinahs[i].dest, 0, 0, 0, 0);
|
|
QSetRect(&dinahs[i].whole, 0, 0, 0, 0);
|
|
dinahs[i].hVel = 0;
|
|
dinahs[i].vVel = 0;
|
|
dinahs[i].count = 0;
|
|
dinahs[i].frame = 0;
|
|
dinahs[i].timer = 0;
|
|
dinahs[i].position = 0;
|
|
dinahs[i].room = 0;
|
|
dinahs[i].byte0 = 0;
|
|
dinahs[i].active = false;
|
|
}
|
|
numDynamics = 0;
|
|
}
|
|
|
|
//-------------------------------------------------------------- AddDynamicObject
|
|
|
|
// When a room is being drawn, various dynamic objects are pointed here.
|
|
// This function sets up the structures to handle them.
|
|
|
|
short AddDynamicObject (short what, Rect *where, objectType *who,
|
|
short room, short index, Boolean isOn)
|
|
{
|
|
short position, velocity;
|
|
Boolean lilFrame;
|
|
|
|
if (numDynamics >= kMaxDynamicObs)
|
|
return (-1);
|
|
|
|
dinahs[numDynamics].type = what;
|
|
switch (what)
|
|
{
|
|
case kSparkle:
|
|
dinahs[numDynamics].dest = sparkleSrc[0];
|
|
ZeroRectCorner(&dinahs[numDynamics].dest);
|
|
QOffsetRect(&dinahs[numDynamics].dest, where->left, where->top);
|
|
dinahs[numDynamics].whole = dinahs[numDynamics].dest;
|
|
dinahs[numDynamics].hVel = 0;
|
|
dinahs[numDynamics].vVel = 0;
|
|
dinahs[numDynamics].count = 0;
|
|
dinahs[numDynamics].frame = 0;
|
|
dinahs[numDynamics].timer = RandomInt(60) + 15;
|
|
dinahs[numDynamics].position = 0;
|
|
dinahs[numDynamics].room = room;
|
|
dinahs[numDynamics].byte0 = (Byte)index;
|
|
dinahs[numDynamics].byte1 = 0;
|
|
dinahs[numDynamics].moving = false;
|
|
dinahs[numDynamics].active = isOn;
|
|
break;
|
|
|
|
case kToaster:
|
|
dinahs[numDynamics].dest = breadSrc[0];
|
|
CenterRectInRect(&dinahs[numDynamics].dest, where);
|
|
VOffsetRect(&dinahs[numDynamics].dest,
|
|
where->top - dinahs[numDynamics].dest.top);
|
|
dinahs[numDynamics].whole = dinahs[numDynamics].dest;
|
|
dinahs[numDynamics].hVel = where->top + 2; // hVel used as clip
|
|
position = who->data.g.height; // reverse engineer init. vel.
|
|
velocity = 0;
|
|
do
|
|
{
|
|
velocity++;
|
|
position -= velocity;
|
|
}
|
|
while (position > 0);
|
|
dinahs[numDynamics].vVel = -velocity;
|
|
dinahs[numDynamics].count = velocity; // count = initial velocity
|
|
dinahs[numDynamics].frame = (short)who->data.g.delay * 3;
|
|
dinahs[numDynamics].timer = dinahs[numDynamics].frame;
|
|
dinahs[numDynamics].position = 0; // launch/idle state
|
|
dinahs[numDynamics].room = room;
|
|
dinahs[numDynamics].byte0 = (Byte)index;
|
|
dinahs[numDynamics].byte1 = 0;
|
|
dinahs[numDynamics].moving = false;
|
|
dinahs[numDynamics].active = isOn;
|
|
break;
|
|
|
|
case kMacPlus:
|
|
dinahs[numDynamics].dest = plusScreen1;
|
|
ZeroRectCorner(&dinahs[numDynamics].dest);
|
|
QOffsetRect(&dinahs[numDynamics].dest,
|
|
where->left + playOriginH + 10,
|
|
where->top + playOriginV + 7);
|
|
dinahs[numDynamics].whole = dinahs[numDynamics].dest;
|
|
dinahs[numDynamics].hVel = 0;
|
|
dinahs[numDynamics].vVel = 0;
|
|
dinahs[numDynamics].count = 0;
|
|
dinahs[numDynamics].frame = 0;
|
|
dinahs[numDynamics].timer = 0;
|
|
dinahs[numDynamics].position = 0;
|
|
dinahs[numDynamics].room = room;
|
|
dinahs[numDynamics].byte0 = (Byte)index;
|
|
dinahs[numDynamics].byte1 = 0;
|
|
dinahs[numDynamics].moving = false;
|
|
dinahs[numDynamics].active = isOn;
|
|
break;
|
|
|
|
case kTV:
|
|
dinahs[numDynamics].dest = tvScreen1;
|
|
ZeroRectCorner(&dinahs[numDynamics].dest);
|
|
QOffsetRect(&dinahs[numDynamics].dest,
|
|
where->left + playOriginH + 17,
|
|
where->top + playOriginV + 10);
|
|
dinahs[numDynamics].whole = dinahs[numDynamics].dest;
|
|
dinahs[numDynamics].hVel = 0;
|
|
dinahs[numDynamics].vVel = 0;
|
|
dinahs[numDynamics].count = 0;
|
|
dinahs[numDynamics].frame = 0;
|
|
dinahs[numDynamics].timer = 0;
|
|
dinahs[numDynamics].position = 0;
|
|
dinahs[numDynamics].room = room;
|
|
dinahs[numDynamics].byte0 = (Byte)index;
|
|
dinahs[numDynamics].byte1 = 0;
|
|
dinahs[numDynamics].moving = false;
|
|
dinahs[numDynamics].active = isOn;
|
|
break;
|
|
|
|
case kCoffee:
|
|
dinahs[numDynamics].dest = coffeeLight1;
|
|
ZeroRectCorner(&dinahs[numDynamics].dest);
|
|
QOffsetRect(&dinahs[numDynamics].dest,
|
|
where->left + playOriginH + 32,
|
|
where->top + playOriginV + 57);
|
|
dinahs[numDynamics].whole = dinahs[numDynamics].dest;
|
|
dinahs[numDynamics].hVel = 0;
|
|
dinahs[numDynamics].vVel = 0;
|
|
dinahs[numDynamics].count = 0;
|
|
dinahs[numDynamics].frame = 0;
|
|
if (isOn)
|
|
dinahs[numDynamics].timer = 200;
|
|
else
|
|
dinahs[numDynamics].timer = 0;
|
|
dinahs[numDynamics].position = 0;
|
|
dinahs[numDynamics].room = room;
|
|
dinahs[numDynamics].byte0 = (Byte)index;
|
|
dinahs[numDynamics].byte1 = 0;
|
|
dinahs[numDynamics].moving = false;
|
|
dinahs[numDynamics].active = isOn;
|
|
break;
|
|
|
|
case kOutlet:
|
|
dinahs[numDynamics].dest = outletSrc[0];
|
|
ZeroRectCorner(&dinahs[numDynamics].dest);
|
|
QOffsetRect(&dinahs[numDynamics].dest,
|
|
where->left + playOriginH,
|
|
where->top + playOriginV);
|
|
dinahs[numDynamics].whole = dinahs[numDynamics].dest;
|
|
dinahs[numDynamics].hVel = numLights;
|
|
dinahs[numDynamics].vVel = 0;
|
|
dinahs[numDynamics].count = ((short)who->data.g.delay * 6) / kTicksPerFrame;
|
|
dinahs[numDynamics].frame = 0;
|
|
dinahs[numDynamics].timer = dinahs[numDynamics].count;
|
|
dinahs[numDynamics].position = 0; // launch/idle state
|
|
dinahs[numDynamics].room = room;
|
|
dinahs[numDynamics].byte0 = (Byte)index;
|
|
dinahs[numDynamics].byte1 = 0;
|
|
dinahs[numDynamics].moving = false;
|
|
dinahs[numDynamics].active = isOn;
|
|
break;
|
|
|
|
case kVCR:
|
|
dinahs[numDynamics].dest = vcrTime1;
|
|
ZeroRectCorner(&dinahs[numDynamics].dest);
|
|
QOffsetRect(&dinahs[numDynamics].dest,
|
|
where->left + playOriginH + 64,
|
|
where->top + playOriginV + 6);
|
|
dinahs[numDynamics].whole = dinahs[numDynamics].dest;
|
|
dinahs[numDynamics].hVel = 0;
|
|
dinahs[numDynamics].vVel = 0;
|
|
dinahs[numDynamics].count = 0;
|
|
dinahs[numDynamics].frame = 0;
|
|
if (isOn)
|
|
dinahs[numDynamics].timer = 115;
|
|
else
|
|
dinahs[numDynamics].timer = 0;
|
|
dinahs[numDynamics].position = 0;
|
|
dinahs[numDynamics].room = room;
|
|
dinahs[numDynamics].byte0 = (Byte)index;
|
|
dinahs[numDynamics].byte1 = 0;
|
|
dinahs[numDynamics].moving = false;
|
|
dinahs[numDynamics].active = isOn;
|
|
break;
|
|
|
|
case kStereo:
|
|
dinahs[numDynamics].dest = stereoLight1;
|
|
ZeroRectCorner(&dinahs[numDynamics].dest);
|
|
QOffsetRect(&dinahs[numDynamics].dest,
|
|
where->left + playOriginH + 56,
|
|
where->top + playOriginV + 20);
|
|
dinahs[numDynamics].whole = dinahs[numDynamics].dest;
|
|
dinahs[numDynamics].hVel = 0;
|
|
dinahs[numDynamics].vVel = 0;
|
|
dinahs[numDynamics].count = 0;
|
|
dinahs[numDynamics].frame = 0;
|
|
dinahs[numDynamics].timer = 0;
|
|
dinahs[numDynamics].position = 0;
|
|
dinahs[numDynamics].room = room;
|
|
dinahs[numDynamics].byte0 = (Byte)index;
|
|
dinahs[numDynamics].byte1 = 0;
|
|
dinahs[numDynamics].moving = false;
|
|
dinahs[numDynamics].active = isOn;
|
|
break;
|
|
|
|
case kMicrowave:
|
|
dinahs[numDynamics].dest = microOn;
|
|
ZeroRectCorner(&dinahs[numDynamics].dest);
|
|
QOffsetRect(&dinahs[numDynamics].dest,
|
|
where->left + playOriginH + 14,
|
|
where->top + playOriginV + 13);
|
|
dinahs[numDynamics].dest.right = dinahs[numDynamics].dest.left + 48;
|
|
dinahs[numDynamics].whole = dinahs[numDynamics].dest;
|
|
dinahs[numDynamics].hVel = 0;
|
|
dinahs[numDynamics].vVel = 0;
|
|
dinahs[numDynamics].count = 0;
|
|
dinahs[numDynamics].frame = 0;
|
|
dinahs[numDynamics].timer = 0;
|
|
dinahs[numDynamics].position = 0;
|
|
dinahs[numDynamics].room = room;
|
|
dinahs[numDynamics].byte0 = (Byte)index;
|
|
dinahs[numDynamics].byte1 = 0;
|
|
dinahs[numDynamics].moving = false;
|
|
dinahs[numDynamics].active = isOn;
|
|
break;
|
|
|
|
case kBalloon:
|
|
dinahs[numDynamics].dest = balloonSrc[0];
|
|
ZeroRectCorner(&dinahs[numDynamics].dest);
|
|
QOffsetRect(&dinahs[numDynamics].dest, where->left, 0);
|
|
dinahs[numDynamics].dest.bottom = kBalloonStart;
|
|
dinahs[numDynamics].dest.top = dinahs[numDynamics].dest.bottom -
|
|
RectTall(&balloonSrc[0]);
|
|
dinahs[numDynamics].whole = dinahs[numDynamics].dest;
|
|
dinahs[numDynamics].hVel = 0;
|
|
dinahs[numDynamics].vVel = -2;
|
|
dinahs[numDynamics].count = ((short)who->data.h.delay * 6) / kTicksPerFrame;
|
|
dinahs[numDynamics].frame = 0;
|
|
dinahs[numDynamics].timer = dinahs[numDynamics].count;
|
|
dinahs[numDynamics].position = 0;
|
|
dinahs[numDynamics].room = room;
|
|
dinahs[numDynamics].byte0 = (Byte)index;
|
|
dinahs[numDynamics].byte1 = 0;
|
|
dinahs[numDynamics].moving = false;
|
|
dinahs[numDynamics].active = isOn; // initially idle
|
|
break;
|
|
|
|
case kCopterLf:
|
|
case kCopterRt:
|
|
dinahs[numDynamics].dest = copterSrc[0];
|
|
ZeroRectCorner(&dinahs[numDynamics].dest);
|
|
QOffsetRect(&dinahs[numDynamics].dest, where->left, 0);
|
|
dinahs[numDynamics].dest.top = kCopterStart;
|
|
dinahs[numDynamics].dest.bottom = dinahs[numDynamics].dest.top +
|
|
RectTall(&copterSrc[0]);
|
|
dinahs[numDynamics].whole = dinahs[numDynamics].dest;
|
|
if (what == kCopterLf)
|
|
dinahs[numDynamics].hVel = -1;
|
|
else
|
|
dinahs[numDynamics].hVel = 1;
|
|
dinahs[numDynamics].vVel = 2;
|
|
dinahs[numDynamics].count = ((short)who->data.h.delay * 6) / kTicksPerFrame;
|
|
dinahs[numDynamics].frame = 0;
|
|
dinahs[numDynamics].timer = dinahs[numDynamics].count;
|
|
dinahs[numDynamics].position = dinahs[numDynamics].dest.left;
|
|
dinahs[numDynamics].room = room;
|
|
dinahs[numDynamics].byte0 = (Byte)index;
|
|
dinahs[numDynamics].byte1 = 0;
|
|
dinahs[numDynamics].moving = false;
|
|
dinahs[numDynamics].active = isOn; // initially idle
|
|
break;
|
|
|
|
case kDartLf:
|
|
case kDartRt:
|
|
dinahs[numDynamics].dest = dartSrc[0];
|
|
ZeroRectCorner(&dinahs[numDynamics].dest);
|
|
if (what == kDartLf)
|
|
{
|
|
QOffsetRect(&dinahs[numDynamics].dest,
|
|
kRoomWide - RectWide(&dartSrc[0]), where->top);
|
|
dinahs[numDynamics].hVel = -kDartVelocity;
|
|
dinahs[numDynamics].frame = 0;
|
|
}
|
|
else
|
|
{
|
|
QOffsetRect(&dinahs[numDynamics].dest, 0, where->top);
|
|
dinahs[numDynamics].hVel = kDartVelocity;
|
|
dinahs[numDynamics].frame = 2;
|
|
}
|
|
dinahs[numDynamics].whole = dinahs[numDynamics].dest;
|
|
dinahs[numDynamics].vVel = 2;
|
|
dinahs[numDynamics].count = ((short)who->data.h.delay * 6) / kTicksPerFrame;
|
|
dinahs[numDynamics].timer = dinahs[numDynamics].count;
|
|
dinahs[numDynamics].position = dinahs[numDynamics].dest.top;
|
|
dinahs[numDynamics].byte0 = (Byte)index;
|
|
dinahs[numDynamics].byte1 = 0;
|
|
dinahs[numDynamics].moving = false;
|
|
dinahs[numDynamics].active = isOn; // initially idle
|
|
break;
|
|
|
|
case kBall:
|
|
dinahs[numDynamics].dest = ballSrc[0];
|
|
ZeroRectCorner(&dinahs[numDynamics].dest);
|
|
QOffsetRect(&dinahs[numDynamics].dest,
|
|
where->left, where->top);
|
|
dinahs[numDynamics].whole = dinahs[numDynamics].dest;
|
|
dinahs[numDynamics].hVel = 0;
|
|
position = who->data.h.length; // reverse engineer init. vel.
|
|
velocity = 0;
|
|
evenFrame = true;
|
|
lilFrame = true;
|
|
do
|
|
{
|
|
if (lilFrame)
|
|
velocity++;
|
|
lilFrame = !lilFrame;
|
|
position -= velocity;
|
|
}
|
|
while (position > 0);
|
|
dinahs[numDynamics].vVel = -velocity;
|
|
dinahs[numDynamics].moving = false;
|
|
dinahs[numDynamics].count = -velocity; // count = initial velocity
|
|
dinahs[numDynamics].frame = 0;
|
|
dinahs[numDynamics].timer = 0;
|
|
dinahs[numDynamics].position = dinahs[numDynamics].dest.bottom;
|
|
dinahs[numDynamics].room = room;
|
|
dinahs[numDynamics].byte0 = (Byte)index;
|
|
dinahs[numDynamics].byte1 = 0;
|
|
dinahs[numDynamics].active = isOn;
|
|
break;
|
|
|
|
case kDrip:
|
|
dinahs[numDynamics].dest = dripSrc[0];
|
|
CenterRectInRect(&dinahs[numDynamics].dest, where);
|
|
VOffsetRect(&dinahs[numDynamics].dest,
|
|
where->top - dinahs[numDynamics].dest.top);
|
|
dinahs[numDynamics].whole = dinahs[numDynamics].dest;
|
|
dinahs[numDynamics].hVel = dinahs[numDynamics].dest.top; // remember
|
|
dinahs[numDynamics].vVel = 0;
|
|
dinahs[numDynamics].count = ((short)who->data.h.delay * 6) / kTicksPerFrame;
|
|
dinahs[numDynamics].frame = 3;
|
|
dinahs[numDynamics].timer = dinahs[numDynamics].count;
|
|
dinahs[numDynamics].position = dinahs[numDynamics].dest.top +
|
|
who->data.h.length;
|
|
dinahs[numDynamics].room = room;
|
|
dinahs[numDynamics].byte0 = (Byte)index;
|
|
dinahs[numDynamics].byte1 = 0;
|
|
dinahs[numDynamics].moving = false;
|
|
dinahs[numDynamics].active = isOn;
|
|
break;
|
|
|
|
case kFish:
|
|
dinahs[numDynamics].dest = fishSrc[0];
|
|
QOffsetRect(&dinahs[numDynamics].dest,
|
|
where->left + 10, where->top + 8);
|
|
dinahs[numDynamics].whole = dinahs[numDynamics].dest;
|
|
dinahs[numDynamics].hVel = ((short)who->data.h.delay * 6) / kTicksPerFrame;
|
|
position = who->data.g.height; // reverse engineer init. vel.
|
|
velocity = 0;
|
|
evenFrame = true;
|
|
lilFrame = true;
|
|
do
|
|
{
|
|
if (lilFrame)
|
|
velocity++;
|
|
lilFrame = !lilFrame;
|
|
position -= velocity;
|
|
}
|
|
while (position > 0);
|
|
dinahs[numDynamics].vVel = -velocity;
|
|
dinahs[numDynamics].count = -velocity; // count = initial velocity
|
|
dinahs[numDynamics].frame = 0;
|
|
dinahs[numDynamics].timer = dinahs[numDynamics].hVel;
|
|
dinahs[numDynamics].position = dinahs[numDynamics].dest.bottom;
|
|
dinahs[numDynamics].room = room;
|
|
dinahs[numDynamics].byte0 = (Byte)index;
|
|
dinahs[numDynamics].byte1 = 0;
|
|
dinahs[numDynamics].moving = false;
|
|
dinahs[numDynamics].active = isOn;
|
|
break;
|
|
|
|
default:
|
|
return (-1);
|
|
break;
|
|
}
|
|
|
|
numDynamics++;
|
|
|
|
return (numDynamics - 1);
|
|
}
|
|
|