diff server/diplhand.c server/diplhand.c --- server/diplhand.c Wed Dec 20 12:26:53 2000 +++ server/diplhand.c Wed Dec 20 13:47:24 2000 @@ -14,6 +14,7 @@ #include #endif +#include #include #include @@ -385,6 +386,12 @@ 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); + assert(player_has_embassy(plr0, plr1)); + lsend_packet_diplomacy_info(&plr0->connections, PACKET_DIPLOMACY_INIT_MEETING, &pa); diff server/plrhand.c server/plrhand.c --- server/plrhand.c Wed Dec 20 12:26:53 2000 +++ server/plrhand.c Wed Dec 20 15:29:44 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,14 @@ static void update_player_aliveness(struct player *pplayer); +static void package_player_common(struct player *plr, + struct packet_player_info *packet); + +static void package_player_info(struct player *plr, + struct packet_player_info *packet, + struct player *receiver, + enum plr_info_level min_info_level); + /************************************************************************** ... **************************************************************************/ @@ -868,69 +877,30 @@ **************************************************************************/ void send_player_info_c(struct player *src, struct conn_list *dest) { - int i, j; - - for(i=0; iplayer && pconn->observer) + package_player_info(pplayer, &info, 0, 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(pplayer, &info, 0, INFO_MINIMUM); - info.gives_shared_vision = game.players[i].gives_shared_vision; + /* Player clients (including one player observers) */ + else + package_player_info(pplayer, &info, pconn->player, INFO_MINIMUM); - lsend_packet_player_info(dest, &info); + send_packet_player_info(pconn, &info); + } conn_list_iterate_end; } - } + } players_iterate_end; } /************************************************************************** @@ -944,6 +914,139 @@ void send_player_info(struct player *src, struct player *dest) { send_player_info_c(src, (dest ? &dest->connections : &game.est_connections)); +} + +/************************************************************************** + Package player information that is always sent. +**************************************************************************/ +static void package_player_common(struct player *plr, + struct packet_player_info *packet) +{ + packet->playerno=plr->player_no; + sz_strlcpy(packet->name, plr->name); + packet->nation=plr->nation; + packet->is_male=plr->is_male; + packet->city_style=plr->city_style; + + packet->is_alive=plr->is_alive; + packet->is_connected=plr->is_connected; + packet->ai=plr->ai.control; + packet->is_barbarian=plr->ai.is_barbarian; + packet->reputation=plr->reputation; + + packet->turn_done=plr->turn_done; + packet->nturns_idle=plr->nturns_idle; + + /* 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(plr)); + if (conn_list_size(&plr->connections)) { + sz_strlcpy(packet->capability, + conn_list_get(&plr->connections, 0)->capability); + } else { + packet->capability[0] = '\0'; + } + /* Remove to here */ +} + +/************************************************************************** + Package player info dependant on info_level. +**************************************************************************/ +static void package_player_info(struct player *plr, + struct packet_player_info *packet, + struct player *receiver, + enum plr_info_level min_info_level) +{ + int i; + enum plr_info_level info_level; + + info_level = player_info_level(plr, receiver); + if (info_level < min_info_level) + info_level = min_info_level; + + if (info_level >= INFO_MEETING) { + packet->gold = plr->economic.gold; + for(i=0; iinventions[i] = plr->research.inventions[i]+'0'; + packet->inventions[i] = '\0'; + packet->government = 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 = plr->economic.tax; + packet->science = plr->economic.science; + packet->luxury = plr->economic.luxury; + packet->researched = plr->research.researched; + packet->researchpoints = plr->research.researchpoints; + packet->researching = plr->research.researching; + packet->future_tech = plr->future_tech; + if (plr->revolution) + packet->revolution = 1; + else + packet->revolution = 0; + } 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->revolution = 0; + } + + if (info_level >= INFO_FULL) { + packet->embassy=plr->embassy; + packet->gives_shared_vision = plr->gives_shared_vision; + for(i=0; idiplstates[i].type = plr->diplstates[i].type; + packet->diplstates[i].turns_left = plr->diplstates[i].turns_left; + packet->diplstates[i].has_reason_to_cancel = plr->diplstates[i].has_reason_to_cancel; + } + packet->tech_goal = plr->ai.tech_goal; + for (i = 0; i < MAX_NUM_WORKLISTS; i++) + copy_worklist(&packet->worklists[i], &plr->worklists[i]); + } else { + if (!receiver || !player_has_embassy(plr, receiver)) + packet->embassy = 0; + else + packet->embassy = 1 << receiver->player_no; + if (!receiver || !plr->gives_shared_vision & (1<player_no)) + packet->gives_shared_vision = 0; + else + packet->gives_shared_vision = 1 << receiver->player_no; + 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; + for (i = 0; i < MAX_NUM_WORKLISTS; i++) + init_worklist(&packet->worklists[i]); + } +} + +/************************************************************************** + ... +**************************************************************************/ +enum plr_info_level player_info_level(struct player *plr, + struct player *receiver) +{ + if (plr == receiver) + return INFO_FULL; + if (receiver && player_has_embassy(receiver, plr)) + return INFO_EMBASSY; + if (receiver && find_treaty(plr, receiver)) + return INFO_MEETING; + return INFO_MINIMUM; } /************************************************************************** diff server/plrhand.h server/plrhand.h --- server/plrhand.h Wed Dec 20 12:26:53 2000 +++ server/plrhand.h Wed Dec 20 14:14:34 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); @@ -85,5 +87,8 @@ void shuffle_players(void); struct player *shuffled_player(int i); + +enum plr_info_level player_info_level(struct player *plr, + struct player *receiver); #endif /* FC__PLRHAND_H */ diff server/unitfunc.c server/unitfunc.c --- server/unitfunc.c Wed Dec 20 12:26:53 2000 +++ server/unitfunc.c Wed Dec 20 14:59:29 2000 @@ -312,6 +312,7 @@ pplayer->embassy |= (1 << pcity->owner); send_player_info(pplayer, pplayer); 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,