GAMEPROC.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:44k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
  4.  *  Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved.
  5.  *
  6.  *  File: gameproc.c
  7.  *  Content: Game processing routines
  8.  *
  9.  ***************************************************************************/
  10. #include "foxbear.h"
  11.     
  12. GFX_HBM hBuffer;
  13. HBITMAPLIST *hBitmapList;
  14. HBITMAPLIST *hTileList;
  15. HPOSLIST *hForePosList;
  16. HPOSLIST *hMidPosList;
  17. HPOSLIST *hBackPosList;
  18. HSURFACELIST *hSurfaceList;
  19. HPLANE *hForeground;
  20. HPLANE *hMidground;
  21. HPLANE *hBackground;
  22. HSPRITE *hFox;
  23. HSPRITE *hBear;
  24. HSPRITE *hApple;
  25. USHORT chewCount;
  26. LONG chewDif;
  27. /*
  28.  * ErrorMessage
  29.  */
  30. void ErrorMessage( CHAR *pText )
  31. {
  32.     char ach[128];
  33.     wsprintf( ach, "FOXBEAR FATAL ERROR: %srn", pText );
  34.     OutputDebugString(ach);
  35.     gfxEnd( hBuffer );
  36.     exit( 0 );
  37. } /* ErrorMessage */
  38. /*
  39.  * InitBuffer
  40.  */
  41. BOOL InitBuffer( GFX_HBM *hBuffer )
  42. {
  43.     *hBuffer = gfxBegin();
  44.     if( *hBuffer == NULL )
  45.     {
  46.         ErrorMessage( "gfxBegin failed" );
  47.         return FALSE;
  48.     }
  49.     return TRUE;
  50. } /* InitBuffer */
  51. /*
  52.  * DestroyBuffer 
  53.  */
  54. void DestroyBuffer ( GFX_HBM hBuffer )
  55. {
  56.     if( gfxEnd( hBuffer ) == FALSE )
  57.     {
  58.         ErrorMessage( "gfxEnd in DestroyBuffer" );
  59.     }
  60. } /* DestroyBuffer */
  61. /*
  62.  * LoadBitmaps
  63.  */
  64. HBITMAPLIST *LoadBitmaps( void )
  65. {
  66.     HBITMAPLIST *hBitmapList;
  67.     CHAR  fileName[32];
  68.     USHORT  i;
  69.     USHORT  n;
  70.     BOOL     bInitDone = TRUE;
  71.     if( !FastFileInit( "foxbear.art", 5 ) )
  72.     {
  73.         Msg( "Could not load art file err=%08lX" , GetLastError());
  74.         IDirectDraw_FlipToGDISurface(lpDD);
  75.         MessageBox(hWndMain,"Could not load art file","Error",MB_OK);
  76.         return NULL;
  77.     }
  78.     hBitmapList = CMemAlloc( C_TILETOTAL + C_FBT + C_BBT, sizeof (HBITMAPLIST) );
  79.     
  80.     Msg( "Loading tiles" );
  81.     for( i = 0; i < C_TILETOTAL; ++i )
  82.     {
  83.         wsprintf( fileName, "%03u.BMP", i + 1 );
  84.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  85.         if(hBitmapList[i].hBM == NULL)
  86.             bInitDone = FALSE;
  87.     }
  88.     n = C_TILETOTAL;
  89.     Msg( "Loading FoxWalk" );
  90.     for( i = n; i < n + C_FOXWALK; ++i )
  91.     {
  92.         wsprintf( fileName, "FW%02uR.BMP", i - n + 1 );
  93.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  94.         if(hBitmapList[i].hBM == NULL)
  95.             bInitDone = FALSE;
  96.     }
  97.     n += C_FOXWALK;
  98.     Msg( "Loading FoxWalk2" );
  99.     for( i = n; i < n + C_FOXWALK; ++i )
  100.     {
  101.         wsprintf( fileName, "FW%02uL.BMP", i - n + 1 );
  102.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  103.         if(hBitmapList[i].hBM == NULL)
  104.             bInitDone = FALSE;
  105.     }
  106.     n += C_FOXWALK;
  107.     Msg( "Loading FoxRun" );
  108.     for( i = n; i < n + C_FOXRUN; ++i )
  109.     {
  110.         wsprintf( fileName, "FR%02uR.BMP", i - n + 1 );
  111.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  112.         if(hBitmapList[i].hBM == NULL)
  113.             bInitDone = FALSE;
  114.     }
  115.     n += C_FOXRUN;
  116.     Msg( "Loading FoxRun2" );
  117.     for( i = n; i < n + C_FOXRUN; ++i )
  118.     {
  119.         wsprintf( fileName, "FR%02uL.BMP", i - n + 1 );
  120.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  121.         if(hBitmapList[i].hBM == NULL)
  122.             bInitDone = FALSE;
  123.     }
  124.     n += C_FOXRUN;
  125.     Msg( "Loading FoxStill" );
  126.     for( i = n; i < n + C_FOXSTILL; ++i )
  127.     {
  128.         wsprintf( fileName, "FS%1uR.BMP", i - n + 1 );
  129.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  130.         if(hBitmapList[i].hBM == NULL)
  131.             bInitDone = FALSE;
  132.     }
  133.     n += C_FOXSTILL;
  134.     Msg( "Loading FoxStill2" );
  135.     for( i = n; i < n + C_FOXSTILL; ++i )
  136.     {
  137.         wsprintf( fileName, "FS%1uL.BMP", i - n + 1 );
  138.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  139.         if(hBitmapList[i].hBM == NULL)
  140.             bInitDone = FALSE;
  141.     }
  142.     n += C_FOXSTILL;
  143.     Msg( "Loading FoxStunned" );
  144.     for( i = n; i < n + C_FOXSTUNNED; ++i )
  145.     {
  146.         wsprintf( fileName, "FK%1uR.BMP", i - n + 1 );
  147.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  148.         if(hBitmapList[i].hBM == NULL)
  149.             bInitDone = FALSE;
  150.     }
  151.     n += C_FOXSTUNNED;
  152.     Msg( "Loading FoxStunned2" );
  153.     for( i = n; i < n + C_FOXSTUNNED; ++i )
  154.     {
  155.         wsprintf( fileName, "FK%1uL.BMP", i - n + 1 );
  156.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  157.         if(hBitmapList[i].hBM == NULL)
  158.             bInitDone = FALSE;
  159.     }
  160.     n += C_FOXSTUNNED;
  161.     Msg( "Loading FoxCrouch" );
  162.     for( i = n; i < n + C_FOXCROUCH; ++i )
  163.     {
  164.         wsprintf( fileName, "FC%1uR.BMP", i - n + 1 );
  165.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  166.         if(hBitmapList[i].hBM == NULL)
  167.             bInitDone = FALSE;
  168.     }
  169.     n += C_FOXCROUCH;
  170.     Msg( "Loading FoxCrouch2" );
  171.     for( i = n; i < n + C_FOXCROUCH; ++i )
  172.     {
  173.         wsprintf( fileName, "FC%1uL.BMP", i - n + 1 );
  174.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  175.         if(hBitmapList[i].hBM == NULL)
  176.             bInitDone = FALSE;
  177.     }
  178.     n += C_FOXCROUCH;
  179.     Msg( "Loading FoxStop" );
  180.     for( i = n; i < n + C_FOXSTOP; ++i )
  181.     {
  182.         wsprintf( fileName, "FCD%1uR.BMP", i - n + 1 );
  183.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  184.         if(hBitmapList[i].hBM == NULL)
  185.             bInitDone = FALSE;
  186.     }
  187.     n += C_FOXSTOP;
  188.     Msg( "Loading FoxStop2" );
  189.     for( i = n; i < n + C_FOXSTOP; ++i )
  190.     {
  191.         wsprintf( fileName, "FCD%1uL.BMP", i - n + 1 );
  192.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  193.         if(hBitmapList[i].hBM == NULL)
  194.             bInitDone = FALSE;
  195.     }
  196.     n += C_FOXSTOP;
  197.     Msg( "Loading FoxThrow" );
  198.     for( i = n; i < n + C_FOXTHROW; ++i )
  199.     {
  200.         wsprintf( fileName, "FT%1uR.BMP", i - n + 1 );
  201.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  202.         if(hBitmapList[i].hBM == NULL)
  203.             bInitDone = FALSE;
  204.     }
  205.     n += C_FOXTHROW;
  206.     Msg( "Loading FoxThrow2" );
  207.     for( i = n; i < n + C_FOXTHROW; ++i )
  208.     {
  209.         wsprintf( fileName, "FT%1uL.BMP", i - n + 1 );
  210.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  211.         if(hBitmapList[i].hBM == NULL)
  212.             bInitDone = FALSE;
  213.     }
  214.     n += C_FOXTHROW;
  215.     Msg( "Loading FoxJumpThrow" );
  216.     for( i = n; i < n + C_FOXJUMPTHROW; ++i )
  217.     {
  218.         wsprintf( fileName, "FJT%1uR.BMP", i - n + 1 );
  219.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  220.         if(hBitmapList[i].hBM == NULL)
  221.             bInitDone = FALSE;
  222.     }
  223.     n += C_FOXJUMPTHROW;
  224.     Msg( "Loading FoxJumpThrow2" );
  225.     for( i = n; i < n + C_FOXJUMPTHROW; ++i )
  226.     {
  227.         wsprintf( fileName, "FJT%1uL.BMP", i - n + 1 );
  228.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  229.         if(hBitmapList[i].hBM == NULL)
  230.             bInitDone = FALSE;
  231.     }
  232.     n += C_FOXJUMPTHROW;
  233.     Msg( "Loading FoxJump" );
  234.     for( i = n; i < n + C_FOXJUMP; ++i )
  235.     {
  236.         wsprintf( fileName, "FJ%1uR.BMP", i - n + 1 );
  237.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  238.         if(hBitmapList[i].hBM == NULL)
  239.             bInitDone = FALSE;
  240.     }
  241.     n += C_FOXJUMP;
  242.     Msg( "Loading FoxJump2" );
  243.     for( i = n; i < n + C_FOXJUMP; ++i )
  244.     {
  245.         wsprintf( fileName, "FJ%1uL.BMP", i - n + 1 );
  246.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  247.         if(hBitmapList[i].hBM == NULL)
  248.             bInitDone = FALSE;
  249.     }
  250.     n += C_FOXJUMP;
  251.     Msg( "Loading FoxCrouchWalk" );
  252.     for( i = n; i < n + C_FOXCROUCHWALK; ++i )
  253.     {
  254.         wsprintf( fileName, "FCW%02uR.BMP", i - n + 1 );
  255.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  256.         if(hBitmapList[i].hBM == NULL)
  257.             bInitDone = FALSE;
  258.     }
  259.     n += C_FOXCROUCHWALK;
  260.     Msg( "Loading FoxCrouchWalk2" );
  261.     for( i = n; i < n + C_FOXCROUCHWALK; ++i )
  262.     {
  263.         wsprintf( fileName, "FCW%02uL.BMP", i - n + 1 );
  264.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  265.         if(hBitmapList[i].hBM == NULL)
  266.             bInitDone = FALSE;
  267.     }
  268.     n += C_FOXCROUCHWALK;
  269.     Msg( "Loading FoxBlurr" );
  270.     for( i = n; i < n + C_FOXBLURR; ++i )
  271.     {
  272.         wsprintf( fileName, "FB%02uR.BMP", i - n + 1 );
  273.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  274.         if(hBitmapList[i].hBM == NULL)
  275.             bInitDone = FALSE;
  276.     }
  277.     n += C_FOXBLURR;
  278.     Msg( "Loading FoxBlurr2" );
  279.     for( i = n; i < n + C_FOXBLURR; ++i )
  280.     {
  281.         wsprintf( fileName, "FB%02uL.BMP", i - n + 1 );
  282.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  283.         if(hBitmapList[i].hBM == NULL)
  284.             bInitDone = FALSE;
  285.     }
  286.     n += C_FOXBLURR;
  287.     Msg( "Loading BearMiss" );
  288.     for( i = n; i < n + C_BEARMISS; ++i )
  289.     {
  290.         wsprintf( fileName, "BM%1uL.BMP", i - n + 1 );
  291.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  292.         if(hBitmapList[i].hBM == NULL)
  293.             bInitDone = FALSE;
  294.     }
  295.     n += C_BEARMISS;
  296.     Msg( "Loading BearStrike" );
  297.     for( i = n; i < n + C_BEARSTRIKE; ++i )
  298.     {
  299.         wsprintf( fileName, "BS%02uL.BMP", i - n + 1 );
  300.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  301.         if(hBitmapList[i].hBM == NULL)
  302.             bInitDone = FALSE;
  303.     }
  304.     n += C_BEARSTRIKE;
  305.     Msg( "Loading BearWalk" );
  306.     for( i = n; i < n + C_BEARWALK; ++i )
  307.     {
  308.         wsprintf( fileName, "BW%02uL.BMP", i - n + 1 );
  309.         hBitmapList[i].hBM = gfxLoadBitmap( fileName );
  310.         if(hBitmapList[i].hBM == NULL)
  311.             bInitDone = FALSE;
  312.     }
  313.     n += C_BEARWALK;
  314.     FastFileFini();
  315.     if(bInitDone == FALSE)
  316.     {
  317.         Msg("Error while loading Bitmaps");
  318.         return NULL;
  319.     }
  320.     return hBitmapList;
  321. } /* LoadBitmaps */
  322. /*
  323.  * InitTiles
  324.  */
  325. void InitTiles(
  326.               HBITMAPLIST **hTileList,
  327.               HBITMAPLIST *hBitmapList,
  328.               USHORT tileCount )
  329. {
  330.     *hTileList = CreateTiles( hBitmapList, tileCount );
  331. } /* InitTiles */
  332. /*
  333.  * InitPlane
  334.  */
  335. void InitPlane(
  336.    HPLANE **hPlane,
  337.               HPOSLIST **hPosList,
  338.   LPSTR szFileName,
  339.               USHORT width,
  340.               USHORT height,
  341.               USHORT denom )
  342. {
  343.     *hPlane   = CreatePlane( width, height, denom );
  344.     *hPosList = CreatePosList( szFileName, width, height );
  345. } /* InitPlane */
  346. /*
  347.  * InitSurface
  348.  */
  349. void InitSurface(
  350.         HSURFACELIST **pphSurfaceList,
  351.         CHAR *szFileName,
  352.         USHORT width,
  353.         USHORT height )
  354. {
  355.     *pphSurfaceList = CreateSurfaceList( szFileName, width, height );
  356. } /* InitSurface */
  357. /*
  358.  * InitFox
  359.  */
  360. void InitFox ( HSPRITE **pphFox, HBITMAPLIST *phBitmapList )
  361. {
  362.     GFX_HBM   hBM;
  363.     GFX_HBM   hBM_src;
  364.     ACTION    action;
  365.     DIRECTION direction;
  366.     USHORT    i;
  367.     LONG      startX = C_FOX_STARTX;
  368.     LONG      startY = C_FOX_STARTY;
  369.     USHORT    boundW = 108;
  370.     USHORT    boundH = 105;
  371.     LONG      as =   6;
  372.     SHORT     x[C_FBT] = {  7, 15, 18, 11,  6,  3,  7, 15, 17, 11,  6,  3,
  373.                          7, 15, 18, 11,  6,  3,  7, 15, 17, 11,  6,  3,
  374.                         10,  3,  5, 16,  9, 13, 31, 24,  9,  3,  5, 16, 10, 13, 33, 23,
  375.                         10,  3,  5, 16,  9, 13, 31, 24,  9,  3,  5, 16, 10, 13, 33, 23,
  376.                         11, 11, 31, 31,  7,  7, 27, 27,  8, 10,  8, 10,
  377.                         26,  6, 26,  6, 17, 21, 21, 24, 17, 21, 21, 24,
  378.                          1,  0,  0,  1,  0,  0,  1,  0,  0,  1,  1,  1,
  379.                          1,  0,  0,  1,  0,  0,  1,  0,  0,  1,  1,  1,
  380.                          2,  2, -1,  0,  2,  2, -1,  0 };
  381.     SHORT     y[C_FBT] = { 20, 24, 26, 25, 27, 19, 20, 25, 26, 25, 29, 21,
  382.                         20, 24, 26, 25, 27, 19, 20, 25, 26, 25, 29, 21,
  383.                         42, 42, 31, 19, 13, 11, 20, 33, 40, 43, 31, 19, 14, 12, 20, 33,
  384.                         42, 42, 31, 19, 13, 11, 20, 33, 40, 43, 31, 19, 14, 12, 20, 33,
  385.                         14, 14, 20, 20, 58, 58, 26, 26, 20, 24, 20, 24,
  386.                          0,  9,  0,  9, 20, 11, 10,  9, 20, 11, 10,  9,
  387.                         61, 61, 61, 61, 60, 60, 61, 61, 61, 61, 60, 60,
  388.                         61, 61, 61, 61, 60, 60, 61, 61, 61, 61, 60, 60,
  389.                         45, 45, 45, 45, 45, 45, 45, 45 };
  390.     USHORT    w[C_FBT] = { 75, 73, 73, 82, 92, 84, 74, 74, 73, 81, 91, 84, 
  391.                         75, 73, 73, 82, 92, 84, 74, 74, 73, 81, 91, 84,
  392.                         88, 92, 88, 78, 80, 78, 70, 84, 88, 92, 88, 78, 79, 79, 68, 85,
  393.                         88, 92, 88, 78, 80, 78, 70, 84, 88, 92, 88, 78, 79, 79, 68, 85,
  394.                         65, 65, 61, 61, 88, 88, 72, 72, 57, 86, 57, 86, 
  395.                         54, 92, 54, 92, 59, 57, 57, 52, 59, 57, 57, 52,
  396.                         98, 99, 99, 99,100,100, 98,101,100, 99,100, 98,
  397.                         98, 99, 99, 99,100,100, 98,101,100, 99,100, 98,
  398.                         94, 94, 97, 96, 94, 94, 97, 96 };
  399.     USHORT    h[C_FBT] = { 78, 74, 72, 73, 71, 79, 78, 73, 72, 73, 69, 77, 
  400.                         78, 74, 72, 73, 71, 79, 78, 73, 72, 73, 69, 77,
  401.                         56, 56, 67, 79, 85, 87, 78, 65, 58, 55, 67, 79, 84, 86, 78, 65,
  402.                         56, 56, 67, 79, 85, 87, 78, 65, 58, 55, 67, 79, 84, 86, 78, 65,
  403.                         84, 84, 85, 85, 40, 40, 72, 72, 78, 74, 78, 74,
  404.                         88, 82, 88, 82, 84, 87, 86, 85, 84, 87, 86, 85,
  405.                         37, 37, 37, 37, 38, 38, 37, 37, 37, 37, 38, 38,
  406.                         37, 37, 37, 37, 38, 38, 37, 37, 37, 37, 38, 38,
  407.                         54, 53, 51, 54, 54, 53, 51, 54 };
  408.     *pphFox = CreateSprite( C_FBT, startX, startY, boundW, boundH, C_FORE_W * C_TILE_W, C_FORE_H * C_TILE_H, (SHORT) as, TRUE );
  409.     for( i = 0; i < C_FBT; ++i )
  410.     {
  411.         hBM_src = phBitmapList[i + C_TILETOTAL].hBM;
  412.         if( i < 12 )
  413.         {
  414.             action = WALK;
  415.             direction = RIGHT;
  416.         }
  417.         else if( (i >= 12) && (i < 24) )
  418.         {
  419.             action = WALK;
  420.             direction = LEFT;
  421.         }
  422.         else if( (i >= 24) && (i < 40) )
  423.         {
  424.             action = RUN;
  425.             direction = RIGHT;
  426.         }
  427.         else if( (i >= 40) && (i < 56) )
  428.         {
  429.             action = RUN;
  430.             direction = LEFT;
  431.         }
  432.         else if( i == 56 )
  433.         {
  434.             action = STILL;
  435.             direction = RIGHT;
  436.         }
  437.         else if( i == 57 )
  438.         {
  439.             action = STILL;
  440.             direction = LEFT;
  441.         }
  442.         else if( i == 58 )
  443.         {
  444.             action = STUNNED;
  445.             direction = RIGHT;
  446.         }
  447.         else if( i == 59 )
  448.         {
  449.             action = STUNNED;
  450.             direction = LEFT;
  451.         }
  452.         else if( i == 60 )
  453.         {
  454.             action = CROUCH;
  455.             direction = RIGHT;
  456.         }
  457.         else if( i == 61 )
  458.         {
  459.             action = CROUCH;
  460.             direction = LEFT;
  461.         }
  462.         else if( i == 62 )
  463.         {
  464.             action = STOP;
  465.             direction = RIGHT;
  466.         }
  467.         else if( i == 63 )
  468.         {
  469.             action = STOP;
  470.             direction = LEFT;
  471.         }
  472.         else if( (i >= 64) && (i < 66) )
  473.         {
  474.             action = THROW;
  475.             direction = RIGHT;
  476.         }
  477.         else if( (i >= 66) && (i < 68) )
  478.         {
  479.             action = THROW;
  480.             direction = LEFT;
  481.         }
  482.         else if( (i >= 68) && (i < 70) )
  483.         {
  484.             action = JUMPTHROW;
  485.             direction = RIGHT;
  486.         }
  487.         else if( (i >= 70) && (i < 72) )
  488.         {
  489.             action = JUMPTHROW;
  490.             direction = LEFT;
  491.         }
  492.         else if( (i >= 72) && (i < 76) )
  493.         {
  494.             action = JUMP;
  495.             direction = RIGHT;
  496.         }
  497.         else if( (i >= 76) && (i < 80) )
  498.         {
  499.             action = JUMP;
  500.             direction = LEFT;
  501.         }
  502.         else if( (i >= 80) && (i < 92) )
  503.         {
  504.             action = CROUCHWALK;
  505.             direction = RIGHT;
  506.         }
  507.         else if( (i >= 92) && (i < 104) )
  508.         {
  509.             action = CROUCHWALK;
  510.             direction = LEFT;
  511.         }
  512.         else if( (i >= 104) && (i < 108) )
  513.         {
  514.             action = BLURR;
  515.             direction = RIGHT;
  516.         }
  517.         else if( (i >= 108) && (i < 112) )
  518.         {
  519.             action = BLURR;
  520.             direction = LEFT;
  521.         }
  522.         hBM = hBM_src;
  523.         BitBltSprite( 
  524.             *pphFox,
  525.             hBM, 
  526.             action,
  527.             direction,
  528.             x[i], 
  529.             y[i], 
  530.             w[i], 
  531.             h[i] );
  532.     }
  533.     SetSpriteAction( *pphFox, STILL, RIGHT );
  534. } /* InitFox */
  535. /*
  536.  * InitBear
  537.  */
  538. void InitBear( HSPRITE **pphBear, HBITMAPLIST *phBitmapList )
  539. {
  540.     GFX_HBM   hBM_src;
  541.     ACTION    action;
  542.     DIRECTION direction;
  543.     USHORT    i;
  544.     LONG      startX = C_BEAR_STARTX;
  545.     LONG      startY = C_BEAR_STARTY;
  546.     USHORT    boundW = 196;
  547.     USHORT    boundH =  88;
  548.     LONG      as =   6;
  549.     USHORT    x[C_BBT] = { 14, 10,
  550.                          8, 12, 13, 14, 10, 10,  9,  9,  9,  9,  8, 9,
  551.                         11,  6,  1,  0,  3, 13, 11,  7,  1,  1,  3, 14 };
  552.     USHORT    y[C_BBT] = {  7,  7,
  553.                          3,  8,  9,  7,  7,  3,  3,  3,  3,  3,  3,  3,        
  554.                          1,  1,  2,  2,  3,  1,  0,  1,  1,  2,  3,  2 };
  555.     USHORT    w[C_BBT] = {127,129,
  556.                        127,153,183,153,129,138,146,150,152,151,143,139,
  557.                        131,136,140,141,136,125,131,135,140,140,136,126 };
  558.     USHORT    h[C_BBT] = { 80, 80,
  559.                         84, 79, 78, 80, 80, 84, 84, 84, 84, 84, 84, 84,
  560.                         86, 86, 86, 85, 84, 86, 87, 86, 87, 85, 84, 86 };
  561.     *pphBear = CreateSprite( C_BBT, startX, startY, boundW, boundH, C_FORE_W * C_TILE_W, C_FORE_H * C_TILE_H, (SHORT) as, TRUE );
  562.     for( i = 0; i < C_BBT; ++i )
  563.     {
  564.         hBM_src = phBitmapList[i + C_TILETOTAL + C_FBT].hBM;
  565.         if( i < 2 )
  566.         {
  567.             action = MISS;
  568.             direction = LEFT;
  569.         }
  570.         else if( (i >= 2) && (i < 8) )
  571.         {
  572.             action = STRIKE;
  573.             direction = LEFT;
  574.         }
  575.         else if( (i >= 8) && (i < 14) )
  576.         {
  577.             action = CHEW;
  578.             direction = LEFT;
  579.         }
  580.         else if( (i >= 14) && (i < 26) )
  581.         {
  582.             action = WALK;
  583.             direction = LEFT;
  584.         }        
  585.         BitBltSprite ( 
  586.             *pphBear,
  587.             hBM_src,
  588.             action, 
  589.             direction,
  590.             x[i], 
  591.             y[i], 
  592.             w[i], 
  593.             h[i] );
  594.     }
  595.     SetSpriteAction( *pphBear, WALK, LEFT );
  596.     SetSpriteVelX( *pphBear, -C_BEAR_WALKMOVE, P_ABSOLUTE );
  597.     SetSpriteSwitch( *pphBear, C_BEAR_WALKSWITCH, P_ABSOLUTE );
  598. } /* InitBear */
  599. /*
  600.  * InitApple
  601.  */
  602. VOID InitApple ( HSPRITE **pphApple, HBITMAPLIST *phBitmapList )
  603. {
  604.     *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 );
  605.     BitBltSprite( *pphApple, phBitmapList[61].hBM, NONE, RIGHT, 0, 0, 32, 32 );
  606.     SetSpriteAction( *pphApple, NONE, RIGHT );
  607. } /* InitApple */
  608. /*
  609.  * PreInitializeGame
  610.  */
  611. BOOL PreInitializeGame( void )
  612. {
  613.     return InitBuffer( &hBuffer);
  614. } /* PreInitializeGame */
  615. /*
  616.  * InitializeGame
  617.  */
  618. BOOL InitializeGame ( void )
  619. {
  620.     Splash();
  621.     hBitmapList = LoadBitmaps();
  622.     if( hBitmapList == NULL )
  623.     {
  624.         return FALSE;
  625.     }
  626.     InitTiles( &hTileList, hBitmapList, C_TILETOTAL );
  627.         
  628.     InitPlane( &hForeground, &hForePosList, "FORELIST", C_FORE_W, C_FORE_H, C_FORE_DENOM );
  629.     TilePlane( hForeground, hTileList, hForePosList );
  630.     InitPlane( &hMidground, &hMidPosList, "MIDLIST", C_MID_W, C_MID_H, C_MID_DENOM );
  631.     TilePlane( hMidground, hTileList, hMidPosList );
  632.     InitPlane( &hBackground, &hBackPosList, "BACKLIST", C_BACK_W, C_BACK_H, C_BACK_DENOM );
  633.     TilePlane( hBackground, hTileList, hBackPosList );
  634.     InitSurface( &hSurfaceList, "SURFLIST", C_FORE_W, C_FORE_H );
  635.     SurfacePlane( hForeground, hSurfaceList );
  636.     InitFox( &hFox, hBitmapList );
  637.     InitBear( &hBear, hBitmapList );
  638.     InitApple( &hApple, hBitmapList );
  639.     DDClear();      // clear all the backbuffers.
  640.     return TRUE;
  641. } /* InitializeGame */
  642. extern void DisplayFrameRate( void );
  643. /*
  644.  * NewGameFrame
  645.  */
  646. int NewGameFrame( void )
  647. {
  648.     SetSpriteX( hFox, 0, P_AUTOMATIC );
  649.     SetSpriteY( hFox, 0, P_AUTOMATIC );
  650.                                     
  651.     SetPlaneVelX( hBackground, GetSpriteVelX(hFox), P_ABSOLUTE );
  652.     SetPlaneVelX( hMidground,  GetSpriteVelX(hFox), P_ABSOLUTE );
  653.     SetPlaneVelX( hForeground, GetSpriteVelX(hFox), P_ABSOLUTE );
  654.     SetPlaneX( hBackground, 0, P_AUTOMATIC );
  655.     SetPlaneX( hMidground,  0, P_AUTOMATIC );
  656.     SetPlaneX( hForeground, 0, P_AUTOMATIC );
  657.     SetSpriteX( hBear, 0, P_AUTOMATIC );
  658.     SetSpriteX( hApple, 0, P_AUTOMATIC );
  659.     SetSpriteY( hApple, 0, P_AUTOMATIC );
  660.     /*
  661.      * once all sprites are processed, display them
  662.      *
  663.      * If we are using destination transparency instead of source
  664.      * transparency, we need to paint the background with the color key
  665.      * and then paint our sprites and planes in reverse order.
  666.      *
  667.      * Since destination transparency will allow you to only write pixels
  668.      * on the destination if the transparent color is present, reversing
  669.      * the order (so that the topmost bitmaps are drawn first instead of
  670.      * list) causes everything to come out ok.
  671.      */
  672.     if( bTransDest )
  673.     {
  674.         gfxFillBack( dwColorKey );
  675.         DisplayFrameRate();
  676.         DisplaySprite( hBuffer, hApple, GetPlaneX(hForeground) );
  677.         DisplaySprite( hBuffer, hBear,  GetPlaneX(hForeground) );
  678.         DisplaySprite( hBuffer, hFox,   GetPlaneX(hForeground) );
  679.         DisplayPlane( hBuffer, hForeground );
  680.         DisplayPlane( hBuffer, hMidground );
  681.         DisplayPlane( hBuffer, hBackground );
  682.     }
  683.     else
  684.     {
  685.         DisplayPlane( hBuffer, hBackground );
  686.         DisplayPlane( hBuffer, hMidground );
  687.         DisplayPlane( hBuffer, hForeground );
  688.     
  689.         DisplaySprite( hBuffer, hFox,   GetPlaneX(hForeground) );
  690.         DisplaySprite( hBuffer, hBear,  GetPlaneX(hForeground) );
  691.         DisplaySprite( hBuffer, hApple, GetPlaneX(hForeground) );
  692.         DisplayFrameRate();
  693.     }
  694.                                                       
  695.     gfxSwapBuffers();
  696.     return 0;
  697. } /* NewGameFrame */
  698. /*
  699.  * DestroyGame
  700.  */
  701. void DestroyGame()
  702. {
  703.     if (hBuffer)
  704.     {
  705.         DestroyTiles( hTileList );
  706.         DestroyPlane( hForeground );
  707.         DestroyPlane( hMidground );
  708.         DestroyPlane( hBackground );
  709.         DestroyBuffer( hBuffer );
  710.         DestroySound();
  711.         hTileList   = NULL;
  712.         hForeground = NULL;
  713.         hMidground  = NULL;
  714.         hBackground = NULL;
  715.         hBuffer     = NULL;
  716.     }
  717. } /* DestroyGame */
  718. /*
  719.  * ProcessInput
  720.  */
  721. BOOL ProcessInput( SHORT input )
  722. {
  723.     static BOOL fBearPlaying = FALSE;
  724.     LONG      foxSpeedX;
  725.     LONG      foxSpeedY;
  726.     LONG      foxX;
  727.     LONG      foxY;
  728.     LONG      bearX;
  729.     LONG      bearY;
  730.     LONG      appleX;
  731.     LONG      appleY;
  732.     ACTION    foxAction;
  733.     DIRECTION foxDir;
  734.     BOOL      cont = TRUE;
  735.     foxSpeedX = GetSpriteVelX( hFox );
  736.     foxAction = GetSpriteAction( hFox );
  737.     foxDir    = GetSpriteDirection( hFox );
  738.     if( (GetSpriteActive(hFox) == FALSE) && (input != 4209) )
  739.     {
  740.         input = 0;
  741.     }
  742.     switch( input )
  743.     {
  744.     case KEY_DOWN:
  745.         if( foxAction == STOP )
  746.         {
  747.             break;
  748.         }
  749.         else if( foxAction == STILL )
  750.         {
  751.             SetSpriteAction( hFox, CROUCH, SAME );
  752.         }
  753.         else if( foxAction == WALK )
  754.         {
  755.             SetSpriteAction( hFox, CROUCHWALK, SAME );
  756.         }
  757.         break;
  758.     case KEY_LEFT:
  759.         if( foxAction == STOP )
  760.         {
  761.             break;
  762.         }
  763.         else if( foxSpeedX == 0 )
  764.         {
  765.             if( foxAction == STILL )
  766.             {
  767.               if( foxDir == RIGHT )
  768.               {
  769.                   ChangeSpriteDirection( hFox );
  770.                   SetPlaneSlideX( hForeground, -C_BOUNDDIF, P_RELATIVE );
  771.                   SetPlaneSlideX( hMidground, -C_BOUNDDIF, P_RELATIVE );
  772.                   SetPlaneSlideX( hBackground, -C_BOUNDDIF, P_RELATIVE );
  773.                   SetPlaneIncremX( hForeground, C_BOUNDINCREM, P_ABSOLUTE );
  774.                   SetPlaneIncremX( hBackground, C_BOUNDINCREM, P_ABSOLUTE );
  775.                   SetPlaneIncremX( hMidground, C_BOUNDINCREM, P_ABSOLUTE );
  776.               }
  777.               else
  778.               {
  779.                   SetSpriteAction( hFox, WALK, LEFT );
  780.                   SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE );
  781.                   SetSpriteVelX( hFox, -C_FOX_XMOVE, P_RELATIVE );
  782.               }
  783.             }
  784.             else if( foxAction == CROUCH )
  785.             {
  786.               if( foxDir == RIGHT )
  787.               {
  788.                   ChangeSpriteDirection( hFox );
  789.                   SetPlaneSlideX( hForeground, -C_BOUNDDIF, P_RELATIVE );
  790.                   SetPlaneSlideX( hMidground, -C_BOUNDDIF, P_RELATIVE );
  791.                   SetPlaneSlideX( hBackground, -C_BOUNDDIF, P_RELATIVE );
  792.                   SetPlaneIncremX( hForeground, C_BOUNDINCREM, P_ABSOLUTE );
  793.                   SetPlaneIncremX( hBackground, C_BOUNDINCREM, P_ABSOLUTE );
  794.                   SetPlaneIncremX( hMidground, C_BOUNDINCREM, P_ABSOLUTE );
  795.               }
  796.               else
  797.               {
  798.                   SetSpriteAction( hFox, CROUCHWALK, LEFT );
  799.                   SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE );
  800.                   SetSpriteVelX( hFox, -C_FOX_XMOVE, P_RELATIVE );
  801.               }
  802.             }
  803.             else
  804.             {
  805.               SetSpriteVelX( hFox, -C_FOX_XMOVE, P_RELATIVE );
  806.             }
  807.         } else {
  808.             SetSpriteVelX( hFox, -C_FOX_XMOVE, P_RELATIVE );
  809.         }
  810.         break;
  811.     case KEY_RIGHT:
  812.         if( foxAction == STOP )
  813.         {
  814.             break;
  815.         }
  816.         else if( foxSpeedX == 0 )
  817.         {
  818.             if( foxAction == STILL )
  819.             {
  820.               if( foxDir == LEFT )
  821.               {
  822.                   ChangeSpriteDirection( hFox );
  823.                   SetPlaneSlideX( hForeground, C_BOUNDDIF, P_RELATIVE );
  824.                   SetPlaneSlideX( hMidground, C_BOUNDDIF, P_RELATIVE );
  825.                   SetPlaneSlideX( hBackground, C_BOUNDDIF, P_RELATIVE );
  826.                   SetPlaneIncremX( hForeground, C_BOUNDINCREM, P_ABSOLUTE );
  827.                   SetPlaneIncremX( hBackground, C_BOUNDINCREM, P_ABSOLUTE );
  828.                   SetPlaneIncremX( hMidground, C_BOUNDINCREM, P_ABSOLUTE );
  829.               }
  830.               else
  831.               {
  832.                   SetSpriteAction( hFox, WALK, RIGHT );
  833.                   SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE );
  834.                   SetSpriteVelX( hFox, C_FOX_XMOVE, P_RELATIVE );
  835.               }
  836.             }
  837.             else if( foxAction == CROUCH )
  838.             {
  839.               if( foxDir == LEFT )
  840.               {
  841.                   ChangeSpriteDirection( hFox );
  842.                   SetPlaneSlideX( hForeground, C_BOUNDDIF, P_RELATIVE );
  843.                   SetPlaneSlideX( hMidground, C_BOUNDDIF, P_RELATIVE );
  844.                   SetPlaneSlideX( hBackground, C_BOUNDDIF, P_RELATIVE );
  845.                   SetPlaneIncremX( hForeground, C_BOUNDINCREM, P_ABSOLUTE );
  846.                   SetPlaneIncremX( hBackground, C_BOUNDINCREM, P_ABSOLUTE );
  847.                   SetPlaneIncremX( hMidground, C_BOUNDINCREM, P_ABSOLUTE );
  848.               }
  849.               else
  850.               {
  851.                   SetSpriteAction( hFox, CROUCHWALK, RIGHT );
  852.                   SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE );
  853.                   SetSpriteVelX( hFox, C_FOX_XMOVE, P_RELATIVE );
  854.               }
  855.             }
  856.             else
  857.             {
  858.               SetSpriteVelX( hFox, C_FOX_XMOVE, P_RELATIVE );
  859.             }
  860.         }
  861.         else
  862.         {
  863.             SetSpriteVelX( hFox, C_FOX_XMOVE, P_RELATIVE );
  864.         }
  865.         break;
  866.     case KEY_STOP:
  867.         if( foxAction == STOP )
  868.         {
  869.             break;
  870.         }
  871.         else if( (foxAction == RUN) || (foxAction == BLURR) )
  872.         {
  873.             SetSpriteAction( hFox, STOP, SAME );
  874.             SetSpriteAccX( hFox, -foxSpeedX / 25, P_ABSOLUTE );
  875.             SoundPlayEffect( SOUND_STOP );
  876.         } else {
  877.             SetSpriteVelX( hFox, 0, P_ABSOLUTE );
  878.         }
  879.         break;
  880.     case KEY_UP: 
  881.         if( foxAction == STOP )
  882.         {
  883.             break;
  884.         }
  885.         else if( foxAction == CROUCH )
  886.         {
  887.             SetSpriteAction( hFox, STILL, SAME );
  888.         }
  889.         else if( foxAction == CROUCHWALK )
  890.         {
  891.             SetSpriteAction( hFox, WALK, SAME );
  892.         }
  893.         break;
  894.     case KEY_JUMP:
  895.         if( foxAction == STOP )
  896.         {
  897.             break;
  898.         }
  899.         else
  900.         if( (foxAction == STILL) || (foxAction == WALK) ||
  901.             (foxAction == RUN) || (foxAction == CROUCH) ||
  902.             (foxAction == CROUCHWALK) )
  903.         {
  904.             SetSpriteAction( hFox, JUMP, SAME );
  905.             SetSpriteSwitchType( hFox, TIME );
  906.             SetSpriteSwitch( hFox, C_FOX_JUMPSWITCH, P_ABSOLUTE );
  907.             SetSpriteVelY( hFox, -C_FOX_JUMPMOVE, P_ABSOLUTE );
  908.             SetSpriteAccY( hFox, C_UNIT / 2, P_ABSOLUTE );
  909.             SoundPlayEffect( SOUND_JUMP );
  910.         }
  911.         break;
  912.     case KEY_THROW:
  913.         if( foxAction == STOP )
  914.         {
  915.             break;
  916.         }
  917.         else if( (foxAction == STILL) || (foxAction == WALK) ||
  918.                (foxAction == RUN) || (foxAction == CROUCH) ||
  919.                (foxAction == CROUCHWALK) )
  920.         {
  921.             SetSpriteAction( hFox, THROW, SAME );
  922.             SetSpriteSwitch( hFox, C_FOX_THROWSWITCH, P_ABSOLUTE );
  923.             SetSpriteVelX( hFox, 0, P_ABSOLUTE );
  924.             SetSpriteSwitchType( hFox, TIME );
  925.         }
  926.         else if( foxAction == JUMP )
  927.         {
  928.             SetSpriteAccY( hFox, 0, P_ABSOLUTE );
  929.             SetSpriteSwitch( hFox, C_FOX_THROWSWITCH, P_ABSOLUTE );
  930.             SetSpriteAction( hFox, JUMPTHROW, SAME );
  931.             SetSpriteVelY( hFox, 0, P_ABSOLUTE );
  932.             SetSpriteSwitchDone( hFox, FALSE );
  933.             SetSpriteSwitchForward( hFox, TRUE );
  934.         }
  935.         break;
  936.     default: 
  937.         break;
  938.     }
  939.     /*
  940.      * Fox actions follow...
  941.      */
  942.     if( GetSpriteActive(hFox) == FALSE )
  943.     {
  944.         goto bearActions;
  945.     }
  946.     if( abs(GetSpriteVelX( hFox )) < C_FOX_XMOVE )
  947.     {
  948.         SetSpriteVelX( hFox, 0, P_ABSOLUTE );
  949.     }
  950.     foxAction = GetSpriteAction( hFox );
  951.     if( GetSpriteVelY(hFox) == 0 )
  952.     {
  953.         if( GetSurface( hForeground, hFox ) == FALSE )
  954.         {
  955.             if( (foxAction == WALK) || (foxAction == RUN) ||
  956.              (foxAction == CROUCHWALK) )
  957.             {
  958.               SetSpriteAccY( hFox, C_UNIT / 2, P_ABSOLUTE );
  959.             }
  960.             else if( foxAction == STOP )
  961.             {
  962.               SetSpriteAccY( hFox, C_UNIT / 2, P_ABSOLUTE );
  963.               SetSpriteAccX( hFox, 0, P_ABSOLUTE );
  964.             }
  965.         }
  966.     }
  967.     else if( GetSpriteVelY(hFox) > 2 * C_UNIT )
  968.     {
  969.         if( (foxAction == WALK) || (foxAction == RUN) ||
  970.             (foxAction == CROUCHWALK) )
  971.         {
  972.             SetSpriteSwitchForward( hFox, FALSE );
  973.             SetSpriteAction( hFox, JUMP, SAME );
  974.             SetSpriteSwitchType( hFox, TIME );
  975.             SetSpriteSwitch( hFox, C_FOX_JUMPSWITCH, P_ABSOLUTE );
  976.         }
  977.         if( foxAction == STOP )
  978.         {
  979.             SetSpriteAction( hFox, STUNNED, SAME );
  980.             SetSpriteAccX( hFox, -GetSpriteVelX(hFox) / 25, P_ABSOLUTE );
  981.             SoundPlayEffect( SOUND_STUNNED );
  982.         }
  983.     }
  984.     
  985.     foxSpeedX = GetSpriteVelX( hFox );
  986.     foxSpeedY = GetSpriteVelY( hFox );
  987.     foxAction = GetSpriteAction( hFox );
  988.     foxDir    = GetSpriteDirection( hFox );
  989.     switch( foxAction ) {
  990.     case STUNNED:
  991.         if( (GetSpriteVelY(hFox) >= 0) &&
  992.             (!GetSurface( hForeground, hFox ) == FALSE) )
  993.         {
  994.             SetSpriteAccY( hFox, 0, P_ABSOLUTE );
  995.             SetSpriteAction( hFox, STOP, SAME );
  996.             SetSpriteVelY( hFox, 0, P_ABSOLUTE );
  997.             SetSpriteAccX( hFox, -foxSpeedX / 25, P_ABSOLUTE );
  998.             // SetSurface( hForeground, hFox );
  999.             SoundPlayEffect( SOUND_STOP );
  1000.         }
  1001.         break;
  1002.     case CROUCHWALK:
  1003.         if( foxSpeedX == 0 )
  1004.         {
  1005.             SetSpriteAction( hFox, CROUCH, SAME );
  1006.         }
  1007.         else if( foxSpeedX > C_FOX_WALKMOVE )
  1008.         {
  1009.             SetSpriteVelX( hFox, C_FOX_WALKMOVE, P_ABSOLUTE );
  1010.         }
  1011.         else if( foxSpeedX < -C_FOX_WALKMOVE )
  1012.         {
  1013.             SetSpriteVelX( hFox, -C_FOX_WALKMOVE, P_ABSOLUTE );
  1014.         }
  1015.         break;
  1016.         
  1017.     case STOP:   
  1018.         if( foxSpeedX == 0 )
  1019.         {
  1020.             SetSpriteAction( hFox, STILL, SAME );
  1021.             SetSpriteAccX( hFox, 0, P_ABSOLUTE );
  1022.         }
  1023.         break;
  1024.         
  1025.     case RUN:
  1026.         if( (foxSpeedX < C_FOX_WALKTORUN ) && (foxSpeedX > 0) )
  1027.         {
  1028.             SetSpriteAction( hFox, WALK, RIGHT );
  1029.             SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE );
  1030.         }
  1031.         else if( foxSpeedX > C_FOX_RUNTOBLURR )
  1032.         {
  1033.             SetSpriteAction( hFox, BLURR, RIGHT );
  1034.             SetSpriteSwitch( hFox, C_FOX_BLURRSWITCH, P_ABSOLUTE );
  1035.         }
  1036.         else if( (foxSpeedX > -C_FOX_WALKTORUN ) && (foxSpeedX < 0) )
  1037.         {
  1038.             SetSpriteAction( hFox, WALK, LEFT );
  1039.             SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE );
  1040.         }
  1041.         else if( foxSpeedX < -C_FOX_RUNTOBLURR )
  1042.         {
  1043.             SetSpriteAction( hFox, BLURR, LEFT );
  1044.             SetSpriteSwitch( hFox, C_FOX_BLURRSWITCH, P_ABSOLUTE );
  1045.         }
  1046.         break;
  1047.     case WALK:
  1048.         if( foxSpeedX == 0 )
  1049.         {
  1050.             SetSpriteAction( hFox, STILL, SAME );
  1051.         }
  1052.         else if( foxSpeedX > C_FOX_WALKTORUN )
  1053.         {
  1054.             SetSpriteAction( hFox, RUN, RIGHT );
  1055.             SetSpriteSwitch( hFox, C_FOX_RUNSWITCH, P_ABSOLUTE );
  1056.         }
  1057.         else if( foxSpeedX < -C_FOX_WALKTORUN )
  1058.         {
  1059.             SetSpriteAction( hFox, RUN, LEFT );
  1060.             SetSpriteSwitch( hFox, C_FOX_RUNSWITCH, P_ABSOLUTE );
  1061.         }
  1062.         break;
  1063.     case BLURR:
  1064.         if( (foxSpeedX < C_FOX_RUNTOBLURR ) && (foxSpeedX > C_FOX_WALKTORUN) )
  1065.         {
  1066.             SetSpriteAction( hFox, RUN, RIGHT );
  1067.             SetSpriteSwitch( hFox, C_FOX_RUNSWITCH, P_ABSOLUTE );
  1068.         }
  1069.         else if( (foxSpeedX > -C_FOX_RUNTOBLURR ) && (foxSpeedX < -C_FOX_WALKTORUN) )
  1070.         {
  1071.             SetSpriteAction( hFox, RUN, LEFT );
  1072.             SetSpriteSwitch( hFox, C_FOX_RUNSWITCH, P_ABSOLUTE );
  1073.         }
  1074.         break;
  1075.     case JUMPTHROW:
  1076.         if( !GetSpriteSwitchDone(hFox) == FALSE )
  1077.         {
  1078.             SetSpriteSwitchForward( hFox, FALSE );
  1079.             SetSpriteAction( hFox, JUMP, SAME );
  1080.             SetSpriteSwitch( hFox, C_FOX_JUMPSWITCH, P_ABSOLUTE );
  1081.             SetSpriteSwitchDone( hFox, FALSE );
  1082.             SetSpriteAccY( hFox, C_UNIT / 2, P_ABSOLUTE );
  1083.             SoundPlayEffect( SOUND_THROW );
  1084.         }
  1085.         else
  1086.         if( (GetSpriteBitmap(hFox) == 1) &&
  1087.             (GetSpriteDirection(hFox) == RIGHT) )
  1088.         {
  1089.             SetSpriteActive( hApple, TRUE );
  1090.             SetSpriteX( hApple, GetSpriteX(hFox) + 60 * C_UNIT, P_ABSOLUTE );
  1091.             SetSpriteY( hApple, GetSpriteY(hFox) + 30 * C_UNIT, P_ABSOLUTE );
  1092.             SetSpriteVelX( hApple, 8 * C_UNIT, P_ABSOLUTE );
  1093.             SetSpriteVelY( hApple, -4 * C_UNIT, P_ABSOLUTE );
  1094.             SetSpriteAccX( hApple, 0, P_ABSOLUTE );
  1095.             SetSpriteAccY( hApple, C_UNIT / 4, P_ABSOLUTE );
  1096.         }
  1097.         else if( (GetSpriteBitmap(hFox) == 1) &&
  1098.                  (GetSpriteDirection(hFox) == LEFT) )
  1099.         {
  1100.             SetSpriteActive( hApple, TRUE );
  1101.             SetSpriteX( hApple, GetSpriteX(hFox) + 15 * C_UNIT, P_ABSOLUTE );
  1102.             SetSpriteY( hApple, GetSpriteY(hFox) + 30 * C_UNIT, P_ABSOLUTE );
  1103.             SetSpriteVelX( hApple, -8 * C_UNIT, P_ABSOLUTE );
  1104.             SetSpriteVelY( hApple, -4 * C_UNIT, P_ABSOLUTE );
  1105.             SetSpriteAccX( hApple, 0, P_ABSOLUTE );
  1106.             SetSpriteAccY( hApple, C_UNIT / 4, P_ABSOLUTE );
  1107.         }
  1108.         break;
  1109.     case THROW:
  1110.         if( !GetSpriteSwitchDone(hFox) == FALSE )
  1111.         {
  1112.             SetSpriteAction( hFox, STILL, SAME );
  1113.             SetSpriteSwitchType( hFox, HOR );
  1114.             SetSpriteSwitch( hFox, 0, P_ABSOLUTE );
  1115.             SetSpriteSwitchDone( hFox, FALSE );
  1116.             SoundPlayEffect( SOUND_THROW );
  1117.         }
  1118.         else if( (GetSpriteBitmap(hFox) == 1) &&
  1119.                  (GetSpriteDirection(hFox) == RIGHT) )
  1120.         {
  1121.             SetSpriteActive( hApple, TRUE );
  1122.             SetSpriteX( hApple, GetSpriteX(hFox) + 60 * C_UNIT, P_ABSOLUTE );
  1123.             SetSpriteY( hApple, GetSpriteY(hFox) + 50 * C_UNIT, P_ABSOLUTE );
  1124.             SetSpriteVelX( hApple, 8 * C_UNIT, P_ABSOLUTE );
  1125.             SetSpriteVelY( hApple, -4 * C_UNIT, P_ABSOLUTE );
  1126.             SetSpriteAccX( hApple, 0, P_ABSOLUTE );
  1127.             SetSpriteAccY( hApple, C_UNIT / 4, P_ABSOLUTE );
  1128.         }
  1129.         else if( (GetSpriteBitmap(hFox) == 1) &&
  1130.                  (GetSpriteDirection(hFox) == LEFT) )
  1131.         {
  1132.             SetSpriteActive( hApple, TRUE );
  1133.             SetSpriteX( hApple, GetSpriteX(hFox) + 20 * C_UNIT, P_ABSOLUTE );
  1134.             SetSpriteY( hApple, GetSpriteY(hFox) + 50 * C_UNIT, P_ABSOLUTE );
  1135.             SetSpriteVelX( hApple, -8 * C_UNIT, P_ABSOLUTE );
  1136.             SetSpriteVelY( hApple, -4 * C_UNIT, P_ABSOLUTE );
  1137.             SetSpriteAccX( hApple, 0, P_ABSOLUTE );
  1138.             SetSpriteAccY( hApple, C_UNIT / 4, P_ABSOLUTE );
  1139.         }
  1140.         break;
  1141.     case JUMP:
  1142.         if( (foxSpeedY >= 0) && (!GetSpriteSwitchForward( hFox ) == FALSE) )
  1143.         {
  1144.             SetSpriteSwitchForward( hFox, FALSE );
  1145.         }
  1146.         else if( GetSpriteSwitchForward( hFox ) == FALSE )
  1147.         {
  1148.             if( (!GetSurface( hForeground, hFox ) == FALSE) ||
  1149.              (!GetSurface( hForeground, hFox ) == FALSE) )
  1150.             {
  1151.               if( foxSpeedX >= C_FOX_RUNMOVE )
  1152.               {
  1153.                   SetSpriteAction( hFox, RUN, SAME );
  1154.                   SetSpriteSwitch( hFox, C_FOX_RUNSWITCH, P_ABSOLUTE );
  1155.               }
  1156.               else if( foxSpeedX == 0 )
  1157.               {
  1158.                   SetSpriteAction( hFox, STILL, SAME );
  1159.                   SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE );
  1160.               }
  1161.               else
  1162.               {
  1163.                   SetSpriteAction( hFox, WALK, SAME );
  1164.                   SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE );
  1165.               }
  1166.               SetSpriteAccY( hFox, 0, P_ABSOLUTE );
  1167.               SetSpriteVelY( hFox, 0, P_ABSOLUTE );
  1168.               SetSpriteSwitchType( hFox, HOR );     
  1169.               SetSpriteSwitchForward( hFox, TRUE );
  1170. // SetSurface( hForeground, hFox );
  1171.               SetSpriteSwitchDone( hFox, FALSE );
  1172.             }
  1173.         }
  1174.         break;
  1175.     }
  1176.     /*
  1177.      * Bear Actions
  1178.      */
  1179.     bearActions:
  1180.     foxX   = GetSpriteX( hFox );
  1181.     foxY   = GetSpriteY( hFox );
  1182.     bearX  = GetSpriteX( hBear );
  1183.     bearY  = GetSpriteY( hBear );
  1184.     appleX = GetSpriteX( hApple );
  1185.     appleY = GetSpriteY( hApple );
  1186.     switch( GetSpriteAction( hBear ) ) {
  1187.     case STRIKE:
  1188.         if( GetSpriteBitmap( hBear ) == 2 )
  1189.         {
  1190.             if( (bearX > foxX - C_UNIT * 30) && (bearX < foxX + C_UNIT * 40) &&
  1191.                 (bearY < foxY + C_UNIT * 60) )
  1192.             {
  1193.               SetSpriteActive( hFox, FALSE );
  1194.                 if( !fBearPlaying )
  1195.                 {
  1196.                     SoundPlayEffect( SOUND_BEARSTRIKE );
  1197.                     fBearPlaying = TRUE;
  1198.                 }
  1199.             }
  1200.             else
  1201.             {
  1202.               SetSpriteAction( hBear, MISS, SAME );
  1203.               SetSpriteSwitch( hBear, C_BEAR_MISSSWITCH, P_ABSOLUTE );
  1204.               SetSpriteSwitchDone( hBear, FALSE );
  1205.             }
  1206.         }
  1207.         else if( !GetSpriteSwitchDone( hBear ) == FALSE )
  1208.         {
  1209.             SetSpriteAction( hBear, CHEW, SAME );
  1210.             SetSpriteSwitchDone( hBear, FALSE );
  1211.             chewCount = 0;
  1212.             fBearPlaying = FALSE;
  1213.         }
  1214.         break;
  1215.     case MISS:
  1216.         if( !fBearPlaying )
  1217.         {
  1218.             SoundPlayEffect( SOUND_BEARMISS );
  1219.             fBearPlaying = TRUE;
  1220.         }
  1221.         if( !GetSpriteSwitchDone( hBear ) == FALSE )
  1222.         {
  1223.             SetSpriteAction( hBear, WALK, SAME );
  1224.             SetSpriteVelX( hBear, -C_BEAR_WALKMOVE, P_ABSOLUTE );
  1225.             SetSpriteSwitch( hBear, C_BEAR_WALKSWITCH, P_ABSOLUTE );
  1226.             SetSpriteSwitchType( hBear, HOR );
  1227.             fBearPlaying = FALSE;
  1228.         }
  1229.         break;
  1230.     case WALK:
  1231.         if( (!GetSpriteActive(hApple) == FALSE) && (appleX > bearX) &&
  1232.             (appleX > bearX + 80 * C_UNIT) && (appleY > bearY + 30 * C_UNIT) )
  1233.         {
  1234.             SetSpriteAction( hBear, STRIKE, SAME );
  1235.             SetSpriteVelX( hBear, 0, P_ABSOLUTE );
  1236.             SetSpriteSwitchType( hBear, TIME );
  1237.             SetSpriteSwitch( hBear, C_BEAR_STRIKESWITCH, P_ABSOLUTE );
  1238.             SetSpriteSwitchDone( hBear, FALSE );
  1239.         }
  1240.         else if( (bearX > foxX - C_UNIT * 30) &&
  1241.                  (bearX < foxX + C_UNIT * 30) &&
  1242.                (bearY < foxY + C_UNIT * 60) )
  1243.         {
  1244.             SetSpriteAction( hBear, STRIKE, SAME );
  1245.             SetSpriteVelX( hBear, 0, P_ABSOLUTE );
  1246.             SetSpriteSwitchType( hBear, TIME );
  1247.             SetSpriteSwitch( hBear, C_BEAR_STRIKESWITCH, P_ABSOLUTE );
  1248.             SetSpriteSwitchDone( hBear, FALSE );
  1249.         }
  1250.         break;
  1251.     case CHEW:
  1252.         ++chewCount;
  1253.         if( chewCount >= 200 )
  1254.         {
  1255.             SetSpriteAction( hBear, STRIKE, SAME );
  1256.             SetSpriteSwitch( hBear, C_BEAR_STRIKESWITCH, P_ABSOLUTE );
  1257.             SetSpriteVelX( hBear, 0, P_ABSOLUTE );
  1258.             SetSpriteSwitchDone( hBear, FALSE );
  1259.             if( GetSpriteDirection(hFox) == RIGHT )
  1260.             {
  1261.               SetPlaneSlideX( hForeground, -C_BOUNDDIF, P_RELATIVE );
  1262.               SetPlaneSlideX( hMidground,  -C_BOUNDDIF, P_RELATIVE );
  1263.               SetPlaneSlideX( hBackground, -C_BOUNDDIF, P_RELATIVE );
  1264.             }
  1265.             chewDif = GetSpriteX(hFox);
  1266.             SetSpriteActive( hFox, TRUE );
  1267.             SetSpriteAction( hFox, STUNNED, LEFT );
  1268.             SetSpriteX( hFox, GetSpriteX(hBear), P_ABSOLUTE );
  1269.             SetSpriteY( hFox, GetSpriteY(hBear), P_ABSOLUTE );
  1270.             SetSpriteAccX( hFox, 0, P_ABSOLUTE );
  1271.             SetSpriteAccY( hFox, C_UNIT / 2, P_ABSOLUTE );
  1272.             SetSpriteVelX( hFox, -8 * C_UNIT, P_ABSOLUTE );
  1273.             SetSpriteVelY( hFox, -10 * C_UNIT, P_ABSOLUTE );
  1274.             SetSpriteSwitch( hFox, 0, P_ABSOLUTE );
  1275.             SoundPlayEffect( SOUND_STUNNED );
  1276.             chewDif -= GetSpriteX(hFox);
  1277.             SetPlaneSlideX( hForeground, -chewDif, P_RELATIVE );
  1278.             SetPlaneSlideX( hMidground,  -chewDif, P_RELATIVE );
  1279.             SetPlaneSlideX( hBackground, -chewDif, P_RELATIVE );
  1280.             SetPlaneIncremX( hForeground, C_BOUNDINCREM, P_ABSOLUTE );
  1281.             SetPlaneIncremX( hMidground,  C_BOUNDINCREM, P_ABSOLUTE );
  1282.             SetPlaneIncremX( hBackground, C_BOUNDINCREM, P_ABSOLUTE );
  1283.         }
  1284.         break;
  1285.     }
  1286.     /*
  1287.      * Apple actions...
  1288.      */
  1289.     if( (GetSpriteVelY(hApple) != 0) && (GetSpriteY(hApple) >= 420 * C_UNIT) )
  1290.     {
  1291.         SetSpriteX( hApple, 0, P_ABSOLUTE );
  1292.         SetSpriteY( hApple, 0, P_ABSOLUTE );
  1293.         SetSpriteAccX( hApple, 0, P_ABSOLUTE );
  1294.         SetSpriteAccY( hApple, 0, P_ABSOLUTE );
  1295.         SetSpriteVelX( hApple, 0, P_ABSOLUTE );
  1296.         SetSpriteVelY( hApple, 0, P_ABSOLUTE );
  1297.         SetSpriteActive( hApple, FALSE );
  1298.     }
  1299.     return cont;
  1300. } /* ProcessInput */