/* Copyright (C) 2021 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * 0 A.D. is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with 0 A.D. If not, see . */ /** * @file * The list of messages used by the network subsystem. */ #ifndef NETMESSAGES_H #define NETMESSAGES_H #include "ps/CStr.h" #include "scriptinterface/ScriptTypes.h" #define PS_PROTOCOL_MAGIC 0x5073013f // 'P', 's', 0x01, '?' #define PS_PROTOCOL_MAGIC_RESPONSE 0x50630121 // 'P', 'c', 0x01, '!' #define PS_PROTOCOL_VERSION 0x01010018 // Arbitrary protocol #define PS_DEFAULT_PORT 0x5073 // 'P', 's' // Set when lobby authentication is required. Used in the SrvHandshakeResponseMessage. #define PS_NETWORK_FLAG_REQUIRE_LOBBYAUTH 0x1 // Defines the list of message types. The order of the list must not change. // The message types having a negative value are used internally and not sent // over the network. The message types used for network communication have // positive values. enum NetMessageType { NMT_CONNECT_COMPLETE = -256, NMT_CONNECTION_LOST, NMT_INVALID = 0, NMT_SERVER_HANDSHAKE, NMT_CLIENT_HANDSHAKE, NMT_SERVER_HANDSHAKE_RESPONSE, NMT_AUTHENTICATE, NMT_AUTHENTICATE_RESULT, NMT_CHAT, NMT_READY, NMT_CLEAR_ALL_READY, NMT_GAME_SETUP, NMT_ASSIGN_PLAYER, NMT_PLAYER_ASSIGNMENT, NMT_FILE_TRANSFER_REQUEST, NMT_FILE_TRANSFER_RESPONSE, NMT_FILE_TRANSFER_DATA, NMT_FILE_TRANSFER_ACK, NMT_JOIN_SYNC_START, NMT_REJOINED, NMT_KICKED, NMT_CLIENT_TIMEOUT, NMT_CLIENT_PERFORMANCE, NMT_CLIENTS_LOADING, NMT_CLIENT_PAUSED, NMT_LOADED_GAME, NMT_GAME_START, NMT_END_COMMAND_BATCH, NMT_SYNC_CHECK, // OOS-detection hash checking NMT_SYNC_ERROR, // OOS-detection error NMT_SIMULATION_COMMAND }; // Authentication result codes enum AuthenticateResultCode { ARC_OK, ARC_OK_REJOINING, ARC_PASSWORD_INVALID, }; #endif // NETMESSAGES_H #ifdef CREATING_NMT #define ALLNETMSGS_DONT_CREATE_NMTS #define START_NMT_CLASS_(_nm, _message) START_NMT_CLASS(C##_nm##Message, _message) #define DERIVE_NMT_CLASS_(_base, _nm, _message) START_NMT_CLASS_DERIVED(C ## _base ## Message, C ## _nm ## Message, _message) START_NMTS() START_NMT_CLASS_(SrvHandshake, NMT_SERVER_HANDSHAKE) NMT_FIELD_INT(m_Magic, u32, 4) NMT_FIELD_INT(m_ProtocolVersion, u32, 4) NMT_FIELD_INT(m_SoftwareVersion, u32, 4) END_NMT_CLASS() START_NMT_CLASS_(CliHandshake, NMT_CLIENT_HANDSHAKE) NMT_FIELD_INT(m_MagicResponse, u32, 4) NMT_FIELD_INT(m_ProtocolVersion, u32, 4) NMT_FIELD_INT(m_SoftwareVersion, u32, 4) END_NMT_CLASS() START_NMT_CLASS_(SrvHandshakeResponse, NMT_SERVER_HANDSHAKE_RESPONSE) NMT_FIELD_INT(m_UseProtocolVersion, u32, 4) NMT_FIELD_INT(m_Flags, u32, 4) NMT_FIELD(CStr, m_GUID) END_NMT_CLASS() START_NMT_CLASS_(Authenticate, NMT_AUTHENTICATE) NMT_FIELD(CStrW, m_Name) NMT_FIELD_SECRET(CStr, m_Password) NMT_FIELD_SECRET(CStr, m_ControllerSecret) END_NMT_CLASS() START_NMT_CLASS_(AuthenticateResult, NMT_AUTHENTICATE_RESULT) NMT_FIELD_INT(m_Code, u32, 4) NMT_FIELD_INT(m_HostID, u32, 2) NMT_FIELD_INT(m_IsController, u8, 1) NMT_FIELD(CStrW, m_Message) END_NMT_CLASS() START_NMT_CLASS_(Chat, NMT_CHAT) NMT_FIELD(CStr, m_GUID) // ignored when client->server, valid when server->client NMT_FIELD(CStrW, m_Message) END_NMT_CLASS() START_NMT_CLASS_(Ready, NMT_READY) NMT_FIELD(CStr, m_GUID) NMT_FIELD_INT(m_Status, u8, 1) END_NMT_CLASS() START_NMT_CLASS_(ClearAllReady, NMT_CLEAR_ALL_READY) END_NMT_CLASS() START_NMT_CLASS_(PlayerAssignment, NMT_PLAYER_ASSIGNMENT) NMT_START_ARRAY(m_Hosts) NMT_FIELD(CStr, m_GUID) NMT_FIELD(CStrW, m_Name) NMT_FIELD_INT(m_PlayerID, i8, 1) NMT_FIELD_INT(m_Status, u8, 1) NMT_END_ARRAY() END_NMT_CLASS() START_NMT_CLASS_(FileTransferRequest, NMT_FILE_TRANSFER_REQUEST) NMT_FIELD_INT(m_RequestID, u32, 4) END_NMT_CLASS() START_NMT_CLASS_(FileTransferResponse, NMT_FILE_TRANSFER_RESPONSE) NMT_FIELD_INT(m_RequestID, u32, 4) NMT_FIELD_INT(m_Length, u32, 4) END_NMT_CLASS() START_NMT_CLASS_(FileTransferData, NMT_FILE_TRANSFER_DATA) NMT_FIELD_INT(m_RequestID, u32, 4) NMT_FIELD(CStr, m_Data) END_NMT_CLASS() START_NMT_CLASS_(FileTransferAck, NMT_FILE_TRANSFER_ACK) NMT_FIELD_INT(m_RequestID, u32, 4) NMT_FIELD_INT(m_NumPackets, u32, 4) END_NMT_CLASS() START_NMT_CLASS_(JoinSyncStart, NMT_JOIN_SYNC_START) NMT_FIELD(CStr, m_InitAttributes) END_NMT_CLASS() START_NMT_CLASS_(Rejoined, NMT_REJOINED) NMT_FIELD(CStr, m_GUID) END_NMT_CLASS() START_NMT_CLASS_(Kicked, NMT_KICKED) NMT_FIELD(CStrW, m_Name) NMT_FIELD_INT(m_Ban, u8, 1) END_NMT_CLASS() START_NMT_CLASS_(ClientTimeout, NMT_CLIENT_TIMEOUT) NMT_FIELD(CStr, m_GUID) NMT_FIELD_INT(m_LastReceivedTime, u32, 4) END_NMT_CLASS() START_NMT_CLASS_(ClientPerformance, NMT_CLIENT_PERFORMANCE) NMT_START_ARRAY(m_Clients) NMT_FIELD(CStr, m_GUID) NMT_FIELD_INT(m_MeanRTT, u32, 4) NMT_END_ARRAY() END_NMT_CLASS() START_NMT_CLASS_(ClientsLoading, NMT_CLIENTS_LOADING) NMT_START_ARRAY(m_Clients) NMT_FIELD(CStr, m_GUID) NMT_END_ARRAY() END_NMT_CLASS() START_NMT_CLASS_(ClientPaused, NMT_CLIENT_PAUSED) NMT_FIELD(CStr, m_GUID) NMT_FIELD_INT(m_Pause, u8, 1) END_NMT_CLASS() START_NMT_CLASS_(LoadedGame, NMT_LOADED_GAME) NMT_FIELD_INT(m_CurrentTurn, u32, 4) END_NMT_CLASS() START_NMT_CLASS_(GameStart, NMT_GAME_START) NMT_FIELD(CStr, m_InitAttributes) END_NMT_CLASS() START_NMT_CLASS_(EndCommandBatch, NMT_END_COMMAND_BATCH) NMT_FIELD_INT(m_Turn, u32, 4) NMT_FIELD_INT(m_TurnLength, u32, 2) END_NMT_CLASS() START_NMT_CLASS_(SyncCheck, NMT_SYNC_CHECK) NMT_FIELD_INT(m_Turn, u32, 4) NMT_FIELD(CStr, m_Hash) END_NMT_CLASS() START_NMT_CLASS_(SyncError, NMT_SYNC_ERROR) NMT_FIELD_INT(m_Turn, u32, 4) NMT_FIELD(CStr, m_HashExpected) NMT_START_ARRAY(m_PlayerNames) NMT_FIELD(CStrW, m_Name) NMT_END_ARRAY() END_NMT_CLASS() START_NMT_CLASS_(AssignPlayer, NMT_ASSIGN_PLAYER) NMT_FIELD_INT(m_PlayerID, i8, 1) NMT_FIELD(CStr, m_GUID) END_NMT_CLASS() END_NMTS() #else #ifndef ALLNETMSGS_DONT_CREATE_NMTS # ifdef ALLNETMSGS_IMPLEMENT # define NMT_CREATOR_IMPLEMENT # endif # define NMT_CREATE_HEADER_NAME "NetMessages.h" # include "NMTCreator.h" #endif // #ifndef ALLNETMSGS_DONT_CREATE_NMTS #endif // #ifdef CREATING_NMT