diff --git a/sc2/src/sc2code/gamestr.h b/sc2/src/sc2code/gamestr.h index bfac98e34..ec7ab75ef 100644 --- a/sc2/src/sc2code/gamestr.h +++ b/sc2/src/sc2code/gamestr.h @@ -46,7 +46,7 @@ #define FLAGSHIP_STRING_COUNT 13 #define ORBITSCAN_STRING_COUNT 19 #define MAINMENU_STRING_COUNT 56 -#define NETMELEE_STRING_COUNT 16 +#define NETMELEE_STRING_COUNT 18 enum { STAR_STRING_BASE = 0, diff --git a/sc2/src/sc2code/melee.c b/sc2/src/sc2code/melee.c index 3109bc341..3a3df7256 100644 --- a/sc2/src/sc2code/melee.c +++ b/sc2/src/sc2code/melee.c @@ -2970,6 +2970,19 @@ updateRandomSeed (PMELEE_STATE pMS, COUNT side, DWORD seed) { (void) side; } +// The remote player has done something which invalidates our confirmation. +void +confirmationCancelled(PMELEE_STATE pMS, COUNT side) { + if (side == 0) + DrawMeleeStatusMessage (GAME_STRING (NETMELEE_STRING_BASE + 16)); + // "Bottom player changed something -- need to reconfirm." + else + DrawMeleeStatusMessage (GAME_STRING (NETMELEE_STRING_BASE + 17)); + // "Top player changed something -- need to reconfirm." + if (pMS->InputFunc == DoConfirmSettings) + pMS->InputFunc = DoMelee; +} + void connectedFeedback (PMELEE_STATE pMS, COUNT side) { if (side == 0) diff --git a/sc2/src/sc2code/melee.h b/sc2/src/sc2code/melee.h index a2e098ab4..da9cf630a 100644 --- a/sc2/src/sc2code/melee.h +++ b/sc2/src/sc2code/melee.h @@ -121,6 +121,7 @@ void updateTeamName (PMELEE_STATE pMS, COUNT side, const char *name, size_t len); bool updateFleetShip (PMELEE_STATE pMS, COUNT side, COUNT index, BYTE ship); void updateRandomSeed (PMELEE_STATE pMS, COUNT side, DWORD seed); +void confirmationCancelled(PMELEE_STATE pMS, COUNT side); void connectedFeedback (PMELEE_STATE pMS, COUNT side); void errorFeedback (PMELEE_STATE pMS, COUNT side); void closeFeedback (PMELEE_STATE pMS, COUNT side); diff --git a/sc2/src/sc2code/netplay/netmelee.c b/sc2/src/sc2code/netplay/netmelee.c index 3e608eec0..6335113b4 100644 --- a/sc2/src/sc2code/netplay/netmelee.c +++ b/sc2/src/sc2code/netplay/netmelee.c @@ -83,6 +83,9 @@ void netInput(void) { uint32 timeoutMs = 0; NetManager_process(&timeoutMs); + // This may cause more packets to be queued, hence the + // flushPacketQueues(). + flushPacketQueues(); Alarm_process(); Callback_process(); diff --git a/sc2/src/sc2code/netplay/packethandlers.c b/sc2/src/sc2code/netplay/packethandlers.c index 0326f81aa..267e92be1 100644 --- a/sc2/src/sc2code/netplay/packethandlers.c +++ b/sc2/src/sc2code/netplay/packethandlers.c @@ -166,7 +166,7 @@ PacketHandler_Ready(NetConnection *conn, const Packet_Ready *packet) { int PacketHandler_Fleet(NetConnection *conn, const Packet_Fleet *packet) { - uint32 numShips = ntoh16(packet->numShips); + uint16 numShips = ntoh16(packet->numShips); size_t i; size_t len; int player; @@ -193,10 +193,13 @@ PacketHandler_Fleet(NetConnection *conn, const Packet_Fleet *packet) { return -1; } - if (conn->stateFlags.handshake.localOk) - Netplay_cancelConfirmation(conn); - battleStateData = (BattleStateData *) NetConnection_getStateData(conn); + + if (conn->stateFlags.handshake.localOk) { + Netplay_cancelConfirmation(conn); + confirmationCancelled(battleStateData->meleeState, player); + } + for (i = 0; i < numShips; i++) { int ship = packet->ships[i].ship; int index = packet->ships[i].index; @@ -228,16 +231,18 @@ PacketHandler_TeamName(NetConnection *conn, const Packet_TeamName *packet) { return -1; } - if (conn->stateFlags.handshake.localOk) - Netplay_cancelConfirmation(conn); - side = localSide(conn, (NetplaySide) packet->side); + battleStateData = (BattleStateData *) NetConnection_getStateData(conn); + if (conn->stateFlags.handshake.localOk) { + Netplay_cancelConfirmation(conn); + confirmationCancelled(battleStateData->meleeState, side); + } + nameLen = packetLength((const Packet *) packet) - sizeof (Packet_TeamName) - 1; // The -1 is for not counting the terminating '\0'. - battleStateData = (BattleStateData *) NetConnection_getStateData(conn); updateTeamName(battleStateData->meleeState, side, packet->name, nameLen); // Padding data may follow; it is ignored.