Transmit and set local color array. Fixes picking of team color bug.

Transmit player map position & handle picking of players correctly. fixes ticket:1075

Enable/disable AIs on maps. fixes ticket:1065

(r8410)

git-svn-id: https://warzone2100.svn.sourceforge.net/svnroot/warzone2100/trunk@8524 4a71c877-e1ca-e34f-864e-861f7616d084
master
Buginator 2009-11-26 18:33:03 +00:00 committed by Git SVN Gateway
parent 7620fcbdad
commit a72cb7295a
4 changed files with 99 additions and 8 deletions

View File

@ -1416,6 +1416,7 @@ void NETBroadcastPlayerInfo(uint32_t index)
NETstring(NetPlay.players[index].name, sizeof(NetPlay.players[index].name));
NETuint32_t(&NetPlay.players[index].heartattacktime);
NETint32_t(&NetPlay.players[index].colour);
NETint32_t(&NetPlay.players[index].position);
NETint32_t(&NetPlay.players[index].team);
NETbool(&NetPlay.players[index].ready);
NETuint32_t(&NetPlay.hostPlayer);
@ -2304,11 +2305,14 @@ static BOOL NETprocessSystemMessage(void)
NETstring(NetPlay.players[index].name, sizeof(NetPlay.players[index].name));
NETuint32_t(&NetPlay.players[index].heartattacktime);
NETint32_t(&NetPlay.players[index].colour);
NETint32_t(&NetPlay.players[index].position);
NETint32_t(&NetPlay.players[index].team);
NETbool(&NetPlay.players[index].ready);
NETuint32_t(&NetPlay.hostPlayer);
NETend();
debug(LOG_NET, "Receiving MSG_PLAYER_INFO for player %u (%s)", (unsigned int)index, NetPlay.players[index].allocated ? "human" : "AI");
// update the color to the local array
setPlayerColour(index, NetPlay.players[index].colour);
// If we're the game host make sure to send the updated
// data to all other clients as well.

View File

@ -1464,7 +1464,7 @@ static void addColourChooser(UDWORD player)
iV_GetImageHeight(FrontImages,IMAGE_WEE_GUY), //h
"Player number", IMAGE_WEE_GUY, IMAGE_WEE_GUY, 10 + i);
if(isHumanPlayer(i) && i!=selectedPlayer)
if(isHumanPlayer(NetPlay.players[i].position) && i!=selectedPlayer )
{
widgSetButtonState(psWScreen,MULTIOP_PLAYCHOOSER+i ,WBUT_DISABLE);
}
@ -1611,12 +1611,14 @@ static BOOL changeColour(UBYTE player, UBYTE col)
for (i = 0; i < MAX_PLAYERS; i++)
{
if (NetPlay.players[i].colour == col)
if (getPlayerColour(i) == col)
{
debug(LOG_NET, "Swapping colours between players %d(%d) and %d(%d)",
player, getPlayerColour(player), i, getPlayerColour(i));
setPlayerColour(i, getPlayerColour(player));
NetPlay.players[i].colour = getPlayerColour(player);
setPlayerColour(player, col);
NetPlay.players[player].colour = col;
NETBroadcastPlayerInfo(player);
NETBroadcastPlayerInfo(i);
return true;
@ -1651,6 +1653,7 @@ static BOOL SendPositionRequest(UBYTE player, UBYTE position)
}
else
{
debug(LOG_NET, "Requesting the host to change our position. From %d to %d", player, position);
// clients tell the host which position they want
NETbeginEncode(NET_POSITIONREQUEST, NET_HOST_ONLY);
NETuint8_t(&player);
@ -1695,14 +1698,14 @@ BOOL recvPositionRequest()
return true;
}
NETbeginDecode(NET_COLOURREQUEST);
NETbeginDecode(NET_POSITIONREQUEST);
NETuint8_t(&player);
NETuint8_t(&position);
NETend();
debug(LOG_NET, "Host received position request from player %d to %d", player, position);
if (player > MAX_PLAYERS || position > MAX_PLAYERS)
{
debug(LOG_ERROR, "Invalid NET_COLOURREQUEST from player %d: Tried to change player %d to %d",
debug(LOG_ERROR, "Invalid NET_POSITIONREQUEST from player %d: Tried to change player %d to %d",
NETgetSource(), (int)player, (int)position);
return false;
}
@ -1954,8 +1957,13 @@ UDWORD addPlayerBox(BOOL players)
sFormInit.pDisplay = displayPlayer;
sFormInit.UserData = i;
widgAddForm(psWScreen, &sFormInit);
addFESlider(MULTIOP_SKSLIDE+i,sFormInit.id, 43,9, DIFF_SLIDER_STOPS,
#ifdef DEBUG
addFESlider(MULTIOP_SKSLIDE+i,sFormInit.id, 63,9, DIFF_SLIDER_STOPS,
(game.skDiff[i] <= DIFF_SLIDER_STOPS ? game.skDiff[i] : DIFF_SLIDER_STOPS / 2)); //set to 50% (value of UBYTE_MAX == human player)
#else
addFESlider(MULTIOP_SKSLIDE+i,sFormInit.id, 43,9, DIFF_SLIDER_STOPS,
(game.skDiff[i] <= DIFF_SLIDER_STOPS ? game.skDiff[i] : DIFF_SLIDER_STOPS / 2));
#endif
}
}
}
@ -2720,6 +2728,10 @@ void frontendMultiMessages(void)
recvColourRequest();
break;
case NET_POSITIONREQUEST:
recvPositionRequest();
break;
case NET_TEAMREQUEST:
recvTeamRequest();
break;
@ -3021,7 +3033,8 @@ BOOL startMultiOptions(BOOL bReenter)
teamChooserUp = -1;
for(i=0;i<MAX_PLAYERS;i++)
{
game.skDiff[i] = (DIFF_SLIDER_STOPS / 2);
game.skDiff[i] = (DIFF_SLIDER_STOPS / 2); // reset AI (turn it on again)
setPlayerColour(i,i); //reset all colors as well
}
if(!NetPlay.bComms) // force skirmish if no comms.
@ -3473,8 +3486,76 @@ void displayPlayer(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, PIELIGHT *p
}
else
{
#ifdef DEBUG
// This is used for debugging right now, don't touch!
// yes, I know it looks like crap, but the sliders are a fixed size.
x=x+33;
// player number
switch (NetPlay.players[j].position)
{
case 0:
iV_DrawImage(IntImages,IMAGE_GN_0,x+4,y+29);
break;
case 1:
iV_DrawImage(IntImages,IMAGE_GN_1,x+5,y+29);
break;
case 2:
iV_DrawImage(IntImages,IMAGE_GN_2,x+4,y+29);
break;
case 3:
iV_DrawImage(IntImages,IMAGE_GN_3,x+4,y+29);
break;
case 4:
iV_DrawImage(IntImages,IMAGE_GN_4,x+4,y+29);
break;
case 5:
iV_DrawImage(IntImages,IMAGE_GN_5,x+4,y+29);
break;
case 6:
iV_DrawImage(IntImages,IMAGE_GN_6,x+4,y+29);
break;
case 7:
iV_DrawImage(IntImages,IMAGE_GN_7,x+4,y+29);
break;
default:
break;
}
switch(getPlayerColour(j)) //flag icon
{
case 0:
iV_DrawImage(FrontImages,IMAGE_PLAYER0,x+7,y+9);
break;
case 1:
iV_DrawImage(FrontImages,IMAGE_PLAYER1,x+7,y+9);
break;
case 2:
iV_DrawImage(FrontImages,IMAGE_PLAYER2,x+7,y+9);
break;
case 3:
iV_DrawImage(FrontImages,IMAGE_PLAYER3,x+7,y+9);
break;
case 4:
iV_DrawImage(FrontImages,IMAGE_PLAYER4,x+7,y+9);
break;
case 5:
iV_DrawImage(FrontImages,IMAGE_PLAYER5,x+7,y+9);
break;
case 6:
iV_DrawImage(FrontImages,IMAGE_PLAYER6,x+7,y+9);
break;
case 7:
iV_DrawImage(FrontImages,IMAGE_PLAYER7,x+7,y+9);
break;
default:
break;
}
#else
//bluboxes.
drawBlueBox(x,y,psWidget->width,psWidget->height); // right
#endif
}
}

View File

@ -676,9 +676,14 @@ static BOOL campInit(void)
// Remove baba player for skirmish
if (!game.scavengers)
{
for (player = game.maxPlayers; player < MAX_PLAYERS; player++)
for (player = 1; player < MAX_PLAYERS; player++)
{
// we want to remove disabled AI & all the other players that don't belong
if (game.skDiff[player] == 0 || player >= game.maxPlayers)
{
clearPlayer(player, true, false);
debug(LOG_NET, "removing disabled AI (%d) from map.", player);
}
}
}

View File

@ -731,6 +731,7 @@ BOOL recvMessage(void)
ingame.JoiningInProgress[player_id] = false;
break;
}
// FIXME: the next 4 cases might not belong here --check (we got two loops for this)
case NET_COLOURREQUEST:
recvColourRequest();
break;