Message.h
上传用户:royluo
上传日期:2007-01-05
资源大小:1584k
文件大小:14k
源码类别:

游戏

开发平台:

Visual C++

  1. /*****************************************************************************
  2. *                                                                             
  3. *   Message.h
  4. *                                                                             
  5. *   Electrical Engineering Faculty - Software Lab                             
  6. *   Spring semester 1998                                                      
  7. *                                                                             
  8. *   Tanks game                                                                
  9. *                                                                             
  10. *   Module description: Implements the message class used in process and on 
  11. *                       the network.
  12. *                       
  13. *                                                                             
  14. *   Authors: Eran Yariv - 28484475                                           
  15. *            Moshe Zur  - 24070856                                           
  16. *                                                                            
  17. *                                                                            
  18. *   Date: 23/09/98                                                           
  19. *                                                                            
  20. ******************************************************************************/
  21. #ifndef _MESSAGE_H_
  22. #define _MESSAGE_H_
  23. #include "GameObject.h"
  24. #include "Pool.h"
  25. #include "Timer.h"
  26. #pragma pack (push)
  27. #pragma pack (1)
  28. typedef enum
  29. {
  30.     SERVER_MSG,         // Server is requesting encoding / decoding of message
  31.     PLAYER_MSG          // Server is requesting encoding / decoding of message    
  32. } GameMessageType;        
  33. // Every type of message with params should declare them bellow, and include them in the union:
  34. struct BonusParamTag {
  35.     DWORD         Type        : 3;    // Type
  36.     DWORD         XPos        : 9;    // X pos
  37.     DWORD         YPos        : 9;    // Y pos
  38.     DWORD         LifeSpan    :11;    // TTL (seconds)
  39. };
  40. struct CheckSumParamTag {   // Encoded to variable length
  41.     BYTE        NumberOfTanks;       // Current number of tanks
  42.     BOOL        DeadHostReport;      // Host player is dead but host is alive
  43.     BonusType   ActiveBonusType;     // Is there an active bonus? What's the type?
  44.     WORD        XPos;                // Reporting tank's position
  45.     WORD        YPos;
  46.     struct TankCheckSumParamTag {    // A tank check sum for each tank
  47.         BOOL    TankExists;          // Does tank exist?               
  48.         BOOL    Zombie;              // Zombie flag
  49.         BOOL    FastFire;            // Fast fire rate flag
  50.         WORD    Bullets;
  51.         WORD    Shells;
  52.         WORD    Mines;
  53.     }  TanksChkSums[MAX_TANKS];
  54.     BYTE        MinesSectorsChkSum [MAX_SECTOR + 1];    // A mines sector check sum for each map sector
  55. };
  56. struct BulletParamTag { // Internal - never encoded
  57.     WORD wXPos;
  58.     WORD wYPos;
  59.     BYTE bDirectionIndex;
  60.     BYTE bParentTankID;
  61. };
  62. struct ShellParamTag { // Internal - never encoded
  63.     WORD wXPos;
  64.     WORD wYPos;
  65.     BYTE bDirectionIndex;
  66.     BYTE bParentTankID;
  67. };
  68. struct MineParamTag { // Internal - never encoded
  69.     WORD wXPos;
  70.     WORD wYPos;
  71. };
  72. struct TankParamTag {
  73.     DWORD ID                      : 2;        // Tank ID
  74.     int   XPos                    :10;        // X pos  (signed: -512..511)
  75.     int   YPos                    :10;        // Y pos  (signed: -512..511)
  76.     DWORD Local                   : 1;        // Is local?
  77.     DWORD ShieldLevel             : 7;        // Shield level
  78.     DWORD Bomber                  : 1;        // Bomber available ?
  79.     DWORD FastFire                : 1;        // FastFireRate available - end of DWORD 1
  80.     DWORD Shells                  : 9;        // Shells count
  81.     DWORD Bullets                 : 9;        // Bullets count    
  82.     DWORD Mines                   : 9;        // Mines count    
  83.     DWORD Direction               : 5;        // Direction (0..23)     - end of DWORD 2
  84.     BYTE FireRateBonusSecsLeft;               // Fast fire rate time left (in seconds)
  85. };
  86. struct TankStatusParamTag {
  87.     BYTE bShieldLevel           : 7;
  88.     BYTE bFastFire              : 1; // End of byte 1
  89.     BYTE bFireRateBonusSecsLeft : 8; // End of byte 2
  90.     BYTE bID                    : 2;
  91.     BYTE bBomber                : 1;
  92.     BYTE bZombie                : 1;
  93. BYTE bReserved1 : 4; // End of byte 3
  94.     DWORD dwShells              : 9;
  95.     DWORD dwBullets             : 9;
  96.     DWORD dwMines               : 9;    // End of byte 7
  97. };
  98. struct TankPosParamTag {
  99.     DWORD ID            : 2;
  100.     int   XPos          :10;    // X pos  (signed: -512..511)
  101.     int   YPos          :10;    // Y pos  (signed: -512..511)
  102.     DWORD Reserved      :10;    // End of DWORD
  103. };
  104. struct TankZombieParamTag {
  105.     BYTE ID            : 2;
  106.     BYTE Zombie        : 1;
  107.     BYTE Reserved      : 5;
  108. };
  109. struct BoardParamTag {
  110.     DWORD Seed        : 16;       // Random seed
  111.     DWORD Complexity  :  5;       // Complexity level
  112.     DWORD Reserved    :  9;       // Reserved for DWORD alignment
  113. };
  114. struct BomberParamTag {
  115.     int   Xpos      :10;    // X pos (out of map enabled)  (signed: -512..511)
  116.     int   Ypos      :10;    // Y pos (out of map enabled)  (signed: -512..511)
  117.     DWORD Direction : 5;    // Direction (0..23)
  118.     DWORD Reserved  : 7;    // Reserved (for DWORD padding)
  119. };
  120. struct TankRequestParamTag {
  121.     BYTE    bID;
  122. };
  123. struct TankRemoveParamTag {
  124.     BYTE    ID      : 2;    // Tank ID
  125.     BYTE    Explode : 1;    // Explodes ?
  126. };
  127. struct ManouverSetParamTag {
  128.     BYTE TankID       :  2;     // Tank ID
  129.     BYTE Direction    :  5;     // Direction (0..23)
  130.     BYTE Reserved     :  1;     // Reserved (for BYTE padding)
  131.     BYTE ManouverSet;           // ManouverSet Data
  132. };
  133. struct ChatParamTag {
  134.     BYTE  TankID;
  135.     DWORD idFrom;
  136.     char Msg[MAX_CHAT_MSG_LEN+1];
  137. };
  138. typedef struct {
  139.     BYTE    NumberOfTanks   : 3;    // Current number of tanks ([0..MAX_TANKS])
  140.     BYTE    ActiveBonusType : 3;    // Is there an active bonus? What's the type?
  141.     BYTE    DeadHostReport  : 1;    // Host is dead but reports game status    
  142.     BYTE    Reserved        : 1;
  143.     WORD    XPos;                   // Reporting tanks pos
  144.     WORD    YPos;
  145. } CheckSumHeaderType;
  146. typedef struct {
  147.     BYTE    LoNibble       : 4;     // Low nibble
  148.     BYTE    HiNibble       : 4;     // High nibble
  149. } DoubleSectorChkSumType;
  150. typedef struct {
  151.     CheckSumHeaderType      Header;
  152.     DoubleSectorChkSumType  MinesSectorsChkSum[8];
  153. } FixedSizeChkSumType;
  154. typedef struct {
  155.     DWORD   TankID          :  2;
  156.     DWORD   Zombie          :  1;   // Zombie flag
  157.     DWORD   FastFire        :  1;
  158.     DWORD   Bullets         :  9;
  159.     DWORD   Shells          :  9;
  160.     DWORD   Mines           :  9;
  161.     DWORD   Reserved        :  1;
  162. } SingleTankChkSumType;
  163. class CMessage : public CObject
  164. {
  165. public:
  166.     enum MessageType 
  167.     {// Code            Description                         Direction (client's view)
  168.      // --------------- ----------------------------------- ---------------------------
  169.         ADD_BONUS,      // Add bonus object                 Incoming / Outgoing (*)
  170.         ADD_TANK,       // Add tank (remote or local)       Incoming
  171.         ADD_BOARD,      // Add board object                 Incoming
  172.         ADD_BOMBER,     // Add bomber object                Incoming / Outgoing
  173.         REMOVE_TANK,    // Remove tank (remote or local)    Incoming / Outgoing (*)
  174.         MANOUVER_SET,   // Update manouver set              Incoming / Outgoing
  175.         SET_TANK_STATUS,// Set existing tank state          Incoming
  176.         SET_TANK_POS,   // Sets a tank position             Incoming
  177.         SET_TANK_ZOMBIE,// Sets tank's zombie flag          Incoming
  178.         REQUEST_TANK,   // Request a local tank             Outgoing
  179.         CHECK_SUM,      // Notify host of current state     Outgoing
  180.         CHAT,           // A string send to/from player     Incoming / Outgoing
  181.         SET_MINES,      // Sets the mines in a sector       Incoming - special treatment 
  182.                         // see remarks in 
  183.                         // CHost::SendMinesStatus and
  184.                         // in CClient::HandleMessage
  185.         ADD_OBJECT,     // Add other objects                Internal
  186.         ADD_SHELL,      // Add a shell                      Internal
  187.         ADD_BULLET,     // Add a bullet                     Internal
  188.         ADD_MINE,       // Add a mine                       Internal
  189.         ADD_GAME_OVER,  // Add game-over animation          Internal
  190.         NUM_MSGS        // Total number of messages         --------
  191.         // (*) means the message is outgoing from the playaer on the host machine to the host player.
  192.     };
  193.     union MessageData 
  194.     {
  195.         CGameObject                 *pGameObj;
  196.         struct BonusParamTag        BonusParam;
  197.         struct ShellParamTag        ShellParam;
  198.         struct BulletParamTag       BulletParam;
  199.         struct MineParamTag         MineParam;
  200.         struct TankParamTag         TankParam;
  201.         struct BoardParamTag        BoardParam;
  202.         struct BomberParamTag       BomberParam;
  203.         struct TankRequestParamTag  TankRequestParam;
  204.         struct ManouverSetParamTag  ManouverSetParam;
  205.         struct TankRemoveParamTag   TankRemoveParam;
  206.         struct CheckSumParamTag     CheckSumParam;
  207.         struct TankStatusParamTag   TankStatusParam;
  208.         struct TankPosParamTag      TankPosParam;
  209.         struct TankZombieParamTag   TankZombieParam;
  210.         struct ChatParamTag         ChatParam;
  211.     } m_UnionData;
  212.     CMessage    () {}
  213.     CMessage    (MessageType type, union MessageData& data, GameMessageType);
  214.     CMessage    (PBYTE, BYTE, GameMessageType);   // Create a message from a buffer and convert to local time
  215.     virtual ~CMessage() {}
  216.     void        SetTime (DWORD);                // Set message time (after translation to/from local)
  217.     DWORD       GetTime () const;               // Get message time
  218.     MessageType GetType () const;               // Get message type
  219.     void        SetType ( MessageType );   
  220.     DWORD       GetBuffer (PBYTE);              // Copy message to comm. buffer, return length
  221. #ifdef NET_MON_GAME
  222.     char       *GetName();                      // Get message name
  223.     static char*GetName (BYTE);                 // Get message name of a given message ID 
  224. #endif
  225.     // used for the pool:
  226.     void* operator new (size_t size)
  227.     {
  228.         return m_Pool.Alloc (size);
  229.     }
  230.     void operator delete (void *p, size_t size)
  231.     {
  232.         m_Pool.Free(p, size);
  233.         return;
  234.     }
  235. #if _MFC_VER > 0x0421
  236.     // Visual C++ version 6.0 and above (_MFC_VER >= 0x0600) complain if the 
  237.     // other form of delete operator (not formerly supported in Visual C++ 5.0 and below)
  238.     // does not exist.
  239.     void operator delete (void *p)
  240.     {
  241.         m_Pool.Free(p, sizeof(CMessage));
  242.         return;
  243.     }
  244. #endif
  245.     static DWORD EncodeSectorMines (PBYTE buf, int iSector, DWORD dwMinesFound,  DWORD *pAllMinesInSector);
  246.     static DWORD DecodeSectorMines (PBYTE buf, DWORD dwBufferSize, int &iSector, DWORD *pAllMinesInSector);
  247. private:
  248.     CMessage *pNext;        // for objects on free list
  249.     static CPool<CMessage> m_Pool;
  250.     friend CPool<CMessage>; // provide access for CPool to pNext private member
  251.     DWORD           m_dwMsgTime;            // Time of message
  252.     MessageType     m_Type;                 // Type of message
  253.     // Encoding functions:
  254.     DWORD           EncodeAddBomber (PBYTE);            // Client => Server && Server => Client
  255.     DWORD           EncodeRequestTank (PBYTE) const;    // Client => Server
  256.     DWORD           EncodeCheckSum (PBYTE) const;       // Client => Server
  257.     DWORD           EncodeAddTank (PBYTE) const;        // Server => Client
  258.     DWORD           EncodeManouverSet (PBYTE) const;    // Client => Server && Server => Client
  259.     DWORD           EncodeAddBonus (PBYTE) const;       // Server => Client
  260.     DWORD           EncodeAddBoard (PBYTE) const;       // Server => Client
  261.     DWORD           EncodeRemoveTank (PBYTE) const;     // Server => Client
  262.     DWORD           EncodeSetTankStatus (PBYTE) const;  // Server => Client
  263.     DWORD           EncodeSetTankPos (PBYTE) const;     // Server => Client
  264.     DWORD           EncodeSetTankZombie (PBYTE) const;  // Server => Client
  265.     DWORD           EncodeChat (PBYTE) const;           // Server => Client && Client => Server
  266.     // Decoding functions:
  267.     void            DecodeAddBomber (PBYTE);            // Client => Server && Server => Client
  268.     void            DecodeRequestTank (PBYTE);          // Client => Server
  269.     void            DecodeCheckSum (PBYTE);             // Client => Server
  270.     void            DecodeAddTank (PBYTE);              // Server => Client
  271.     void            DecodeManouverSet (PBYTE);          // Client => Server && Server => Client
  272.     void            DecodeAddBonus (PBYTE);             // Server => Client
  273.     void            DecodeAddBoard (PBYTE);             // Server => Client
  274.     void            DecodeRemoveTank (PBYTE);           // Server => Client
  275.     void            DecodeSetTankStatus (PBYTE);        // Server => Client
  276.     void            DecodeSetTankPos (PBYTE);           // Server => Client
  277.     void            DecodeSetTankZombie (PBYTE);        // Server => Client
  278.     void            DecodeChat (PBYTE);                 // Server => Client && Client => Server
  279.     static BYTE         *m_MsgSizeArr;       // Static messages sizes table
  280.     static TIMER_CLASS  *m_pTimer;           // Pointer to global timer
  281. };
  282. #include <Message.inl>
  283. #pragma pack (pop)
  284. #endif