windows-nt/Source/XPSP1/NT/multimedia/dshow/streams/foxbear/gameproc.c
2020-09-26 16:20:57 +08:00

1385 lines
41 KiB
C

/*==========================================================================
*
* Copyright (c) 1995 - 1997 Microsoft Corporation. All Rights Reserved.
* Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved.
*
* File: gameproc.c
* Content: Game processing routines
*
***************************************************************************/
#include "foxbear.h"
GFX_HBM hBuffer;
HBITMAPLIST *hBitmapList;
HBITMAPLIST *hTileList;
HPOSLIST *hForePosList;
HPOSLIST *hMidPosList;
HPOSLIST *hBackPosList;
HSURFACELIST *hSurfaceList;
HPLANE *hForeground;
HPLANE *hMidground;
HPLANE *hBackground;
HSPRITE *hFox;
HSPRITE *hBear;
HSPRITE *hApple;
USHORT chewCount;
LONG chewDif;
IDirectDrawStreamSample *g_pMovieSource = NULL;
/*
* ErrorMessage
*/
void ErrorMessage( CHAR *pText )
{
char ach[128];
wsprintf( ach, "FOXBEAR FATAL ERROR: %s\r\n", pText );
OutputDebugString(ach);
gfxEnd( hBuffer );
exit( 0 );
} /* ErrorMessage */
/*
* InitBuffer
*/
BOOL InitBuffer( GFX_HBM *hBuffer )
{
*hBuffer = gfxBegin();
if( *hBuffer == NULL )
{
ErrorMessage( "gfxBegin failed" );
return FALSE;
}
return TRUE;
} /* InitBuffer */
/*
* DestroyBuffer
*/
void DestroyBuffer ( GFX_HBM hBuffer )
{
if( gfxEnd( hBuffer ) == FALSE )
{
ErrorMessage( "gfxEnd in DestroyBuffer" );
}
} /* DestroyBuffer */
/*
* LoadBitmaps
*/
HBITMAPLIST *LoadBitmaps( void )
{
HBITMAPLIST *hBitmapList;
CHAR fileName[32];
USHORT i;
USHORT n;
if( !FastFileInit( "foxbear.art", 5 ) )
{
Msg( "Could not load art file err=%08lX" , GetLastError());
return NULL;
}
hBitmapList = CMemAlloc( C_TILETOTAL + C_FBT + C_BBT, sizeof (HBITMAPLIST) );
Msg( "Loading tiles" );
for( i = 0; i < C_TILETOTAL; ++i )
{
wsprintf( fileName, "%03u.BMP", i + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n = C_TILETOTAL;
Msg( "Loading FoxWalk" );
for( i = n; i < n + C_FOXWALK; ++i )
{
wsprintf( fileName, "FW%02uR.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXWALK;
Msg( "Loading FoxWalk2" );
for( i = n; i < n + C_FOXWALK; ++i )
{
wsprintf( fileName, "FW%02uL.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXWALK;
Msg( "Loading FoxRun" );
for( i = n; i < n + C_FOXRUN; ++i )
{
wsprintf( fileName, "FR%02uR.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXRUN;
Msg( "Loading FoxRun2" );
for( i = n; i < n + C_FOXRUN; ++i )
{
wsprintf( fileName, "FR%02uL.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXRUN;
Msg( "Loading FoxStill" );
for( i = n; i < n + C_FOXSTILL; ++i )
{
wsprintf( fileName, "FS%1uR.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXSTILL;
Msg( "Loading FoxStill2" );
for( i = n; i < n + C_FOXSTILL; ++i )
{
wsprintf( fileName, "FS%1uL.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXSTILL;
Msg( "Loading FoxStunned" );
for( i = n; i < n + C_FOXSTUNNED; ++i )
{
wsprintf( fileName, "FK%1uR.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXSTUNNED;
Msg( "Loading FoxStunned2" );
for( i = n; i < n + C_FOXSTUNNED; ++i )
{
wsprintf( fileName, "FK%1uL.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXSTUNNED;
Msg( "Loading FoxCrouch" );
for( i = n; i < n + C_FOXCROUCH; ++i )
{
wsprintf( fileName, "FC%1uR.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXCROUCH;
Msg( "Loading FoxCrouch2" );
for( i = n; i < n + C_FOXCROUCH; ++i )
{
wsprintf( fileName, "FC%1uL.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXCROUCH;
Msg( "Loading FoxStop" );
for( i = n; i < n + C_FOXSTOP; ++i )
{
wsprintf( fileName, "FCD%1uR.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXSTOP;
Msg( "Loading FoxStop2" );
for( i = n; i < n + C_FOXSTOP; ++i )
{
wsprintf( fileName, "FCD%1uL.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXSTOP;
Msg( "Loading FoxThrow" );
for( i = n; i < n + C_FOXTHROW; ++i )
{
wsprintf( fileName, "FT%1uR.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXTHROW;
Msg( "Loading FoxThrow2" );
for( i = n; i < n + C_FOXTHROW; ++i )
{
wsprintf( fileName, "FT%1uL.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXTHROW;
Msg( "Loading FoxJumpThrow" );
for( i = n; i < n + C_FOXJUMPTHROW; ++i )
{
wsprintf( fileName, "FJT%1uR.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXJUMPTHROW;
Msg( "Loading FoxJumpThrow2" );
for( i = n; i < n + C_FOXJUMPTHROW; ++i )
{
wsprintf( fileName, "FJT%1uL.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXJUMPTHROW;
Msg( "Loading FoxJump" );
for( i = n; i < n + C_FOXJUMP; ++i )
{
wsprintf( fileName, "FJ%1uR.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXJUMP;
Msg( "Loading FoxJump2" );
for( i = n; i < n + C_FOXJUMP; ++i )
{
wsprintf( fileName, "FJ%1uL.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXJUMP;
Msg( "Loading FoxCrouchWalk" );
for( i = n; i < n + C_FOXCROUCHWALK; ++i )
{
wsprintf( fileName, "FCW%02uR.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXCROUCHWALK;
Msg( "Loading FoxCrouchWalk2" );
for( i = n; i < n + C_FOXCROUCHWALK; ++i )
{
wsprintf( fileName, "FCW%02uL.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXCROUCHWALK;
Msg( "Loading FoxBlurr" );
for( i = n; i < n + C_FOXBLURR; ++i )
{
wsprintf( fileName, "FB%02uR.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXBLURR;
Msg( "Loading FoxBlurr2" );
for( i = n; i < n + C_FOXBLURR; ++i )
{
wsprintf( fileName, "FB%02uL.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_FOXBLURR;
Msg( "Loading BearMiss" );
for( i = n; i < n + C_BEARMISS; ++i )
{
wsprintf( fileName, "BM%1uL.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_BEARMISS;
Msg( "Loading BearStrike" );
for( i = n; i < n + C_BEARSTRIKE; ++i )
{
wsprintf( fileName, "BS%02uL.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_BEARSTRIKE;
Msg( "Loading BearWalk" );
for( i = n; i < n + C_BEARWALK; ++i )
{
wsprintf( fileName, "BW%02uL.BMP", i - n + 1 );
hBitmapList[i].hBM = gfxLoadBitmap( fileName );
}
n += C_BEARWALK;
FastFileFini();
return hBitmapList;
} /* LoadBitmaps */
/*
* InitTiles
*/
void InitTiles(
HBITMAPLIST **hTileList,
HBITMAPLIST *hBitmapList,
USHORT tileCount )
{
*hTileList = CreateTiles( hBitmapList, tileCount );
} /* InitTiles */
/*
* InitPlane
*/
void InitPlane(
HPLANE **hPlane,
HPOSLIST **hPosList,
LPSTR szFileName,
USHORT width,
USHORT height,
USHORT denom )
{
*hPlane = CreatePlane( width, height, denom );
*hPosList = CreatePosList( szFileName, width, height );
} /* InitPlane */
/*
* InitSurface
*/
void InitSurface(
HSURFACELIST **pphSurfaceList,
CHAR *szFileName,
USHORT width,
USHORT height )
{
*pphSurfaceList = CreateSurfaceList( szFileName, width, height );
} /* InitSurface */
/*
* InitFox
*/
void InitFox ( HSPRITE **pphFox, HBITMAPLIST *phBitmapList )
{
GFX_HBM hBM;
GFX_HBM hBM_src;
ACTION action;
DIRECTION direction;
USHORT i;
LONG startX = C_FOX_STARTX;
LONG startY = C_FOX_STARTY;
USHORT boundW = 108;
USHORT boundH = 105;
LONG as = 6;
SHORT x[C_FBT] = { 7, 15, 18, 11, 6, 3, 7, 15, 17, 11, 6, 3,
7, 15, 18, 11, 6, 3, 7, 15, 17, 11, 6, 3,
10, 3, 5, 16, 9, 13, 31, 24, 9, 3, 5, 16, 10, 13, 33, 23,
10, 3, 5, 16, 9, 13, 31, 24, 9, 3, 5, 16, 10, 13, 33, 23,
11, 11, 31, 31, 7, 7, 27, 27, 8, 10, 8, 10,
26, 6, 26, 6, 17, 21, 21, 24, 17, 21, 21, 24,
1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1,
1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1,
2, 2, -1, 0, 2, 2, -1, 0 };
SHORT y[C_FBT] = { 20, 24, 26, 25, 27, 19, 20, 25, 26, 25, 29, 21,
20, 24, 26, 25, 27, 19, 20, 25, 26, 25, 29, 21,
42, 42, 31, 19, 13, 11, 20, 33, 40, 43, 31, 19, 14, 12, 20, 33,
42, 42, 31, 19, 13, 11, 20, 33, 40, 43, 31, 19, 14, 12, 20, 33,
14, 14, 20, 20, 58, 58, 26, 26, 20, 24, 20, 24,
0, 9, 0, 9, 20, 11, 10, 9, 20, 11, 10, 9,
61, 61, 61, 61, 60, 60, 61, 61, 61, 61, 60, 60,
61, 61, 61, 61, 60, 60, 61, 61, 61, 61, 60, 60,
45, 45, 45, 45, 45, 45, 45, 45 };
USHORT w[C_FBT] = { 75, 73, 73, 82, 92, 84, 74, 74, 73, 81, 91, 84,
75, 73, 73, 82, 92, 84, 74, 74, 73, 81, 91, 84,
88, 92, 88, 78, 80, 78, 70, 84, 88, 92, 88, 78, 79, 79, 68, 85,
88, 92, 88, 78, 80, 78, 70, 84, 88, 92, 88, 78, 79, 79, 68, 85,
65, 65, 61, 61, 88, 88, 72, 72, 57, 86, 57, 86,
54, 92, 54, 92, 59, 57, 57, 52, 59, 57, 57, 52,
98, 99, 99, 99,100,100, 98,101,100, 99,100, 98,
98, 99, 99, 99,100,100, 98,101,100, 99,100, 98,
94, 94, 97, 96, 94, 94, 97, 96 };
USHORT h[C_FBT] = { 78, 74, 72, 73, 71, 79, 78, 73, 72, 73, 69, 77,
78, 74, 72, 73, 71, 79, 78, 73, 72, 73, 69, 77,
56, 56, 67, 79, 85, 87, 78, 65, 58, 55, 67, 79, 84, 86, 78, 65,
56, 56, 67, 79, 85, 87, 78, 65, 58, 55, 67, 79, 84, 86, 78, 65,
84, 84, 85, 85, 40, 40, 72, 72, 78, 74, 78, 74,
88, 82, 88, 82, 84, 87, 86, 85, 84, 87, 86, 85,
37, 37, 37, 37, 38, 38, 37, 37, 37, 37, 38, 38,
37, 37, 37, 37, 38, 38, 37, 37, 37, 37, 38, 38,
54, 53, 51, 54, 54, 53, 51, 54 };
*pphFox = CreateSprite( C_FBT, startX, startY, boundW, boundH, C_FORE_W * C_TILE_W, C_FORE_H * C_TILE_H, (SHORT) as, TRUE);
for( i = 0; i < C_FBT; ++i )
{
hBM_src = phBitmapList[i + C_TILETOTAL].hBM;
if( i < 12 )
{
action = WALK;
direction = RIGHT;
}
else if( (i >= 12) && (i < 24) )
{
action = WALK;
direction = LEFT;
}
else if( (i >= 24) && (i < 40) )
{
action = RUN;
direction = RIGHT;
}
else if( (i >= 40) && (i < 56) )
{
action = RUN;
direction = LEFT;
}
else if( i == 56 )
{
action = STILL;
direction = RIGHT;
}
else if( i == 57 )
{
action = STILL;
direction = LEFT;
}
else if( i == 58 )
{
action = STUNNED;
direction = RIGHT;
}
else if( i == 59 )
{
action = STUNNED;
direction = LEFT;
}
else if( i == 60 )
{
action = CROUCH;
direction = RIGHT;
}
else if( i == 61 )
{
action = CROUCH;
direction = LEFT;
}
else if( i == 62 )
{
action = STOP;
direction = RIGHT;
}
else if( i == 63 )
{
action = STOP;
direction = LEFT;
}
else if( (i >= 64) && (i < 66) )
{
action = THROW;
direction = RIGHT;
}
else if( (i >= 66) && (i < 68) )
{
action = THROW;
direction = LEFT;
}
else if( (i >= 68) && (i < 70) )
{
action = JUMPTHROW;
direction = RIGHT;
}
else if( (i >= 70) && (i < 72) )
{
action = JUMPTHROW;
direction = LEFT;
}
else if( (i >= 72) && (i < 76) )
{
action = JUMP;
direction = RIGHT;
}
else if( (i >= 76) && (i < 80) )
{
action = JUMP;
direction = LEFT;
}
else if( (i >= 80) && (i < 92) )
{
action = CROUCHWALK;
direction = RIGHT;
}
else if( (i >= 92) && (i < 104) )
{
action = CROUCHWALK;
direction = LEFT;
}
else if( (i >= 104) && (i < 108) )
{
action = BLURR;
direction = RIGHT;
}
else if( (i >= 108) && (i < 112) )
{
action = BLURR;
direction = LEFT;
}
hBM = hBM_src;
BitBltSprite(
*pphFox,
hBM,
action,
direction,
x[i],
y[i],
w[i],
h[i] );
}
SetSpriteAction( *pphFox, STILL, RIGHT );
} /* InitFox */
/*
* InitBear
*/
void InitBear( HSPRITE **pphBear, HBITMAPLIST *phBitmapList )
{
GFX_HBM hBM_src;
ACTION action;
DIRECTION direction;
USHORT i;
LONG startX = C_BEAR_STARTX;
LONG startY = C_BEAR_STARTY;
USHORT boundW = 196;
USHORT boundH = 88;
LONG as = 6;
USHORT x[C_BBT] = { 14, 10,
8, 12, 13, 14, 10, 10, 9, 9, 9, 9, 8, 9,
11, 6, 1, 0, 3, 13, 11, 7, 1, 1, 3, 14 };
USHORT y[C_BBT] = { 7, 7,
3, 8, 9, 7, 7, 3, 3, 3, 3, 3, 3, 3,
1, 1, 2, 2, 3, 1, 0, 1, 1, 2, 3, 2 };
USHORT w[C_BBT] = {127,129,
127,153,183,153,129,138,146,150,152,151,143,139,
131,136,140,141,136,125,131,135,140,140,136,126 };
USHORT h[C_BBT] = { 80, 80,
84, 79, 78, 80, 80, 84, 84, 84, 84, 84, 84, 84,
86, 86, 86, 85, 84, 86, 87, 86, 87, 85, 84, 86 };
*pphBear = CreateSprite( C_BBT, startX, startY, boundW, boundH, C_FORE_W * C_TILE_W, C_FORE_H * C_TILE_H, (SHORT) as, TRUE);
for( i = 0; i < C_BBT; ++i )
{
hBM_src = phBitmapList[i + C_TILETOTAL + C_FBT].hBM;
if( i < 2 )
{
action = MISS;
direction = LEFT;
}
else if( (i >= 2) && (i < 8) )
{
action = STRIKE;
direction = LEFT;
}
else if( (i >= 8) && (i < 14) )
{
action = CHEW;
direction = LEFT;
}
else if( (i >= 14) && (i < 26) )
{
action = WALK;
direction = LEFT;
}
BitBltSprite (
*pphBear,
hBM_src,
action,
direction,
x[i],
y[i],
w[i],
h[i] );
}
SetSpriteAction( *pphBear, WALK, LEFT );
SetSpriteVelX( *pphBear, -C_BEAR_WALKMOVE, P_ABSOLUTE );
SetSpriteSwitch( *pphBear, C_BEAR_WALKSWITCH, P_ABSOLUTE );
} /* InitBear */
/*
* InitApple
*/
VOID InitApple ( HSPRITE **pphApple, HBITMAPLIST *phBitmapList )
{
// CREATE THE DIRECTDRAW SOURCE HERE!!! AND REPLACE FINAL NULL WITH POITNER!
*pphApple = CreateSprite( 1, 50 * C_UNIT, 390 * C_UNIT, 32, 32, C_FORE_W * C_TILE_W, C_FORE_H * C_TILE_H, 0, FALSE);
BitBltSprite( *pphApple, phBitmapList[61].hBM, NONE, RIGHT, 0, 0, 32, 32 );
SetSpriteAction( *pphApple, NONE, RIGHT );
} /* InitApple */
/*
* PreInitializeGame
*/
BOOL PreInitializeGame( void )
{
return InitBuffer( &hBuffer);
} /* PreInitializeGame */
/*
* InitializeGame
*/
BOOL InitializeGame ( void )
{
CoInitialize(NULL);
Splash();
hBitmapList = LoadBitmaps();
if( hBitmapList == NULL )
{
return FALSE;
}
InitTiles( &hTileList, hBitmapList, C_TILETOTAL );
InitPlane( &hForeground, &hForePosList, "FORELIST", C_FORE_W, C_FORE_H, C_FORE_DENOM );
TilePlane( hForeground, hTileList, hForePosList );
InitPlane( &hMidground, &hMidPosList, "MIDLIST", C_MID_W, C_MID_H, C_MID_DENOM );
TilePlane( hMidground, hTileList, hMidPosList );
InitPlane( &hBackground, &hBackPosList, "BACKLIST", C_BACK_W, C_BACK_H, C_BACK_DENOM );
TilePlane( hBackground, hTileList, hBackPosList );
InitSurface( &hSurfaceList, "SURFLIST", C_FORE_W, C_FORE_H );
SurfacePlane( hForeground, hSurfaceList );
InitFox( &hFox, hBitmapList );
InitBear( &hBear, hBitmapList );
InitApple( &hApple, hBitmapList );
CreateVideoSource (&g_pMovieSource, L"\\msamovdk\\movies\\aninm.mpg");
DDClear(); // clear all the backbuffers.
return TRUE;
} /* InitializeGame */
extern void DisplayFrameRate( void );
/*
* NewGameFrame
*/
int NewGameFrame( void )
{
SetSpriteX( hFox, 0, P_AUTOMATIC );
SetSpriteY( hFox, 0, P_AUTOMATIC );
SetPlaneVelX( hBackground, GetSpriteVelX(hFox), P_ABSOLUTE );
SetPlaneVelX( hMidground, GetSpriteVelX(hFox), P_ABSOLUTE );
SetPlaneVelX( hForeground, GetSpriteVelX(hFox), P_ABSOLUTE );
SetPlaneX( hBackground, 0, P_AUTOMATIC );
SetPlaneX( hMidground, 0, P_AUTOMATIC );
SetPlaneX( hForeground, 0, P_AUTOMATIC );
SetSpriteX( hBear, 0, P_AUTOMATIC );
SetSpriteX( hApple, 0, P_AUTOMATIC );
SetSpriteY( hApple, 0, P_AUTOMATIC );
/*
* once all sprites are processed, display them
*
* If we are using destination transparency instead of source
* transparency, we need to paint the background with the color key
* and then paint our sprites and planes in reverse order.
*
* Since destination transparency will allow you to only write pixels
* on the destination if the transparent color is present, reversing
* the order (so that the topmost bitmaps are drawn first instead of
* list) causes everything to come out ok.
*/
if( bTransDest )
{
gfxFillBack( dwColorKey );
DisplayFrameRate();
DisplaySprite( hBuffer, hApple, GetPlaneX(hForeground) );
DisplaySprite( hBuffer, hBear, GetPlaneX(hForeground) );
DisplaySprite( hBuffer, hFox, GetPlaneX(hForeground) );
DisplayPlane( hBuffer, hForeground );
DisplayPlane( hBuffer, hMidground );
DisplayPlane( hBuffer, hBackground );
}
else
{
DisplayPlane( hBuffer, hBackground );
DisplayPlane( hBuffer, hMidground );
DisplayVideoSource(g_pMovieSource);
DisplayPlane( hBuffer, hForeground );
DisplaySprite( hBuffer, hFox, GetPlaneX(hForeground) );
DisplaySprite( hBuffer, hBear, GetPlaneX(hForeground) );
DisplaySprite( hBuffer, hApple, GetPlaneX(hForeground) );
DisplayFrameRate();
}
gfxSwapBuffers();
return 0;
} /* NewGameFrame */
/*
* DestroyGame
*/
void DestroyGame()
{
if (hBuffer)
{
DestroyTiles( hTileList );
DestroyPlane( hForeground );
DestroyPlane( hMidground );
DestroyPlane( hBackground );
DestroyBuffer( hBuffer );
DestroySound();
if (g_pMovieSource) {
IDirectDrawStreamSample_Release(g_pMovieSource);
g_pMovieSource = NULL;
}
hTileList = NULL;
hForeground = NULL;
hMidground = NULL;
hBackground = NULL;
hBuffer = NULL;
}
} /* DestroyGame */
/*
* ProcessInput
*/
BOOL ProcessInput( SHORT input )
{
static BOOL fBearPlaying = FALSE;
LONG foxSpeedX;
LONG foxSpeedY;
LONG foxX;
LONG foxY;
LONG bearX;
LONG bearY;
LONG appleX;
LONG appleY;
ACTION foxAction;
DIRECTION foxDir;
BOOL cont = TRUE;
foxSpeedX = GetSpriteVelX( hFox );
foxAction = GetSpriteAction( hFox );
foxDir = GetSpriteDirection( hFox );
if( (GetSpriteActive(hFox) == FALSE) && (input != 4209) )
{
input = 0;
}
switch( input )
{
case KEY_DOWN:
if( foxAction == STOP )
{
break;
}
else if( foxAction == STILL )
{
SetSpriteAction( hFox, CROUCH, SAME );
}
else if( foxAction == WALK )
{
SetSpriteAction( hFox, CROUCHWALK, SAME );
}
break;
case KEY_LEFT:
if( foxAction == STOP )
{
break;
}
else if( foxSpeedX == 0 )
{
if( foxAction == STILL )
{
if( foxDir == RIGHT )
{
ChangeSpriteDirection( hFox );
SetPlaneSlideX( hForeground, -C_BOUNDDIF, P_RELATIVE );
SetPlaneSlideX( hMidground, -C_BOUNDDIF, P_RELATIVE );
SetPlaneSlideX( hBackground, -C_BOUNDDIF, P_RELATIVE );
SetPlaneIncremX( hForeground, C_BOUNDINCREM, P_ABSOLUTE );
SetPlaneIncremX( hBackground, C_BOUNDINCREM, P_ABSOLUTE );
SetPlaneIncremX( hMidground, C_BOUNDINCREM, P_ABSOLUTE );
}
else
{
SetSpriteAction( hFox, WALK, LEFT );
SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE );
SetSpriteVelX( hFox, -C_FOX_XMOVE, P_RELATIVE );
}
}
else if( foxAction == CROUCH )
{
if( foxDir == RIGHT )
{
ChangeSpriteDirection( hFox );
SetPlaneSlideX( hForeground, -C_BOUNDDIF, P_RELATIVE );
SetPlaneSlideX( hMidground, -C_BOUNDDIF, P_RELATIVE );
SetPlaneSlideX( hBackground, -C_BOUNDDIF, P_RELATIVE );
SetPlaneIncremX( hForeground, C_BOUNDINCREM, P_ABSOLUTE );
SetPlaneIncremX( hBackground, C_BOUNDINCREM, P_ABSOLUTE );
SetPlaneIncremX( hMidground, C_BOUNDINCREM, P_ABSOLUTE );
}
else
{
SetSpriteAction( hFox, CROUCHWALK, LEFT );
SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE );
SetSpriteVelX( hFox, -C_FOX_XMOVE, P_RELATIVE );
}
}
else
{
SetSpriteVelX( hFox, -C_FOX_XMOVE, P_RELATIVE );
}
} else {
SetSpriteVelX( hFox, -C_FOX_XMOVE, P_RELATIVE );
}
break;
case KEY_RIGHT:
if( foxAction == STOP )
{
break;
}
else if( foxSpeedX == 0 )
{
if( foxAction == STILL )
{
if( foxDir == LEFT )
{
ChangeSpriteDirection( hFox );
SetPlaneSlideX( hForeground, C_BOUNDDIF, P_RELATIVE );
SetPlaneSlideX( hMidground, C_BOUNDDIF, P_RELATIVE );
SetPlaneSlideX( hBackground, C_BOUNDDIF, P_RELATIVE );
SetPlaneIncremX( hForeground, C_BOUNDINCREM, P_ABSOLUTE );
SetPlaneIncremX( hBackground, C_BOUNDINCREM, P_ABSOLUTE );
SetPlaneIncremX( hMidground, C_BOUNDINCREM, P_ABSOLUTE );
}
else
{
SetSpriteAction( hFox, WALK, RIGHT );
SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE );
SetSpriteVelX( hFox, C_FOX_XMOVE, P_RELATIVE );
}
}
else if( foxAction == CROUCH )
{
if( foxDir == LEFT )
{
ChangeSpriteDirection( hFox );
SetPlaneSlideX( hForeground, C_BOUNDDIF, P_RELATIVE );
SetPlaneSlideX( hMidground, C_BOUNDDIF, P_RELATIVE );
SetPlaneSlideX( hBackground, C_BOUNDDIF, P_RELATIVE );
SetPlaneIncremX( hForeground, C_BOUNDINCREM, P_ABSOLUTE );
SetPlaneIncremX( hBackground, C_BOUNDINCREM, P_ABSOLUTE );
SetPlaneIncremX( hMidground, C_BOUNDINCREM, P_ABSOLUTE );
}
else
{
SetSpriteAction( hFox, CROUCHWALK, RIGHT );
SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE );
SetSpriteVelX( hFox, C_FOX_XMOVE, P_RELATIVE );
}
}
else
{
SetSpriteVelX( hFox, C_FOX_XMOVE, P_RELATIVE );
}
}
else
{
SetSpriteVelX( hFox, C_FOX_XMOVE, P_RELATIVE );
}
break;
case KEY_STOP:
if( foxAction == STOP )
{
break;
}
else if( (foxAction == RUN) || (foxAction == BLURR) )
{
SetSpriteAction( hFox, STOP, SAME );
SetSpriteAccX( hFox, -foxSpeedX / 25, P_ABSOLUTE );
SoundPlayEffect( SOUND_STOP );
} else {
SetSpriteVelX( hFox, 0, P_ABSOLUTE );
}
break;
case KEY_UP:
if( foxAction == STOP )
{
break;
}
else if( foxAction == CROUCH )
{
SetSpriteAction( hFox, STILL, SAME );
}
else if( foxAction == CROUCHWALK )
{
SetSpriteAction( hFox, WALK, SAME );
}
break;
case KEY_JUMP:
if( foxAction == STOP )
{
break;
}
else
if( (foxAction == STILL) || (foxAction == WALK) ||
(foxAction == RUN) || (foxAction == CROUCH) ||
(foxAction == CROUCHWALK) )
{
SetSpriteAction( hFox, JUMP, SAME );
SetSpriteSwitchType( hFox, TIMESWITCH );
SetSpriteSwitch( hFox, C_FOX_JUMPSWITCH, P_ABSOLUTE );
SetSpriteVelY( hFox, -C_FOX_JUMPMOVE, P_ABSOLUTE );
SetSpriteAccY( hFox, C_UNIT / 2, P_ABSOLUTE );
SoundPlayEffect( SOUND_JUMP );
}
break;
case KEY_THROW:
if( foxAction == STOP )
{
break;
}
else if( (foxAction == STILL) || (foxAction == WALK) ||
(foxAction == RUN) || (foxAction == CROUCH) ||
(foxAction == CROUCHWALK) )
{
SetSpriteAction( hFox, THROW, SAME );
SetSpriteSwitch( hFox, C_FOX_THROWSWITCH, P_ABSOLUTE );
SetSpriteVelX( hFox, 0, P_ABSOLUTE );
SetSpriteSwitchType( hFox, TIMESWITCH );
}
else if( foxAction == JUMP )
{
SetSpriteAccY( hFox, 0, P_ABSOLUTE );
SetSpriteSwitch( hFox, C_FOX_THROWSWITCH, P_ABSOLUTE );
SetSpriteAction( hFox, JUMPTHROW, SAME );
SetSpriteVelY( hFox, 0, P_ABSOLUTE );
SetSpriteSwitchDone( hFox, FALSE );
SetSpriteSwitchForward( hFox, TRUE );
}
break;
default:
break;
}
/*
* Fox actions follow...
*/
if( GetSpriteActive(hFox) == FALSE )
{
goto bearActions;
}
if( abs(GetSpriteVelX( hFox )) < C_FOX_XMOVE )
{
SetSpriteVelX( hFox, 0, P_ABSOLUTE );
}
foxAction = GetSpriteAction( hFox );
if( GetSpriteVelY(hFox) == 0 )
{
if( GetSurface( hForeground, hFox ) == FALSE )
{
if( (foxAction == WALK) || (foxAction == RUN) ||
(foxAction == CROUCHWALK) )
{
SetSpriteAccY( hFox, C_UNIT / 2, P_ABSOLUTE );
}
else if( foxAction == STOP )
{
SetSpriteAccY( hFox, C_UNIT / 2, P_ABSOLUTE );
SetSpriteAccX( hFox, 0, P_ABSOLUTE );
}
}
}
else if( GetSpriteVelY(hFox) > 2 * C_UNIT )
{
if( (foxAction == WALK) || (foxAction == RUN) ||
(foxAction == CROUCHWALK) )
{
SetSpriteSwitchForward( hFox, FALSE );
SetSpriteAction( hFox, JUMP, SAME );
SetSpriteSwitchType( hFox, TIMESWITCH );
SetSpriteSwitch( hFox, C_FOX_JUMPSWITCH, P_ABSOLUTE );
}
if( foxAction == STOP )
{
SetSpriteAction( hFox, STUNNED, SAME );
SetSpriteAccX( hFox, -GetSpriteVelX(hFox) / 25, P_ABSOLUTE );
SoundPlayEffect( SOUND_STUNNED );
}
}
foxSpeedX = GetSpriteVelX( hFox );
foxSpeedY = GetSpriteVelY( hFox );
foxAction = GetSpriteAction( hFox );
foxDir = GetSpriteDirection( hFox );
switch( foxAction ) {
case STUNNED:
if( (GetSpriteVelY(hFox) >= 0) &&
(!GetSurface( hForeground, hFox ) == FALSE) )
{
SetSpriteAccY( hFox, 0, P_ABSOLUTE );
SetSpriteAction( hFox, STOP, SAME );
SetSpriteVelY( hFox, 0, P_ABSOLUTE );
SetSpriteAccX( hFox, -foxSpeedX / 25, P_ABSOLUTE );
// SetSurface( hForeground, hFox );
SoundPlayEffect( SOUND_STOP );
}
break;
case CROUCHWALK:
if( foxSpeedX == 0 )
{
SetSpriteAction( hFox, CROUCH, SAME );
}
else if( foxSpeedX > C_FOX_WALKMOVE )
{
SetSpriteVelX( hFox, C_FOX_WALKMOVE, P_ABSOLUTE );
}
else if( foxSpeedX < -C_FOX_WALKMOVE )
{
SetSpriteVelX( hFox, -C_FOX_WALKMOVE, P_ABSOLUTE );
}
break;
case STOP:
if( foxSpeedX == 0 )
{
SetSpriteAction( hFox, STILL, SAME );
SetSpriteAccX( hFox, 0, P_ABSOLUTE );
}
break;
case RUN:
if( (foxSpeedX < C_FOX_WALKTORUN ) && (foxSpeedX > 0) )
{
SetSpriteAction( hFox, WALK, RIGHT );
SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE );
}
else if( foxSpeedX > C_FOX_RUNTOBLURR )
{
SetSpriteAction( hFox, BLURR, RIGHT );
SetSpriteSwitch( hFox, C_FOX_BLURRSWITCH, P_ABSOLUTE );
}
else if( (foxSpeedX > -C_FOX_WALKTORUN ) && (foxSpeedX < 0) )
{
SetSpriteAction( hFox, WALK, LEFT );
SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE );
}
else if( foxSpeedX < -C_FOX_RUNTOBLURR )
{
SetSpriteAction( hFox, BLURR, LEFT );
SetSpriteSwitch( hFox, C_FOX_BLURRSWITCH, P_ABSOLUTE );
}
break;
case WALK:
if( foxSpeedX == 0 )
{
SetSpriteAction( hFox, STILL, SAME );
}
else if( foxSpeedX > C_FOX_WALKTORUN )
{
SetSpriteAction( hFox, RUN, RIGHT );
SetSpriteSwitch( hFox, C_FOX_RUNSWITCH, P_ABSOLUTE );
}
else if( foxSpeedX < -C_FOX_WALKTORUN )
{
SetSpriteAction( hFox, RUN, LEFT );
SetSpriteSwitch( hFox, C_FOX_RUNSWITCH, P_ABSOLUTE );
}
break;
case BLURR:
if( (foxSpeedX < C_FOX_RUNTOBLURR ) && (foxSpeedX > C_FOX_WALKTORUN) )
{
SetSpriteAction( hFox, RUN, RIGHT );
SetSpriteSwitch( hFox, C_FOX_RUNSWITCH, P_ABSOLUTE );
}
else if( (foxSpeedX > -C_FOX_RUNTOBLURR ) && (foxSpeedX < -C_FOX_WALKTORUN) )
{
SetSpriteAction( hFox, RUN, LEFT );
SetSpriteSwitch( hFox, C_FOX_RUNSWITCH, P_ABSOLUTE );
}
break;
case JUMPTHROW:
if( !GetSpriteSwitchDone(hFox) == FALSE )
{
SetSpriteSwitchForward( hFox, FALSE );
SetSpriteAction( hFox, JUMP, SAME );
SetSpriteSwitch( hFox, C_FOX_JUMPSWITCH, P_ABSOLUTE );
SetSpriteSwitchDone( hFox, FALSE );
SetSpriteAccY( hFox, C_UNIT / 2, P_ABSOLUTE );
SoundPlayEffect( SOUND_THROW );
}
else
if( (GetSpriteBitmap(hFox) == 1) &&
(GetSpriteDirection(hFox) == RIGHT) )
{
SetSpriteActive( hApple, TRUE );
SetSpriteX( hApple, GetSpriteX(hFox) + 60 * C_UNIT, P_ABSOLUTE );
SetSpriteY( hApple, GetSpriteY(hFox) + 30 * C_UNIT, P_ABSOLUTE );
SetSpriteVelX( hApple, 8 * C_UNIT, P_ABSOLUTE );
SetSpriteVelY( hApple, -4 * C_UNIT, P_ABSOLUTE );
SetSpriteAccX( hApple, 0, P_ABSOLUTE );
SetSpriteAccY( hApple, C_UNIT / 4, P_ABSOLUTE );
}
else if( (GetSpriteBitmap(hFox) == 1) &&
(GetSpriteDirection(hFox) == LEFT) )
{
SetSpriteActive( hApple, TRUE );
SetSpriteX( hApple, GetSpriteX(hFox) + 15 * C_UNIT, P_ABSOLUTE );
SetSpriteY( hApple, GetSpriteY(hFox) + 30 * C_UNIT, P_ABSOLUTE );
SetSpriteVelX( hApple, -8 * C_UNIT, P_ABSOLUTE );
SetSpriteVelY( hApple, -4 * C_UNIT, P_ABSOLUTE );
SetSpriteAccX( hApple, 0, P_ABSOLUTE );
SetSpriteAccY( hApple, C_UNIT / 4, P_ABSOLUTE );
}
break;
case THROW:
if( !GetSpriteSwitchDone(hFox) == FALSE )
{
SetSpriteAction( hFox, STILL, SAME );
SetSpriteSwitchType( hFox, HOR );
SetSpriteSwitch( hFox, 0, P_ABSOLUTE );
SetSpriteSwitchDone( hFox, FALSE );
SoundPlayEffect( SOUND_THROW );
}
else if( (GetSpriteBitmap(hFox) == 1) &&
(GetSpriteDirection(hFox) == RIGHT) )
{
SetSpriteActive( hApple, TRUE );
SetSpriteX( hApple, GetSpriteX(hFox) + 60 * C_UNIT, P_ABSOLUTE );
SetSpriteY( hApple, GetSpriteY(hFox) + 50 * C_UNIT, P_ABSOLUTE );
SetSpriteVelX( hApple, 8 * C_UNIT, P_ABSOLUTE );
SetSpriteVelY( hApple, -4 * C_UNIT, P_ABSOLUTE );
SetSpriteAccX( hApple, 0, P_ABSOLUTE );
SetSpriteAccY( hApple, C_UNIT / 4, P_ABSOLUTE );
}
else if( (GetSpriteBitmap(hFox) == 1) &&
(GetSpriteDirection(hFox) == LEFT) )
{
SetSpriteActive( hApple, TRUE );
SetSpriteX( hApple, GetSpriteX(hFox) + 20 * C_UNIT, P_ABSOLUTE );
SetSpriteY( hApple, GetSpriteY(hFox) + 50 * C_UNIT, P_ABSOLUTE );
SetSpriteVelX( hApple, -8 * C_UNIT, P_ABSOLUTE );
SetSpriteVelY( hApple, -4 * C_UNIT, P_ABSOLUTE );
SetSpriteAccX( hApple, 0, P_ABSOLUTE );
SetSpriteAccY( hApple, C_UNIT / 4, P_ABSOLUTE );
}
break;
case JUMP:
if( (foxSpeedY >= 0) && (!GetSpriteSwitchForward( hFox ) == FALSE) )
{
SetSpriteSwitchForward( hFox, FALSE );
}
else if( GetSpriteSwitchForward( hFox ) == FALSE )
{
if( (!GetSurface( hForeground, hFox ) == FALSE) ||
(!GetSurface( hForeground, hFox ) == FALSE) )
{
if( foxSpeedX >= C_FOX_RUNMOVE )
{
SetSpriteAction( hFox, RUN, SAME );
SetSpriteSwitch( hFox, C_FOX_RUNSWITCH, P_ABSOLUTE );
}
else if( foxSpeedX == 0 )
{
SetSpriteAction( hFox, STILL, SAME );
SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE );
}
else
{
SetSpriteAction( hFox, WALK, SAME );
SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE );
}
SetSpriteAccY( hFox, 0, P_ABSOLUTE );
SetSpriteVelY( hFox, 0, P_ABSOLUTE );
SetSpriteSwitchType( hFox, HOR );
SetSpriteSwitchForward( hFox, TRUE );
// SetSurface( hForeground, hFox );
SetSpriteSwitchDone( hFox, FALSE );
}
}
break;
}
/*
* Bear Actions
*/
bearActions:
foxX = GetSpriteX( hFox );
foxY = GetSpriteY( hFox );
bearX = GetSpriteX( hBear );
bearY = GetSpriteY( hBear );
appleX = GetSpriteX( hApple );
appleY = GetSpriteY( hApple );
switch( GetSpriteAction( hBear ) ) {
case STRIKE:
if( GetSpriteBitmap( hBear ) == 2 )
{
if( (bearX > foxX - C_UNIT * 30) && (bearX < foxX + C_UNIT * 40) &&
(bearY < foxY + C_UNIT * 60) )
{
SetSpriteActive( hFox, FALSE );
if( !fBearPlaying )
{
SoundPlayEffect( SOUND_BEARSTRIKE );
fBearPlaying = TRUE;
}
}
else
{
SetSpriteAction( hBear, MISS, SAME );
SetSpriteSwitch( hBear, C_BEAR_MISSSWITCH, P_ABSOLUTE );
SetSpriteSwitchDone( hBear, FALSE );
}
}
else if( !GetSpriteSwitchDone( hBear ) == FALSE )
{
SetSpriteAction( hBear, CHEW, SAME );
SetSpriteSwitchDone( hBear, FALSE );
chewCount = 0;
fBearPlaying = FALSE;
}
break;
case MISS:
if( !fBearPlaying )
{
SoundPlayEffect( SOUND_BEARMISS );
fBearPlaying = TRUE;
}
if( !GetSpriteSwitchDone( hBear ) == FALSE )
{
SetSpriteAction( hBear, WALK, SAME );
SetSpriteVelX( hBear, -C_BEAR_WALKMOVE, P_ABSOLUTE );
SetSpriteSwitch( hBear, C_BEAR_WALKSWITCH, P_ABSOLUTE );
SetSpriteSwitchType( hBear, HOR );
fBearPlaying = FALSE;
}
break;
case WALK:
if( (!GetSpriteActive(hApple) == FALSE) && (appleX > bearX) &&
(appleX > bearX + 80 * C_UNIT) && (appleY > bearY + 30 * C_UNIT) )
{
SetSpriteAction( hBear, STRIKE, SAME );
SetSpriteVelX( hBear, 0, P_ABSOLUTE );
SetSpriteSwitchType( hBear, TIMESWITCH );
SetSpriteSwitch( hBear, C_BEAR_STRIKESWITCH, P_ABSOLUTE );
SetSpriteSwitchDone( hBear, FALSE );
}
else if( (bearX > foxX - C_UNIT * 30) &&
(bearX < foxX + C_UNIT * 30) &&
(bearY < foxY + C_UNIT * 60) )
{
SetSpriteAction( hBear, STRIKE, SAME );
SetSpriteVelX( hBear, 0, P_ABSOLUTE );
SetSpriteSwitchType( hBear, TIMESWITCH );
SetSpriteSwitch( hBear, C_BEAR_STRIKESWITCH, P_ABSOLUTE );
SetSpriteSwitchDone( hBear, FALSE );
}
break;
case CHEW:
++chewCount;
if( chewCount >= 200 )
{
SetSpriteAction( hBear, STRIKE, SAME );
SetSpriteSwitch( hBear, C_BEAR_STRIKESWITCH, P_ABSOLUTE );
SetSpriteVelX( hBear, 0, P_ABSOLUTE );
SetSpriteSwitchDone( hBear, FALSE );
if( GetSpriteDirection(hFox) == RIGHT )
{
SetPlaneSlideX( hForeground, -C_BOUNDDIF, P_RELATIVE );
SetPlaneSlideX( hMidground, -C_BOUNDDIF, P_RELATIVE );
SetPlaneSlideX( hBackground, -C_BOUNDDIF, P_RELATIVE );
}
chewDif = GetSpriteX(hFox);
SetSpriteActive( hFox, TRUE );
SetSpriteAction( hFox, STUNNED, LEFT );
SetSpriteX( hFox, GetSpriteX(hBear), P_ABSOLUTE );
SetSpriteY( hFox, GetSpriteY(hBear), P_ABSOLUTE );
SetSpriteAccX( hFox, 0, P_ABSOLUTE );
SetSpriteAccY( hFox, C_UNIT / 2, P_ABSOLUTE );
SetSpriteVelX( hFox, -8 * C_UNIT, P_ABSOLUTE );
SetSpriteVelY( hFox, -10 * C_UNIT, P_ABSOLUTE );
SetSpriteSwitch( hFox, 0, P_ABSOLUTE );
SoundPlayEffect( SOUND_STUNNED );
chewDif -= GetSpriteX(hFox);
SetPlaneSlideX( hForeground, -chewDif, P_RELATIVE );
SetPlaneSlideX( hMidground, -chewDif, P_RELATIVE );
SetPlaneSlideX( hBackground, -chewDif, P_RELATIVE );
SetPlaneIncremX( hForeground, C_BOUNDINCREM, P_ABSOLUTE );
SetPlaneIncremX( hMidground, C_BOUNDINCREM, P_ABSOLUTE );
SetPlaneIncremX( hBackground, C_BOUNDINCREM, P_ABSOLUTE );
}
break;
}
/*
* Apple actions...
*/
if( (GetSpriteVelY(hApple) != 0) && (GetSpriteY(hApple) >= 420 * C_UNIT) )
{
SetSpriteX( hApple, 0, P_ABSOLUTE );
SetSpriteY( hApple, 0, P_ABSOLUTE );
SetSpriteAccX( hApple, 0, P_ABSOLUTE );
SetSpriteAccY( hApple, 0, P_ABSOLUTE );
SetSpriteVelX( hApple, 0, P_ABSOLUTE );
SetSpriteVelY( hApple, 0, P_ABSOLUTE );
SetSpriteActive( hApple, FALSE );
}
return cont;
} /* ProcessInput */