//----------------------------------------------------------------------------- // File: GameProc.h // // Desc: Game processing routines // // Copyright (C) 1995-2001 Microsoft Corporation. All Rights Reserved. //----------------------------------------------------------------------------- #define IDIRECTPLAY2_OR_GREATER #include #include #include // align on single byte boundaries // this is a stop-gap measure until the structures can be re-arranged. #pragma pack(1) #define MAX_SHIP_X (MAX_SCREEN_X - 32) #define MAX_SHIP_Y (MAX_SCREEN_Y - 32) #define MAX_SHIP_FRAME 40 #define MAX_BULLET_X (MAX_SCREEN_X - 3) #define MAX_BULLET_Y (MAX_SCREEN_Y - 3) #define MAX_BULLET_FRAME 400 #define NUM_SHIP_TYPES 4 #define DEF_SHOW_DELAY (2000) #define MAX_BUFFER_SIZE 256 #define UPDATE_INTERVAL 40 // interval between position updates in milliseconds (25 FPS) #define SYNC_INTERVAL 1000 // synchronize once every second #define HIDE_TIMEOUT 5000 // time for which a ship is disabled after a hit // Keyboard commands #define KEY_STOP 0x00000001l #define KEY_DOWN 0x00000002l #define KEY_LEFT 0x00000004l #define KEY_RIGHT 0x00000008l #define KEY_UP 0x00000010l #define KEY_FIRE 0x00000020l #define KEY_ENGINEOFF 0x00000040l // Offsets for the bullet bitmap #define BULLET_X 304 #define BULLET_Y 0 struct FRAG { double dPosX; double dPosY; LPDIRECTDRAWSURFACE pdds; RECT src; double dVelX; double dVelY; BOOL valid; }; struct SHIP { double dPosX, dPosY; // ship x and y position double dBulletPosX, dBulletPosY; // bullet x and y position DWORD dwBulletFrame; // bullet frame char cFrame; // current ship frame BYTE byType; // ship type BOOL bEnable; // is this ship active? BOOL bBulletEnable; // Is there an active bullet? double dVelX, dVelY; // ship x and y velocity (pixels/millisecond) double dBulletVelX, dBulletVelY; // bullet x and y velocity (pixels/millisecond) DWORD dwScore; // current score DWORD dwLastTick; // most recent time stamp BOOL bIgnore; // flag used to synchronize ship explosions int iCountDown; // enable time-out DWORD dwFrameCount; // number of frames since beginning of time // DSound members DWORD dwKeys; // the keyboard state BOOL bEngineRunning; // These BOOLs keep track of the ship's BOOL bMoving; // last condition so we can play sounds BOOL bBounced; // when they change BOOL bBlockHit; BOOL bDeath; BOOL bFiring; }; struct BLOCKS { BYTE bits[30][5]; }; //----------------------------------------------------------------------------- // communication packet structures //----------------------------------------------------------------------------- #define MSG_HOST 0x11 // message containing field layout, sent by host #define MSG_BLOCKHIT 0x22 // block hit message #define MSG_SHIPHIT 0x33 // ship hit message #define MSG_ADDBLOCK 0x44 // add block message #define MSG_CONTROL 0x55 // game keys message #define MSG_SYNC 0x66 // synchronization message containing the rendezvous location struct GENERICMSG { BYTE byType; }; struct OLDHOSTMSG { BYTE byType; BLOCKS Blocks; }; struct HOSTMSG { BYTE byType; BLOCKS Blocks; int usedShipTypes[NUM_SHIP_TYPES]; }; struct BLOCKHITMSG { BYTE byType; BYTE byRow; BYTE byCol; BYTE byMask; }; struct SHIPHITMSG { BYTE byType; DPID Id; }; struct ADDBLOCKMSG { BYTE byType; BYTE byX; BYTE byY; }; struct CONTROLMSG { BYTE byType; BYTE byState; }; struct SYNCMSG { BYTE byType; BYTE byShipType; // this is needed only when sends are unreliable char cFrame; double dPosX; double dPosY; }; //----------------------------------------------------------------------------- // Prototypes //----------------------------------------------------------------------------- VOID LaunchGame(); VOID ExitGame(); HRESULT InitOurShip(); HRESULT InitLocalSoundData(); BOOL WINAPI SetPlayerLocalSoundDataCB( DPID dpId, DWORD dwPlayerType, LPCDPNAME pName, DWORD dwFlags, VOID* pContext ); VOID ReleaseLocalData(); VOID ReleasePlayerLocalSoundData( SHIP* pShip ); BOOL WINAPI ReleasePlayerLocalDataCB( DPID dpId, DWORD dwPlayerType, LPCDPNAME pName, DWORD dwFlags, VOID* pContext ); VOID UpdateState( SHIP* pShip, DWORD dwControls ); VOID SendSync( SHIP* pShip ); VOID UpdateDisplayStatus( SHIP* pShip ); VOID UpdatePosition( DPID dpId, SHIP* ship ); BOOL IsHit( int x, int y ); VOID InitField(); BOOL setBlock( int x, int y ); VOID AddFrag( SHIP* pShip, int offX, int offY ); VOID UpdateFragment( int i ); VOID DestroyShip( SHIP* pShip ); VOID DestroyGame(); BOOL UpdateFrame(); VOID ProcessSoundFlags( SHIP* pShip ); BOOL WINAPI RenderPlayerCB( DPID dpId, DWORD dwPlayerType, LPCDPNAME pName, DWORD dwFlags, VOID* pContext ); BOOL DrawScreen(); BOOL DrawScore(); VOID DrawShip( SHIP* pShip ); VOID DrawBlock( int x, int y ); VOID DrawBullet( SHIP* pShip ); VOID DrawFragments(); VOID DisplayFrameRate(); VOID GetConnection(); HRESULT ReceiveMessages(); VOID DoSystemMessage( DPMSG_GENERIC* pMsg, DWORD dwMsgSize, DPID idFrom, DPID idTo ); VOID DoApplicationMessage( GENERICMSG* pMsg, DWORD dwMsgSize, DPID idFrom, DPID idTo ); VOID SendGameMessage( GENERICMSG* pMsg, DPID idTo ); VOID CleanupComm(); HRESULT InitializeGameSounds(); VOID CleanupGameSounds(); // restore default alignment #pragma pack()