home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-04-30 | 29.5 KB | 987 lines | [TEXT/SPM ] |
- // SpriteStausChex.c by Stefan C. Sinclair Copyright © 1995-1996 All Rights Reserved.
-
- #include "StefSpritez.h"
- #include "SpriteCicnNumbers.h"
- #include "SpriteError.h"
- #include "SpriteFile.h"
- #include "SpriteSecretCodes.h"
-
- #define keyP1Right keyCommand
- #define keyP1Left keyControl
- #define keyP1Jump keyShift
- #define keyP1Punch keyC
- #define keyP1Kick keyV
- #define keyP1JumpAttack keySpace
- #define keyP1Block keyTab
- #define keyP1Duck keyOption
- #define keyP1Uppercut keyB
- #define keyP1Taunt keyN
- #define keyP1Shoot keyS
-
- #define keyP2Right keyRArrow
- #define keyP2Left keyLArrow
- #define keyP2Jump keyUpArrow
- #define keyP2Punch keyNum1
- #define keyP2Kick keyNum2
- #define keyP2JumpAttack keyNum3
- #define keyP2Block keyNum0
- #define keyP2Duck keyDownArrow
- #define keyP2Uppercut keyNum4
- #define keyP2Taunt keyNum5
- #define keyP2Shoot keyNum6
-
- #define bRunLeft spriteAction[0]
- #define bRunRight spriteAction[1]
- #define bPunch spriteAction[2]
- #define bKick spriteAction[3]
- #define bJump spriteAction[4]
- #define bBlock spriteAction[5]
- #define bJumpAttack spriteAction[6]
- #define bJumpPunch spriteAction[7]
- #define bJumpKick spriteAction[8]
- #define bDuck spriteAction[9]
- #define bUppercut spriteAction[10]
- #define bTaunt spriteAction[11]
- #define bShoot spriteAction[12]
- #define kNumActions 13
-
- #define FRAME_UPDATE SpriteFrameUpdate(srcSpriteP, spriteDataPtr,\
- rightSideAdjustFrames, forceFrameUpdate)
-
- extern SpriteGameRec spriteGame;
- extern SpriteFileRec gPlayer1File, gPlayer2File;
- extern Handle gP1SoundH[kNumSpriteSounds], gP2SoundH[kNumSpriteSounds];
- extern SndChannelPtr gSoundChanP1, gSoundChanP2, gSoundChanGame;
- extern short gWinnerSprite;
- extern short gFrameAdvanceTime;
- extern short gSpriteHeight, gSpriteWidth;
- extern Boolean gSecretCode[kNumSecretCodes];
-
- Point player1TopLeft, projectile1TopLeft;
- Point player2TopLeft, projectile2TopLeft;
-
- /* PlayerStatusCheck */
- /* double = 8 bytes ; char = 1 byte ; => 1 double == 8 chars
- Use srcSpriteP->userData (change from long to double!!!) to store 8 chars, which will
- hold all the necessary information. */
- Boolean PlayerStatusCheck(SpritePtr srcSpriteP, Point *spritePoint)
- {
- Boolean spriteAction[kNumActions] = {0};
- Boolean airBorne, forceFrameUpdate = FALSE;
- Boolean rightSide, oldSide;
- unsigned char *spriteDataPtr; // use as an array of 8 u. chars.
- short rightSideAdjustFrames;
-
- spriteDataPtr = (unsigned char *)&srcSpriteP->userData;
- // is sprite airborne?
- airBorne = ((spritePoint->v >= (srcSpriteP->moveBoundsRect.bottom - kGroundLevel)) ? FALSE : TRUE);
-
- // Which side was sprite on?
- if(rightSide = BitTst(&spriteDataPtr[kSpriteBitData], kCurrentSide))
- // Set previous side
- {
- oldSide = kRightSide;
- BitSet(&spriteDataPtr[kSpriteBitData], kPreviousSide);
- }
- else
- {
- oldSide = kLeftSide;
- BitClr(&spriteDataPtr[kSpriteBitData], kPreviousSide);
- }
- // Now update this data
- if(rightSide = GetSpriteSide(spriteDataPtr))
- {
- BitSet(&spriteDataPtr[kSpriteBitData], kCurrentSide);
- rightSideAdjustFrames = kTotalFramesOneWay;
- }
- else
- {
- BitClr(&spriteDataPtr[kSpriteBitData], kCurrentSide);
- rightSideAdjustFrames = 0;
- }
-
- // force a frame update if necessary
- if((oldSide != rightSide) && !airBorne)
- {
- SpriteFrameUpdate(srcSpriteP, spriteDataPtr, rightSideAdjustFrames, TRUE);
- }
- // If the other guy is dying, leave now.
- if(spriteDataPtr[kCurrentAction] == aDoNothing)
- return TRUE;
- // First check for special actions being performed
- // Should sprite be dying? If so, start dying
- if(spriteDataPtr[kSpriteLife] <= kSpriteMinLife &&
- spriteDataPtr[kCurrentAction] != aDying)
- {
- short deathMode = aDying; // deathMode is aDying by default for now.
-
- DigSpriteGrave(spriteDataPtr[kSpriteIDNum], deathMode);
- spriteDataPtr[kCurrentAction] = aDying;
- // switch(spriteDataPtr[kCurrentAction]) // switch depending on death mode...
- spriteDataPtr[kCurrentFrame] = kMaxDeathFrames;
- rightSideAdjustFrames = (rightSideAdjustFrames == kTotalFramesOneWay ?
- kMaxDeathFrames : 0);
- forceFrameUpdate = TRUE;
- FRAME_UPDATE;
- switch(spriteDataPtr[kSpriteIDNum])
- {
- unsigned char *otherSpriteDataPtr; // make every other sprite 'idle'
-
- case kPlayer1Sprite:
- case kComputer1Sprite:
- PlaySound(gP1SoundH[sDead], gSoundChanP1);
- otherSpriteDataPtr = (unsigned char *)&spriteGame.spriteArray[kPlayer2Sprite].userData;
- otherSpriteDataPtr[kCurrentAction] = aDoNothing;
- otherSpriteDataPtr = (unsigned char *)&spriteGame.spriteArray[kPlayer1ProjectileSprite].userData;
- otherSpriteDataPtr[kCurrentAction] = aDoNothing;
- otherSpriteDataPtr = (unsigned char *)&spriteGame.spriteArray[kPlayer2ProjectileSprite].userData;
- otherSpriteDataPtr[kCurrentAction] = aDoNothing;
- break;
- case kPlayer2Sprite:
- case kComputer2Sprite:
- PlaySound(gP2SoundH[sDead], gSoundChanP2);
- otherSpriteDataPtr = (unsigned char *)&spriteGame.spriteArray[kPlayer1Sprite].userData;
- otherSpriteDataPtr[kCurrentAction] = aDoNothing;
- otherSpriteDataPtr = (unsigned char *)&spriteGame.spriteArray[kPlayer1ProjectileSprite].userData;
- otherSpriteDataPtr[kCurrentAction] = aDoNothing;
- otherSpriteDataPtr = (unsigned char *)&spriteGame.spriteArray[kPlayer2ProjectileSprite].userData;
- otherSpriteDataPtr[kCurrentAction] = aDoNothing;
- break;
- }
- return TRUE; // not alive anymore, but not finished dying yet
- }
-
- if(spriteDataPtr[kCurrentAction] == aDying || spriteDataPtr[kPreviousAction] == aDying) // Dead or dying.
- {
- spriteDataPtr[kCurrentAction] = aDying; // Make no mistake about it!
- spriteDataPtr[kPreviousAction] = aDying; // This dude will DIE!
- spriteDataPtr[kCurrentFrame] -= 1;
- rightSideAdjustFrames = (rightSideAdjustFrames == kTotalFramesOneWay ?
- kMaxDeathFrames : 0);
- FRAME_UPDATE;
- if(spriteDataPtr[kCurrentFrame] <= 1) // 1, NOT 0 - trust me; it works
- {
- switch(spriteDataPtr[kSpriteIDNum])
- {
- case kPlayer1Sprite:
- case kComputer1Sprite:
- gWinnerSprite = kPlayer2Sprite;
- break;
- case kPlayer2Sprite:
- case kComputer2Sprite:
- gWinnerSprite = kPlayer1Sprite;
- break;
- default:
- DoError(kUnknownSpriteInGame, FALSE);
- gWinnerSprite = kPlayer1Sprite;
- break;
- }
- return FALSE; // He's dead, Jim.
- }
- else
- return TRUE; // Alive, but in the process of dying
- }
-
- // Sprite getting hit?
- if(spriteDataPtr[kCurrentAction] == aGotHit &&
- spriteDataPtr[kPreviousAction] != aGotHit)
- {
- // Need to keep wobbling around in a painful stupor for 1 more frame!
- spriteDataPtr[kPreviousAction] = spriteDataPtr[kCurrentAction];
- forceFrameUpdate = TRUE;
- FRAME_UPDATE;
- return TRUE;
- }
- // This is next time!
- else if(spriteDataPtr[kCurrentAction] == aGotHit &&
- spriteDataPtr[kPreviousAction] == aGotHit)
- {
- // Need to stop wobbling around in a painful stupor!
- FRAME_UPDATE;
- spriteDataPtr[kPreviousAction] = spriteDataPtr[kCurrentAction];
- // Don't return, otherwise sprite will never have chance to block!
- }
-
- // Sprite just hit the other guy?
- if(spriteDataPtr[kCurrentAction] == aPostAttack)
- {
- spriteDataPtr[kPreviousAction] = spriteDataPtr[kCurrentAction];
- spriteDataPtr[kCurrentAction] = aIdle;
- //forceFrameUpdate = TRUE; // comment out to allow the sprite to follow thru
- FRAME_UPDATE;
- return TRUE;
- }
-
- if(!airBorne)
- {
- srcSpriteP->vertMoveDelta = spriteDataPtr[kHangTime] = 0;
- spritePoint->v = srcSpriteP->moveBoundsRect.bottom - kGroundLevel;
- // Just land?
- switch(spriteDataPtr[kPreviousAction]) // used to check kCurrentAction
- {
- case aJump:
- case aJumpAttack:
- case aJumpPunch:
- case aJumpKick:
- spriteDataPtr[kPreviousAction] = spriteDataPtr[kCurrentAction];
- spriteDataPtr[kCurrentAction] = aIdle;
- srcSpriteP->vertMoveDelta = spriteDataPtr[kHangTime] = 0;
- spritePoint->v = srcSpriteP->moveBoundsRect.bottom - kGroundLevel;
- forceFrameUpdate = TRUE;
- FRAME_UPDATE;
- return TRUE;
- default:
- break;
- }
- }
- else //(airBorne)
- // First, do all necessary checking to get the current action.
- // if sprite is airborne, it can only jump-kick, jump-punch or shoot!
- {
- // gravity
- srcSpriteP->vertMoveDelta += spriteDataPtr[kHangTime];
- spriteDataPtr[kHangTime]+=1;
- }
-
- // Get the current action being performed. If it differs from the previous action,
- // update things as necessary.
- GetSpriteAction(spriteDataPtr, &spriteAction[0], airBorne);
- // Save previous action (formerly the current action)
- spriteDataPtr[kPreviousAction] = spriteDataPtr[kCurrentAction];
-
- // Doing nothing?
- if((bRunLeft+bRunRight+bPunch+bKick+bJump+bBlock+bJumpAttack+
- bJumpPunch+bJumpKick+bDuck+bUppercut+bTaunt+bShoot)==0)
- {
- srcSpriteP->horizMoveDelta = (airBorne ? srcSpriteP->horizMoveDelta : 0);
- spriteDataPtr[kCurrentAction] = (airBorne ? spriteDataPtr[kCurrentAction] : aIdle);
- FRAME_UPDATE;
- return TRUE;
- }
- if(bBlock) // Blocking?
- {
- srcSpriteP->horizMoveDelta=0;
- spriteDataPtr[kCurrentAction] = aBlock;
- FRAME_UPDATE;
- return TRUE;
- }
- if(bUppercut) // Uppercutting? - MUST check for this before ducking
- {
- srcSpriteP->horizMoveDelta = 0; // No horizontal movement for these cases.
- spriteDataPtr[kCurrentAction] = aUppercut;
- FRAME_UPDATE;
- switch(spriteDataPtr[kSpriteIDNum])
- {
- case kPlayer1Sprite:
- case kComputer1Sprite:
- if(spriteDataPtr[kPreviousAction] != aUppercut)
- PlaySound(gP1SoundH[sSwing], gSoundChanP1);
- break;
- case kPlayer2Sprite:
- case kComputer2Sprite:
- if(spriteDataPtr[kPreviousAction] != aUppercut)
- PlaySound(gP2SoundH[sSwing], gSoundChanP2);
- break;
- }
- return TRUE;
- }
- if(bDuck) // Ducking?
- {
- srcSpriteP->horizMoveDelta=0;
- spriteDataPtr[kCurrentAction] = aDuck;
- FRAME_UPDATE;
- return TRUE;
- }
- if(bTaunt) // Taunting?
- {
- srcSpriteP->horizMoveDelta=0;
- spriteDataPtr[kCurrentAction] = aTaunt;
- if(spriteDataPtr[kPreviousAction] != aTaunt)
- {
- spriteDataPtr[kCurrentFrame] = 0;
- switch(spriteDataPtr[kSpriteIDNum])
- {
- case kPlayer1Sprite:
- case kComputer1Sprite:
- PlaySound(gP1SoundH[sTaunt], gSoundChanP1);
- break;
- case kPlayer2Sprite:
- case kComputer2Sprite:
- PlaySound(gP2SoundH[sTaunt], gSoundChanP2);
- break;
- }
- }
- else
- {
- spriteDataPtr[kCurrentFrame] += 1;
- // Taunt long enough and sprite will start to regenerate!
- if(spriteDataPtr[kCurrentFrame] == kSpriteHealingTime &&
- spriteDataPtr[kSpriteLife] < kSpriteMaxLife &&
- !gSecretCode[kNoRegenerationCode])
- {
- Rect eraseRect;
-
- eraseRect.top = kLifeRectTop;
- eraseRect.bottom = kLifeRectBottom;
- spriteDataPtr[kSpriteLife] += 1; // regenerate!
- spriteDataPtr[kCurrentFrame] -= 1; // Allow continuous regeneration
- switch(spriteDataPtr[kSpriteIDNum])
- {
- case kPlayer1Sprite:
- case kComputer1Sprite:
- eraseRect.left = kP1LifeRectLeft;
- eraseRect.right = kP1LifeRectLeft + spriteDataPtr[kSpriteLife] -5;
- break;
- case kPlayer2Sprite:
- case kComputer2Sprite:
- eraseRect.left = kP2LifeRectLeft;
- eraseRect.right = kP2LifeRectLeft + spriteDataPtr[kSpriteLife] -5;
- break;
- default:
- DoError(kUnknownSpriteInGame, TRUE);
- break;
- }
- EraseRect(&eraseRect);
- }
- }
- FRAME_UPDATE;
- return TRUE;
- }
- if(bShoot) // shooting?
- {
- unsigned char *projSpriteDataPtr;
-
- // Must determine which projectile is mine
- switch(spriteDataPtr[kSpriteIDNum])
- {
- case kPlayer1Sprite:
- case kComputer1Sprite:
- projSpriteDataPtr = (unsigned char *)&spriteGame.spriteArray[kPlayer1ProjectileSprite].userData;
- bShoot = (projSpriteDataPtr[kCurrentAction] == aProjectileShoot ? FALSE : TRUE);
- break;
- case kPlayer2Sprite:
- case kComputer2Sprite:
- projSpriteDataPtr = (unsigned char *)&spriteGame.spriteArray[kPlayer2ProjectileSprite].userData;
- bShoot = (projSpriteDataPtr[kCurrentAction] == aProjectileShoot ? FALSE : TRUE);
- break;
- }
- if(bShoot)
- {
- short id = projSpriteDataPtr[kSpriteIDNum], frameOffset, bulletSpeed;
-
- srcSpriteP->horizMoveDelta=0;
- spriteDataPtr[kCurrentAction] = aShoot;
- projSpriteDataPtr[kCurrentAction] = aProjectileShoot;
- FRAME_UPDATE;
- // Launch projectile!!!!
- SWSetSpriteLocation(&spriteGame.spriteArray[id], spritePoint->h, spritePoint->v);
- SWSetSpriteVisible(&spriteGame.spriteArray[id], TRUE);
- frameOffset = (rightSide ? 2 : 0);
- SpriteFrameUpdate(&spriteGame.spriteArray[id], projSpriteDataPtr, frameOffset, TRUE);
- bulletSpeed = kProjectileSpeed;
- if(gSecretCode[kFastProjectileCode])
- bulletSpeed*=3;
- if(gSecretCode[kSlowProjectileCode])
- bulletSpeed/=3;
- spriteGame.spriteArray[id].horizMoveDelta = (rightSide ? -bulletSpeed : bulletSpeed);
- switch(spriteDataPtr[kSpriteIDNum])
- {
- case kPlayer1Sprite:
- case kComputer1Sprite:
- PlaySound(gP1SoundH[sProjectile], gSoundChanP1);
- break;
- case kPlayer2Sprite:
- case kComputer2Sprite:
- PlaySound(gP2SoundH[sProjectile], gSoundChanP2);
- break;
- }
- }
- return TRUE;
- }
- if(bJump) // Jumping?
- {
- srcSpriteP->vertMoveDelta = (gSecretCode[kHighJumpCode] ?
- (2*kJumpSpeed) : kJumpSpeed);
- spriteDataPtr[kHangTime] = 1;
- spriteDataPtr[kCurrentAction] = aJump;
- switch(spriteDataPtr[kSpriteIDNum])
- {
- case kPlayer1Sprite:
- case kComputer1Sprite:
- PlaySound(gP1SoundH[sJump], gSoundChanP1);
- break;
- case kPlayer2Sprite:
- case kComputer2Sprite:
- PlaySound(gP2SoundH[sJump], gSoundChanP2);
- break;
- }
- FRAME_UPDATE;
- return TRUE;
- }
- if(bJumpAttack) // Jump-Attacking? - special case!!!
- {
- srcSpriteP->vertMoveDelta=kJumpAttackVertSpeed;
- srcSpriteP->horizMoveDelta =
- (rightSide ? -kJumpAttackHorizSpeed : +kJumpAttackHorizSpeed);
- if(gSecretCode[kSuperJACode])
- srcSpriteP->horizMoveDelta *= 2;
- spriteDataPtr[kHangTime] = 1;
- spriteDataPtr[kCurrentAction] = aJumpAttack;
- switch(spriteDataPtr[kSpriteIDNum])
- {
- case kPlayer1Sprite:
- case kComputer1Sprite:
- PlaySound(gP1SoundH[sJumpAttack], gSoundChanP1);
- break;
- case kPlayer2Sprite:
- case kComputer2Sprite:
- PlaySound(gP2SoundH[sJumpAttack], gSoundChanP2);
- break;
- }
- FRAME_UPDATE;
- return TRUE;
- }
- if(bJumpPunch) // Jump-punching?
- {
- spriteDataPtr[kCurrentAction] = aJumpPunch;
- switch(spriteDataPtr[kSpriteIDNum])
- {
- case kPlayer1Sprite:
- case kComputer1Sprite:
- if(spriteDataPtr[kPreviousAction] != aJumpPunch)
- PlaySound(gP1SoundH[sSwing], gSoundChanP1);
- break;
- case kPlayer2Sprite:
- case kComputer2Sprite:
- if(spriteDataPtr[kPreviousAction] != aJumpPunch)
- PlaySound(gP2SoundH[sSwing], gSoundChanP2);
- break;
- }
- FRAME_UPDATE;
- return TRUE;
- }
- if(bJumpKick) // Jump-kicking?
- {
- spriteDataPtr[kCurrentAction] = aJumpKick;
- switch(spriteDataPtr[kSpriteIDNum])
- {
- case kPlayer1Sprite:
- case kComputer1Sprite:
- if(spriteDataPtr[kPreviousAction] != aJumpKick)
- PlaySound(gP1SoundH[sSwing], gSoundChanP1);
- break;
- case kPlayer2Sprite:
- case kComputer2Sprite:
- if(spriteDataPtr[kPreviousAction] != aJumpKick)
- PlaySound(gP2SoundH[sSwing], gSoundChanP2);
- break;
- }
- FRAME_UPDATE;
- return TRUE;
- }
- if(bPunch) // Punching?
- {
- srcSpriteP->horizMoveDelta = 0; // No horizontal movement for these cases.
- spriteDataPtr[kCurrentAction] = aPunch;
- FRAME_UPDATE;
- switch(spriteDataPtr[kSpriteIDNum])
- {
- case kPlayer1Sprite:
- case kComputer1Sprite:
- if(spriteDataPtr[kPreviousAction] != aPunch)
- PlaySound(gP1SoundH[sSwing], gSoundChanP1);
- break;
- case kPlayer2Sprite:
- case kComputer2Sprite:
- if(spriteDataPtr[kPreviousAction] != aPunch)
- PlaySound(gP2SoundH[sSwing], gSoundChanP2);
- break;
- }
- return TRUE;
- }
- if(bKick) // Kicking?
- {
- srcSpriteP->horizMoveDelta = 0; // No horizontal movement for these cases.
- spriteDataPtr[kCurrentAction] = aKick;
- FRAME_UPDATE;
- switch(spriteDataPtr[kSpriteIDNum])
- {
- case kPlayer1Sprite:
- case kComputer1Sprite:
- if(spriteDataPtr[kPreviousAction] != aKick)
- PlaySound(gP1SoundH[sSwing], gSoundChanP1);
- break;
- case kPlayer2Sprite:
- case kComputer2Sprite:
- if(spriteDataPtr[kPreviousAction] != aKick)
- PlaySound(gP2SoundH[sSwing], gSoundChanP2);
- break;
- }
- return TRUE;
- }
- if(bRunRight) // Running right?
- {
- if(srcSpriteP->horizMoveDelta < 0)
- {
- srcSpriteP->horizMoveDelta = 0;
- spriteDataPtr[kCurrentAction] = aIdle;
- }
- else
- {
- srcSpriteP->horizMoveDelta++;
- spriteDataPtr[kCurrentAction] = aRun;
- }
- FRAME_UPDATE;
- return TRUE;
- }
- if(bRunLeft) // Running left?
- {
- if(srcSpriteP->horizMoveDelta > 0)
- {
- srcSpriteP->horizMoveDelta = 0;
- spriteDataPtr[kCurrentAction] = aIdle;
- }
- else
- {
- srcSpriteP->horizMoveDelta--;
- spriteDataPtr[kCurrentAction] = aRun;
- }
- FRAME_UPDATE;
- return TRUE;
- }
-
- return TRUE; // still alive.
- }
-
- /* ProjectileStatusCheck */
- /* double = 8 bytes ; char = 1 byte ; => 1 double == 8 chars
- Use srcSpriteP->userData (change from long to double!!!) to store 8 chars, which will
- hold all the necessary information. */
- Boolean ProjectileStatusCheck(SpritePtr srcSpriteP, Point *spritePoint)
- {
- Boolean visible, forceFrameUpdate = TRUE;
- Boolean rightSide;
- unsigned char *spriteDataPtr; // use as an array of 8 u. chars.
- short rightSideAdjustFrames;
-
- spriteDataPtr = (unsigned char *)&srcSpriteP->userData;
-
- // If the somebody is dying, leave now.
- if(spriteDataPtr[kCurrentAction] == aDoNothing)
- return FALSE; // invisible (at least in theory
- switch(spriteDataPtr[kSpriteIDNum])
- {
- case kPlayer1ProjectileSprite:
- projectile1TopLeft = *spritePoint;
- break;
- case kPlayer2ProjectileSprite:
- projectile2TopLeft = *spritePoint;
- break;
- }
-
- // force a frame update if necessary (but NOT if projectile is visible!)
- visible = (spriteDataPtr[kCurrentAction] == aProjectileShoot ? TRUE : FALSE);
- SWSetSpriteVisible(srcSpriteP, visible);
- if(!visible) // Stop moving
- {
- srcSpriteP->horizMoveDelta=srcSpriteP->vertMoveDelta=0;
- }
-
- spriteDataPtr[kPreviousAction] = spriteDataPtr[kCurrentAction];
-
- return (visible);
- }
-
- void GetSpriteAction(unsigned char *spriteDataPtr, Boolean *spriteAction, Boolean airBorne)
- {
- switch(spriteDataPtr[kSpriteIDNum])
- {
- case kPlayer1Sprite :
- GetP1HumanAction(spriteAction, airBorne);
- break;
- case kPlayer2Sprite:
- GetP2HumanAction(spriteAction, airBorne);
- break;
- case kComputer1Sprite:
- case kComputer2Sprite:
- GetComputerAction(spriteAction, spriteDataPtr);
- break;
- default: // A memory error has most likely occurred if we get here somehow.
- DoError(kUnknownSpriteInGame, TRUE);
- break;
- }
- }
-
- void GetP1HumanAction(Boolean *spriteAction, Boolean airBorne)
- {
- bRunLeft = (isPressed(keyP1Left) && !airBorne ? TRUE : FALSE);
- bRunRight = (isPressed(keyP1Right) && !airBorne ? TRUE : FALSE);
- bPunch = (isPressed(keyP1Punch) && !airBorne ? TRUE : FALSE);
- bKick = (isPressed(keyP1Kick) && !airBorne ? TRUE : FALSE);
- bBlock = (isPressed(keyP1Block) && !airBorne ? TRUE : FALSE);
- bJumpAttack = (isPressed(keyP1JumpAttack) && !airBorne ? TRUE : FALSE);
- bTaunt = (isPressed(keyP1Taunt) && !airBorne ? TRUE : FALSE);
- bJump = (isPressed(keyP1Jump) && !airBorne ? TRUE : FALSE);
- // You must be in the air to do a jump attack.
- if(bJumpPunch = (isPressed(keyP1Punch) && airBorne ? TRUE : FALSE))
- bPunch = FALSE;
- if(bJumpKick = (isPressed(keyP1Kick) && airBorne ? TRUE : FALSE))
- bKick = FALSE;
- bShoot = (isPressed(keyP1Shoot) && !gSecretCode[kNoProjectileCode] ? TRUE : FALSE);
- bDuck = (isPressed(keyP1Duck) && !airBorne ? TRUE : FALSE);
- // You must be ducking to do an uppercut
- bUppercut = (isPressed(keyP1Uppercut) && bDuck ? TRUE : FALSE);
- }
-
- void GetP2HumanAction(Boolean *spriteAction, Boolean airBorne)
- {
- bRunLeft = (isPressed(keyP2Left) && !airBorne ? TRUE : FALSE);
- bRunRight = (isPressed(keyP2Right) && !airBorne ? TRUE : FALSE);
- bPunch = (isPressed(keyP2Punch) && !airBorne ? TRUE : FALSE);
- bKick = (isPressed(keyP2Kick) && !airBorne ? TRUE : FALSE);
- bBlock = (isPressed(keyP2Block) && !airBorne ? TRUE : FALSE);
- bJumpAttack = (isPressed(keyP2JumpAttack) && !airBorne ? TRUE : FALSE);
- bTaunt = (isPressed(keyP2Taunt) && !airBorne ? TRUE : FALSE);
- bJump = (isPressed(keyP2Jump) && !airBorne ? TRUE : FALSE);
- // You must be in the air to do a jump attack.
- if(bJumpPunch = (isPressed(keyP2Punch) && airBorne ? TRUE : FALSE))
- bPunch = FALSE;
- if(bJumpKick = (isPressed(keyP2Kick) && airBorne ? TRUE : FALSE))
- bKick = FALSE;
- bShoot = (isPressed(keyP2Shoot) && !gSecretCode[kNoProjectileCode] ? TRUE : FALSE);
- bDuck = (isPressed(keyP2Duck) && !airBorne ? TRUE : FALSE);
- // You must be ducking to do an uppercut
- bUppercut = (isPressed(keyP2Uppercut) && bDuck ? TRUE : FALSE);
- }
-
- void GetComputerAction(Boolean *spriteAction, unsigned char *dataP)
- {
- short beConsistent, inconsistent = 8, newAction;
-
- //• Just using 'beConsistent' as a counter for now...
- for(beConsistent = 0; beConsistent < kNumActions; beConsistent++)
- spriteAction[beConsistent] = FALSE;
- // Now get a random number for consistency checking
- beConsistent = GetRandom(0,9);
- //• If getting hit, will almost always switch to a defensive posture!
- if(dataP[kPreviousAction] == aGotHit || dataP[kCurrentAction] == aGotHit)
- {
- if(beConsistent < inconsistent)
- newAction = aBlock;
- else
- newAction = GetRandom(0,9);
- }
- // be consistent unless jumping around!
- else if((beConsistent < inconsistent) && (dataP[kPreviousAction] != aJump))
- {
- newAction = dataP[kPreviousAction];
- }
- else
- {
- newAction = GetRandom(0,9);
- }
- switch(newAction)
- {
- case aIdle:
- break;
- case aJump:
- bJump = TRUE;
- break;
- case aRun:
- // Which drxn to go?
- switch(dataP[kCurrentSide])
- {
- case kLeftSide:
- bRunRight = TRUE; // go right
- break;
- case kRightSide:
- bRunLeft = TRUE; // go left
- break;
- default:
- bJumpAttack = TRUE; // When in doubt, jump attack!
- break;
- }
- break;
- case aBlock:
- bBlock = TRUE;
- break;
- case aPunch:
- bPunch = TRUE;
- break;
- case aKick:
- bKick = TRUE;
- break;
- case aJumpAttack:
- bJumpAttack = TRUE;
- break;
- default: // Run at your opponent!
- // Which drxn to go?
- switch(dataP[kCurrentSide])
- {
- case kLeftSide:
- bRunRight = TRUE; // go right
- break;
- case kRightSide:
- bRunLeft = TRUE; // go left
- break;
- default:
- bJumpAttack = TRUE; // When in doubt, jump attack!
- break;
- }
- break;
- }
- }
-
- void SpriteFrameUpdate(SpritePtr srcSpriteP, unsigned char *spriteDataPtr,
- short rightSideAdjustFrames, Boolean forceUpdate)
- {
-
- if((spriteDataPtr[kCurrentAction] != spriteDataPtr[kPreviousAction])
- || (forceUpdate==TRUE))
- {
- switch(spriteDataPtr[kCurrentAction])
- {
- case aIdle:
- // adjust speeds to this action
- SWSetSpriteMoveTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameRange(srcSpriteP,
- cicnIdleStart,cicnIdleEnd);
- break;
- case aJump:
- // adjust speeds to this action
- SWSetSpriteMoveTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameRange(srcSpriteP,
- cicnJumpStart,cicnJumpEnd);
- break;
- case aJumpAttack:
- // adjust speeds to this action
- SWSetSpriteMoveTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameRange(srcSpriteP,
- cicnJumpAttackStart,cicnJumpAttackEnd);
- break;
- case aJumpPunch:
- SWSetSpriteFrameRange(srcSpriteP,
- cicnJumpPunchStart,cicnJumpPunchEnd);
- break;
- case aJumpKick:
- SWSetSpriteFrameRange(srcSpriteP,
- cicnJumpKickStart,cicnJumpKickEnd);
- break;
- case aRun:
- // adjust speeds to this action
- SWSetSpriteMoveTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameRange(srcSpriteP,
- cicnRunStart,cicnRunEnd);
- break;
- case aBlock:
- SWSetSpriteFrameRange(srcSpriteP,
- cicnBlockStart,cicnBlockEnd);
- break;
- case aDuck:
- SWSetSpriteFrameRange(srcSpriteP,
- cicnDuckStart,cicnDuckEnd);
- break;
- case aUppercut:
- // adjust speeds to this action - 1/3 of normal speed
- SWSetSpriteMoveTime(srcSpriteP, (3*5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameTime(srcSpriteP, (3*5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameRange(srcSpriteP,
- cicnUppercutStart,cicnUppercutEnd);
- break;
- case aTaunt:
- // adjust speeds to this action - 1/5 of normal speed
- SWSetSpriteMoveTime(srcSpriteP, (5*5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameTime(srcSpriteP, (5*5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameRange(srcSpriteP,
- cicnTauntStart,cicnTauntEnd);
- break;
- case aShoot:
- SWSetSpriteFrameRange(srcSpriteP,
- cicnShootStart,cicnShootEnd);
- break;
- case aPunch:
- // adjust speeds to this action
- SWSetSpriteMoveTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameRange(srcSpriteP,
- cicnPunchStart,cicnPunchEnd);
- break;
- case aKick:
- // adjust speeds to this action
- SWSetSpriteMoveTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameRange(srcSpriteP,
- cicnKickStart,cicnKickEnd);
- break;
- case aGotHit:
- // adjust speeds to this action
- SWSetSpriteMoveTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- // 1/2 of normal speed - FRAMES ONLY
- SWSetSpriteFrameTime(srcSpriteP, (2*5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameRange(srcSpriteP,
- cicnGotHitStart,cicnGotHitEnd);
- spriteDataPtr[kPreviousAction] = aGotHit;
- break;
- case aDying:
- // adjust speeds to this action - 1/3 of normal speed
- SWSetSpriteMoveTime(srcSpriteP, (3*5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameTime(srcSpriteP, (3*5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameRange(srcSpriteP,
- cicnDyingStart,cicnDyingEnd);
- break;
- case aRideChair:
- // adjust speeds to this action
- SWSetSpriteMoveTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameRange(srcSpriteP,
- cicnRideChairStart,cicnRideChairEnd);
- break;
- case aPushChair:
- // adjust speeds to this action
- SWSetSpriteMoveTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameRange(srcSpriteP,
- cicnPushChairStart,cicnPushChairEnd);
- break;
- case aProjectileIdle: // no adjustment needed
- break;
- case aProjectileShoot: // no adjustment needed
- SWSetSpriteFrameRange(srcSpriteP,
- cicnProjectileStart,cicnProjectileEnd);
- break;
- case aPostJumpAttack:
- break;
- default: // in case something really wierd happens!!!
- spriteDataPtr[kCurrentAction] = aIdle;
- // adjust speeds to this action
- SWSetSpriteMoveTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameTime(srcSpriteP, (5*(20-gFrameAdvanceTime-1)));
- SWSetSpriteFrameRange(srcSpriteP,
- cicnIdleStart,cicnIdleEnd);
- break;
- }
- }
- }
-
- // Which side is sprite on?
- Boolean GetSpriteSide(unsigned char *spriteDataPtr)
- {
- Point s1Mid, s2Mid;
- unsigned char side;
-
- s1Mid = GetSpriteMidPoint(player1TopLeft);
- s2Mid = GetSpriteMidPoint(player2TopLeft);
- switch(spriteDataPtr[kSpriteIDNum])
- {
- case kPlayer1Sprite:
- case kComputer1Sprite:
- case kPlayer1ProjectileSprite:
- if(s1Mid.h > s2Mid.h)
- return (kRightSide);
- else
- return (kLeftSide);
- break;
- case kPlayer2Sprite:
- case kComputer2Sprite:
- case kPlayer2ProjectileSprite:
- if(s2Mid.h > s1Mid.h)
- return (kRightSide);
- else
- return (kLeftSide);
- break;
- default:
- DoError(kUnknownSpriteInGame, TRUE);
- break;
- }
- }
-
- Point GetSpriteMidPoint(Point spritePoint)
- {
- Point midPt;
-
- midPt.h = spritePoint.h + (gSpriteWidth / 2);
- midPt.v = spritePoint.v + (gSpriteHeight / 2);
-
- return (midPt);
- }
-
- void DigSpriteGrave(short spriteID, short deathMode)
- {
- SpritePtr deadSpriteP;
- SpriteFilePtr deadFileP;
- FramePtr newFrameP;
- short frame, firstDeathFrame, firstMaskDeathFrame, numDeathFrames;
- short oldResRefNum, curResRefNum;
- OSErr err;
- Boolean locked;
-
- switch(spriteID)
- {
- case kPlayer1Sprite:
- case kComputer1Sprite:
- deadSpriteP = &spriteGame.spriteArray[kPlayer1Sprite];
- deadFileP = &gPlayer1File;
- break;
- case kPlayer2Sprite:
- case kComputer2Sprite:
- deadSpriteP = &spriteGame.spriteArray[kPlayer2Sprite];
- deadFileP = &gPlayer2File;
- break;
- }
- // dispose of ALL current frames, since this guy won't be needing them anymore
- // If sprite is locked...
- locked = deadSpriteP->frameArray[0]->isFrameLocked;
- if(locked) // Unlock it.
- SWUnlockSprite(deadSpriteP);
- for (frame = 0; frame < deadSpriteP->numFrames; frame++)
- {
- SWDisposeFrame(deadSpriteP->frameArray[frame]);
- }
- deadSpriteP->numFrames = 0; // sprite should have no frames now.
- // Add death frames...
- switch(deathMode)
- {
- case aDying:
- firstDeathFrame = kFirstDeathResNum;
- firstMaskDeathFrame = firstDeathFrame + kMaskFrameOffset;
- numDeathFrames = 2*kMaxDeathFrames; // 2 = both sides (face left, face right
- break;
- default:
- break;
- }
- // Open required file
- oldResRefNum = CurResFile();
- curResRefNum = HOpenResFile(deadFileP->sfFile.vRefNum,
- deadFileP->sfFile.parID,deadFileP->sfFile.name, fsRdPerm);
- err = ((ResError()!=noErr) || curResRefNum < 0);
- if (err == noErr) // Here, add the new frames
- {
- UseResFile(curResRefNum);
- for (frame = 0; frame < numDeathFrames; frame++)
- {
- err = SWCreateFrameFromPictResource(&newFrameP, firstDeathFrame + frame,
- firstMaskDeathFrame + frame, kRegionMask);
- if (err == noErr)
- {
- err = SWAddFrame(deadSpriteP, newFrameP);
- }
- else
- break;
- }
- }
- CloseResFile(curResRefNum);
- UseResFile(oldResRefNum);
- if(err != noErr)
- DoError(kCouldNotCreateSprites, TRUE);
- else
- {
- SWSetSpriteFrameRange(deadSpriteP, 0, numDeathFrames - 1);
- if(locked) // Lock it back up.
- SWLockSprite(deadSpriteP);
- SWSetCurrentFrame(deadSpriteP, deadSpriteP->frameArray[0]); // Set to 1st death frame
- }
- }