|
@@ -632,50 +632,53 @@ static void DeletePlayerStuff(int pi)
|
|
|
// 2 - delete player (p2)
|
|
|
// 3 - join player (p1 >> 8) & 0xFF with (p1 >> 16) & 0xFF
|
|
|
int32 CmdPlayerCtrl(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|
|
{
|
|
|
int pi;
|
|
|
Player *p;
|
|
|
|
|
|
if (!(flags & DC_EXEC))
|
|
|
return 0;
|
|
|
|
|
|
_current_player = OWNER_NONE;
|
|
|
|
|
|
switch(p1 & 0xff) {
|
|
|
case 0: // make new player
|
|
|
p = DoStartupNewPlayer(false);
|
|
|
|
|
|
#ifdef ENABLE_NETWORK
|
|
|
if (_networking && !_network_server && _local_player == OWNER_SPECTATOR)
|
|
|
/* In case we are a client joining a server... */
|
|
|
DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0);
|
|
|
#endif /* ENABLE_NETWORK */
|
|
|
|
|
|
if (p != NULL) {
|
|
|
if (_local_player == OWNER_SPECTATOR) {
|
|
|
_local_player = p->index;
|
|
|
MarkWholeScreenDirty();
|
|
|
/* Check if we do not want to be a spectator in network */
|
|
|
if (!_networking || _network_server || _network_playas != OWNER_SPECTATOR) {
|
|
|
_local_player = p->index;
|
|
|
MarkWholeScreenDirty();
|
|
|
}
|
|
|
}
|
|
|
#ifdef ENABLE_NETWORK
|
|
|
if (_network_server) {
|
|
|
NetworkClientInfo *ci;
|
|
|
// UGLY! p2 is mis-used to fetch the client-id
|
|
|
ci = &_network_client_info[p2];
|
|
|
ci->client_playas = p->index + 1;
|
|
|
NetworkUpdateClientInfo(ci->client_index);
|
|
|
|
|
|
if (ci->client_playas != 0 && ci->client_playas <= MAX_PLAYERS) {
|
|
|
_network_player_info[p->index].months_empty = 0;
|
|
|
|
|
|
memcpy(_decode_parameters, ci->client_name, 32);
|
|
|
/* XXX - What are the consequents of this? It is needed, but is it bad? */
|
|
|
_docommand_recursive = 0;
|
|
|
DoCommandP(0, ci->client_playas-1, 0, NULL, CMD_CHANGE_PRESIDENT_NAME | CMD_MSG(STR_700D_CAN_T_CHANGE_PRESIDENT));
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
if (_network_server) {
|
|
|
NetworkClientInfo *ci;
|
|
|
// UGLY! p2 is mis-used to fetch the client-id
|
|
|
ci = &_network_client_info[p2];
|
|
|
ci->client_playas = OWNER_SPECTATOR;
|