Allow host to choose colors/positions for other players, without crashing this time. ;)

git-svn-id: https://warzone2100.svn.sourceforge.net/svnroot/warzone2100/trunk@8992 4a71c877-e1ca-e34f-864e-861f7616d084
master
Guangcong Luo 2010-01-05 07:13:16 +00:00 committed by Git SVN Gateway
parent 36c85d7c78
commit cd47405d83
1 changed files with 36 additions and 13 deletions

View File

@ -153,7 +153,7 @@ extern void NETGameLocked(bool flag); // in netplay.c
BOOL bHosted = false; //we have set up a game
char sPlayer[128]; // player name (to be used)
static BOOL bColourChooserUp= false;
static int colourChooserUp = -1;
static int teamChooserUp = -1;
static BOOL SettingsUp = false;
static UBYTE InitialProto = 0;
@ -1493,12 +1493,15 @@ static void addColourChooser(UDWORD player)
// delete that players box,
widgDelete(psWScreen,MULTIOP_PLAYER_START+player);
// detele team chooser botton
// delete team chooser button
widgDelete(psWScreen,MULTIOP_TEAMS_START+player);
// detele 'ready' button
// delete 'ready' button
widgDelete(psWScreen,MULTIOP_READY_FORM_ID+player);
// remove colour chooser, if it's already up
closeColourChooser();
// add form.
addBlueForm(MULTIOP_PLAYERS,MULTIOP_COLCHOOSER_FORM,"",
7,
@ -1532,7 +1535,7 @@ static void addColourChooser(UDWORD player)
"Player number", IMAGE_WEE_GUY, IMAGE_WEE_GUY, 10 + i);
}
if (NetPlay.isHost)
if (!NetPlay.isHost)
{
for (i=0;i<game.maxPlayers;i++)
{
@ -1542,13 +1545,13 @@ static void addColourChooser(UDWORD player)
}
}
}
bColourChooserUp = true;
colourChooserUp = player;
}
static void closeColourChooser(void)
{
bColourChooserUp = false;
colourChooserUp = -1;
widgDelete(psWScreen,MULTIOP_COLCHOOSER_FORM);
}
@ -1682,11 +1685,19 @@ static BOOL changePosition(UBYTE player, UBYTE position)
NetPlay.players[player].position = position;
NETBroadcastPlayerInfo(player);
NETBroadcastPlayerInfo(i);
netPlayersUpdated = true;
return true;
}
}
debug(LOG_ERROR, "Failed to swap positions for player %d, position %d", (int)player, (int)position);
netPlayersUpdated = true;
if (player < game.maxPlayers && position < game.maxPlayers)
{
// Positions were corrupted. Attempt to fix.
NetPlay.players[player].position = position;
NETBroadcastPlayerInfo(player);
netPlayersUpdated = true;
return true;
}
return false;
}
@ -1711,6 +1722,15 @@ static BOOL changeColour(UBYTE player, UBYTE col)
}
}
debug(LOG_ERROR, "Failed to swap colours for player %d, colour %d", (int)player, (int)col);
if (player < game.maxPlayers && col < MAX_PLAYERS)
{
// Colours were corrupted. Attempt to fix.
setPlayerColour(player, col);
NetPlay.players[player].colour = col;
NETBroadcastPlayerInfo(player);
netPlayersUpdated = true;
return true;
}
return false;
}
@ -1814,6 +1834,9 @@ static void addTeamChooser(UDWORD player)
debug(LOG_NET, "Opened team chooser for %d, current team: %d", player, NetPlay.players[player].team);
// delete colour chooser button
closeColourChooser();
// delete team chooser botton
widgDelete(psWScreen,MULTIOP_TEAMS_START+player);
@ -1994,7 +2017,7 @@ UDWORD addPlayerBox(BOOL players)
sButInit.pDisplay = displayTeamChooser;
sButInit.UserData = i;
if (teamChooserUp == i && !bColourChooserUp)
if (teamChooserUp == i && colourChooserUp < 0)
{
addTeamChooser(i);
}
@ -2034,7 +2057,7 @@ UDWORD addPlayerBox(BOOL players)
sButInit.pDisplay = displayPlayer;
sButInit.UserData = i;
if (bColourChooserUp && teamChooserUp < 0 && i == selectedPlayer)
if (teamChooserUp < 0 && i == colourChooserUp)
{
addColourChooser(i);
}
@ -2609,7 +2632,7 @@ static void processMultiopWidgets(UDWORD id)
int clickedMenuID = id - MULTIOP_TEAMS_START;
//make sure team chooser is not up before adding new one for another player
if (teamChooserUp < 0 && !bColourChooserUp && canChooseTeamFor(clickedMenuID))
if (teamChooserUp < 0 && colourChooserUp < 0 && canChooseTeamFor(clickedMenuID))
{
addTeamChooser(clickedMenuID);
}
@ -2718,7 +2741,7 @@ static void processMultiopWidgets(UDWORD id)
{
resetReadyStatus(false); // will reset only locally if not a host
SendColourRequest(selectedPlayer, id - MULTIOP_COLCHOOSER);
SendColourRequest(colourChooserUp, id - MULTIOP_COLCHOOSER);
closeColourChooser();
addPlayerBox( !ingame.bHostSetup || bHosted);
}
@ -2728,7 +2751,7 @@ static void processMultiopWidgets(UDWORD id)
{
resetReadyStatus(false); // will reset only locally if not a host
SendPositionRequest(selectedPlayer, id - MULTIOP_PLAYCHOOSER);
SendPositionRequest(colourChooserUp, id - MULTIOP_PLAYCHOOSER);
closeColourChooser();
addPlayerBox( !ingame.bHostSetup || bHosted);
}