diff server/diplhand.c server/diplhand.c --- server/diplhand.c Wed Dec 6 05:39:41 2000 +++ server/diplhand.c Tue Dec 19 15:18:15 2000 @@ -385,6 +385,11 @@ pa.plrno0=plr0->player_no; pa.plrno1=plr1->player_no; + + /* Send at least INFO_MEETING level information to plr1 + (plr0 already have INFO_EMBASSY level information) */ + send_player_info(plr0, plr1); + lsend_packet_diplomacy_info(&plr0->connections, PACKET_DIPLOMACY_INIT_MEETING, &pa); diff server/plrhand.c server/plrhand.c --- server/plrhand.c Fri Sep 8 16:42:36 2000 +++ server/plrhand.c Tue Dec 19 19:37:11 2000 @@ -30,6 +30,7 @@ #include "citytools.h" #include "cityturn.h" +#include "diplhand.h" #include "gamelog.h" #include "maphand.h" #include "sernet.h" @@ -45,6 +46,11 @@ static void update_player_aliveness(struct player *pplayer); +static void package_player_common(int plr, struct packet_player_info *packet); + +static void package_player_info(int plr, struct packet_player_info *packet, + int receiver, enum plr_info_level info_level); + /************************************************************************** ... **************************************************************************/ @@ -868,82 +874,202 @@ **************************************************************************/ void send_player_info_c(struct player *src, struct conn_list *dest) { - int i, j; + int i; for(i=0; iplayer && pconn->observer) + package_player_info(i, &info, -1, INFO_FULL); - /* Remove when "conn_info" capability removed: now sent in - * conn_info packet. For old clients (conditional in packets.c) - * use player_addr_hack() and capstr of first connection: - */ - sz_strlcpy(info.addr, player_addr_hack(&game.players[i])); - if (conn_list_size(&game.players[i].connections)) { - sz_strlcpy(info.capability, - conn_list_get(&game.players[i].connections, 0)->capability); - } else { - info.capability[0] = '\0'; - } - /* Remove to here */ - - for (j = 0; j < MAX_NUM_WORKLISTS; j++) - copy_worklist(&info.worklists[j], &game.players[i].worklists[j]); + /* Client not yet attached to player. */ + else if (!pconn->player) + package_player_info(i, &info, -1, INFO_MINIMUM); - info.gives_shared_vision = game.players[i].gives_shared_vision; + /* Player clients (including one player observers) */ + else + package_player_info(i, &info, pconn->player->player_no, INFO_MINIMUM); - lsend_packet_player_info(dest, &info); + send_packet_player_info(pconn, &info); + conn_list_iterate_end; } } } /************************************************************************** - Convenience form of send_player_info_c. Send information about player src, or all players if src is NULL, to specified players dest (that is, to dest->connections). - As convenience to old code, dest may be NULL meaning send to - game.est_connections. (In general this may be overkill and may only - want game.game_connections, but this is safest for now...?) + If dest is NULL, send to all connections. **************************************************************************/ void send_player_info(struct player *src, struct player *dest) { - send_player_info_c(src, (dest ? &dest->connections : &game.est_connections)); + int i, j; + + for(i=0; iplayer_no, INFO_MINIMUM); + lsend_packet_player_info(&dest->connections, &info); + } else { + struct packet_player_info full_info; + package_player_info(i, &info, -1, INFO_MINIMUM); + package_player_info(i, &full_info, -1, INFO_FULL); + conn_list_iterate(game.est_connections, pconn) + + /* Observer for all players. */ + if (!pconn->player && pconn->observer) { + send_packet_player_info(pconn, &full_info); + } + + /* Client not yet attached to player. */ + else if (!pconn->player) { + send_packet_player_info(pconn, &info); + } + + conn_list_iterate_end; + + /* Player clients (including one player observers) */ + for(j=0; jplayerno=plr; + sz_strlcpy(packet->name, game.players[plr].name); + packet->nation=game.players[plr].nation; + packet->is_male=game.players[plr].is_male; + packet->city_style=game.players[plr].city_style; + + packet->is_alive=game.players[plr].is_alive; + packet->is_connected=game.players[plr].is_connected; + packet->ai=game.players[plr].ai.control; + packet->is_barbarian=game.players[plr].ai.is_barbarian; + packet->reputation=game.players[plr].reputation; + + packet->turn_done=game.players[plr].turn_done; + packet->nturns_idle=game.players[plr].nturns_idle; + + packet->gives_shared_vision = game.players[plr].gives_shared_vision; + + /* Remove when "conn_info" capability removed: now sent in + * conn_info packet. For old clients (conditional in packets.c) + * use player_addr_hack() and capstr of first connection: + */ + sz_strlcpy(packet->addr, player_addr_hack(&game.players[plr])); + if (conn_list_size(&game.players[plr].connections)) { + sz_strlcpy(packet->capability, + conn_list_get(&game.players[plr].connections, 0)->capability); + } else { + packet->capability[0] = '\0'; + } + /* Remove to here */ +} + +/************************************************************************** + If receiver != -1, info_level might get adjusted upwards inside this + function. +**************************************************************************/ +static void package_player_info(int plr, struct packet_player_info *packet, + int receiver, enum plr_info_level info_level) +{ + int i; + + if (plr == receiver) + info_level = INFO_FULL; + else if (receiver != -1 && + player_has_embassy(&game.players[receiver],&game.players[plr]) && + info_level < INFO_EMBASSY) + info_level = INFO_EMBASSY; + else if (receiver != -1 && + find_treaty(&game.players[plr], &game.players[receiver]) && + info_level < INFO_MEETING) + info_level = INFO_MEETING; + + if (info_level >= INFO_MEETING) { + packet->gold = game.players[plr].economic.gold; + for(i=0; iinventions[i] = game.players[plr].research.inventions[i]+'0'; + packet->inventions[i] = '\0'; + packet->government = game.players[plr].government; + } else { + packet->gold = 0; + for(i=0; iinventions[i] = '0'; + packet->inventions[i] = '\0'; + packet->government = G_MAGIC; + } + + if (info_level >= INFO_EMBASSY) { + packet->tax = game.players[plr].economic.tax; + packet->science = game.players[plr].economic.science; + packet->luxury = game.players[plr].economic.luxury; + packet->researched = game.players[plr].research.researched; + packet->researchpoints = game.players[plr].research.researchpoints; + packet->researching = game.players[plr].research.researching; + packet->future_tech = game.players[plr].future_tech; + } else { + packet->tax = 0; + packet->science = 0; + packet->luxury = 0; + packet->researched = 0; + packet->researchpoints = 0; + packet->researching = A_NONE; + packet->future_tech = 0; + packet->gives_shared_vision = 0; + } + + if (info_level >= INFO_FULL) { + packet->embassy=game.players[plr].embassy; + packet->gives_shared_vision = game.players[plr].gives_shared_vision; + for(i=0; idiplstates[i].type = game.players[plr].diplstates[i].type; + packet->diplstates[i].turns_left = + game.players[plr].diplstates[i].turns_left; + packet->diplstates[i].has_reason_to_cancel = + game.players[plr].diplstates[i].has_reason_to_cancel; + } + packet->tech_goal = game.players[plr].ai.tech_goal; + packet->revolution = game.players[plr].revolution; + for (i = 0; i < MAX_NUM_WORKLISTS; i++) + copy_worklist(&packet->worklists[i], &game.players[plr].worklists[i]); + } else { + if (receiver == -1 || + !player_has_embassy(&game.players[plr],&game.players[receiver])) + packet->embassy = 0; + else + packet->embassy = 1 << receiver; + if (receiver == -1 || !(game.players[plr].gives_shared_vision & (1<gives_shared_vision = 0; + else + packet->gives_shared_vision = 1 << receiver; + for(i=0; idiplstates[i].type = DS_NEUTRAL; + packet->diplstates[i].turns_left = 0; + packet->diplstates[i].has_reason_to_cancel = 0; + } + packet->tech_goal = A_NONE; + packet->revolution = 0; + for (i = 0; i < MAX_NUM_WORKLISTS; i++) + init_worklist(&packet->worklists[i]); + } } /************************************************************************** diff server/plrhand.h server/plrhand.h --- server/plrhand.h Sat Aug 26 17:48:47 2000 +++ server/plrhand.h Tue Dec 19 15:18:15 2000 @@ -21,6 +21,8 @@ struct connection; struct conn_list; +enum plr_info_level { INFO_MINIMUM, INFO_MEETING, INFO_EMBASSY, INFO_FULL }; + void server_player_init(struct player *pplayer, int initmap); void server_remove_player(struct player *pplayer); void begin_player_turn(struct player *pplayer); diff server/unitfunc.c server/unitfunc.c --- server/unitfunc.c Mon Dec 18 18:15:26 2000 +++ server/unitfunc.c Tue Dec 19 15:18:15 2000 @@ -311,7 +311,8 @@ /* Establish the embassy. */ pplayer->embassy |= (1 << pcity->owner); send_player_info(pplayer, pplayer); - send_player_info(pplayer, cplayer); /* update player dialog with embassy */ + send_player_info(pplayer, cplayer); /* update player dialog with embassy */ + send_player_info(cplayer, pplayer); /* INFO_EMBASSY level info */ /* Notify everybody involved. */ notify_player_ex (pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT, @@ -2862,7 +2863,7 @@ ransom); destroyer->economic.gold += ransom; pplayer->economic.gold -= ransom; - send_player_info(destroyer,0); /* let me see my new gold :-) */ + send_player_info(destroyer, 0); /* let me see my new gold :-) */ unitcount = 1; }