00001
00002
00003
00004
00005
00006
00007
00008
00009
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef __NETWORK_H__
00029 #define __NETWORK_H__
00030
00032
00033
00034
00035
00036
00037 #include "unit.h"
00038 #include "net_lowlevel.h"
00039
00040
00041
00042
00043
00044 #define MaxNetworkCommands 9
00045
00046 #define IsNetworkGame() (NetworkFildes != (Socket)-1)
00047
00048
00049
00050
00051
00052 class CUnit;
00053 class CUnitType;
00054
00060 enum _message_type_ {
00061 MessageNone,
00062 MessageInitHello,
00063 MessageInitReply,
00064 MessageInitConfig,
00065
00066 MessageSync,
00067 MessageSelection,
00068 MessageQuit,
00069 MessageQuitAck,
00070 MessageResend,
00071
00072 MessageChat,
00073 MessageChatTerm,
00074
00075 MessageCommandStop,
00076 MessageCommandStand,
00077 MessageCommandFollow,
00078 MessageCommandMove,
00079 MessageCommandRepair,
00080 MessageCommandAutoRepair,
00081 MessageCommandAttack,
00082 MessageCommandGround,
00083 MessageCommandPatrol,
00084 MessageCommandBoard,
00085 MessageCommandUnload,
00086 MessageCommandBuild,
00087 MessageCommandDismiss,
00088 MessageCommandResource,
00089 MessageCommandReturn,
00090 MessageCommandTrain,
00091 MessageCommandCancelTrain,
00092
00093 MessageExtendedCommand,
00094
00095
00096 MessageCommandSpellCast
00097 };
00098
00102 enum _extended_message_type_ {
00103 ExtendedMessageDiplomacy,
00104 ExtendedMessageSharedVision,
00105 };
00106
00110 class CNetworkCommand {
00111 public:
00112 CNetworkCommand() : Unit(0), X(0), Y(0), Dest(0) {}
00113 void Clear() { this->Unit = this->X = this->Y = this->Dest = 0; }
00114
00115 void Serialize(unsigned char *p) const;
00116 void Deserialize(unsigned char *p);
00117 static size_t Size() { return 2+2+2+2; }
00118
00119 Uint16 Unit;
00120 Uint16 X;
00121 Uint16 Y;
00122 Uint16 Dest;
00123 };
00124
00128 class CNetworkExtendedCommand {
00129 public:
00130 CNetworkExtendedCommand() : ExtendedType(0), Arg1(0), Arg2(0), Arg3(0), Arg4(0) {}
00131
00132 void Serialize(unsigned char *p);
00133 void Deserialize(unsigned char *p);
00134 static size_t Size() { return 1+1+2+2+2; }
00135
00136 Uint8 ExtendedType;
00137 Uint8 Arg1;
00138 Uint16 Arg2;
00139 Uint16 Arg3;
00140 Uint16 Arg4;
00141 };
00142
00146 class CNetworkChat {
00147 public:
00148 CNetworkChat() {
00149 Player = 0;
00150 memset(Text, 0, sizeof(Text));
00151 }
00152
00153 void Serialize(unsigned char *p);
00154 void Deserialize(unsigned char *p);
00155 static size_t Size() { return 1+7; }
00156
00157 Uint8 Player;
00158 char Text[7];
00159 };
00160
00164 typedef struct _network_selection_header_ {
00165 unsigned NumberSent : 6;
00166 unsigned Add : 1;
00167 unsigned Remove : 1;
00168 unsigned char Type[MaxNetworkCommands];
00169 } NetworkSelectionHeader;
00170
00174 class CNetworkSelection {
00175 public:
00176 CNetworkSelection() {
00177 memset(Unit, 0, sizeof(Unit));
00178 }
00179
00180 void Serialize(unsigned char *p);
00181 void Deserialize(unsigned char *p);
00182 static size_t Size() { return 2*4; }
00183
00184 Uint16 Unit[4];
00185 };
00186
00192 class CNetworkPacketHeader {
00193 public:
00194 CNetworkPacketHeader() {
00195 Cycle = 0;
00196 memset(Type, 0, sizeof(Type));
00197 }
00198
00199 void Serialize(unsigned char *p) const;
00200 void Deserialize(unsigned char *p);
00201 static size_t Size() { return 1 + 1 * MaxNetworkCommands; }
00202
00203 Uint8 Cycle;
00204 Uint8 Type[MaxNetworkCommands];
00205 };
00206
00212 class CNetworkPacket {
00213 public:
00214 unsigned char *Serialize(int numcommands) const;
00215 int Deserialize(unsigned char *p, unsigned int len);
00216 static size_t Size(int numcommands) {
00217 return CNetworkPacketHeader::Size() + numcommands * CNetworkCommand::Size();
00218 }
00219
00220 CNetworkPacketHeader Header;
00221 CNetworkCommand Command[MaxNetworkCommands];
00222 };
00223
00224
00225
00226
00227
00228 extern int NetworkNumInterfaces;
00229 extern Socket NetworkFildes;
00230 extern int NetworkInSync;
00231 extern int NetworkUpdates;
00232 extern int NetworkLag;
00233 extern unsigned long NetworkStatus[PlayerMax];
00234 extern int NoRandomPlacementMultiplayer;
00235
00236
00237
00238
00239
00240 extern void InitNetwork1(void);
00241 extern void InitNetwork2(void);
00242 extern void ExitNetwork1(void);
00243 extern void NetworkEvent(void);
00244 extern void NetworkSync(void);
00245 extern void NetworkQuit(void);
00246 extern void NetworkRecover(void);
00247 extern void NetworkCommands(void);
00248 extern void NetworkChatMessage(const std::string &msg);
00249
00250 extern void NetworkSendCommand(int command, const CUnit *unit, int x,
00251 int y, const CUnit *dest, const CUnitType *type, int status);
00253 extern void NetworkSendExtendedCommand(int command, int arg1, int arg2,
00254 int arg3, int arg4, int status);
00256 extern void NetworkSendSelection(CUnit **units, int count);
00257
00259
00260 #endif // !__NETWORK_H__