From bc2ff1a777cdcb6b6fa848f1168778438c4ea410 Mon Sep 17 00:00:00 2001 From: Marko Lindqvist Date: Sat, 14 May 2022 10:08:55 +0300 Subject: [PATCH 35/35] Add client common treaty list handling See osdn #44588 Signed-off-by: Marko Lindqvist --- client/Makefile.am | 2 + client/clitreaty.c | 150 ++++++++++++++++ client/clitreaty.h | 33 ++++ client/gui-gtk-3.22/diplodlg.c | 126 +++++++------- client/gui-gtk-4.0/diplodlg.c | 124 +++++++------- client/gui-qt/diplodlg.cpp | 303 +++++++++++++++++---------------- client/gui-qt/diplodlg.h | 27 +-- client/gui-qt/qtg_cxxside.cpp | 7 + client/gui-qt/qtg_cxxside.h | 9 + client/gui-sdl2/diplodlg.c | 163 +++++++++--------- client/gui-stub/diplodlg.c | 23 ++- client/gui_interface.c | 51 ++++++ client/gui_interface.h | 10 ++ client/include/diplodlg_g.h | 29 ++-- client/packhand.c | 44 +++++ meson.build | 1 + 16 files changed, 727 insertions(+), 375 deletions(-) create mode 100644 client/clitreaty.c create mode 100644 client/clitreaty.h diff --git a/client/Makefile.am b/client/Makefile.am index 98b4e52f1b..cb454c050a 100644 --- a/client/Makefile.am +++ b/client/Makefile.am @@ -100,6 +100,8 @@ freeciv_client_src = $(AUDIO_SDL_FILES) \ climap.h \ clinet.c \ clinet.h \ + clitreaty.c \ + clitreaty.h \ colors_common.c \ colors_common.h \ control.c \ diff --git a/client/clitreaty.c b/client/clitreaty.c new file mode 100644 index 0000000000..f2ff3de77f --- /dev/null +++ b/client/clitreaty.c @@ -0,0 +1,150 @@ +/*********************************************************************** + Freeciv - Copyright (C) 2005 - The Freeciv Team + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +/* utility */ +#include "shared.h" + +/* common */ +#include "diptreaty.h" + +/* client */ +#include "client_main.h" +#include "diplodlg_g.h" + +#include "clitreaty.h" + +/**********************************************************************//** + Handle new meeting request. +**************************************************************************/ +void client_init_meeting(int counterpart, int initiated_from) +{ + struct Treaty *ptreaty; + struct player *we; + struct player *they; + + if (!can_client_issue_orders()) { + return; + } + + we = client_player(); + they = player_by_number(counterpart); + ptreaty = find_treaty(we, they); + + if (ptreaty == NULL) { + ptreaty = fc_malloc(sizeof(*ptreaty)); + init_treaty(ptreaty, we, they); + treaty_add(ptreaty); + } + + gui_init_meeting(ptreaty, they, player_by_number(initiated_from)); +} + +/**********************************************************************//** + Handle server information about treaty acceptance. +**************************************************************************/ +void client_recv_accept_treaty(int counterpart, bool I_accepted, + bool other_accepted) +{ + struct Treaty *ptreaty; + struct player *we; + struct player *they; + + we = client_player(); + they = player_by_number(counterpart); + ptreaty = find_treaty(we, they); + + if (ptreaty == NULL) { + return; + } + + ptreaty->accept0 = I_accepted; + ptreaty->accept1 = other_accepted; + + gui_recv_accept_treaty(ptreaty, they); +} + +/**********************************************************************//** + Handle server information about meeting cancellation. +**************************************************************************/ +void client_recv_cancel_meeting(int counterpart, int initiated_from) +{ + struct Treaty *ptreaty; + struct player *we; + struct player *they; + + we = client_player(); + they = player_by_number(counterpart); + ptreaty = find_treaty(we, they); + + if (ptreaty == NULL) { + return; + } + + gui_recv_cancel_meeting(ptreaty, they, player_by_number(initiated_from)); + + treaty_remove(ptreaty); +} + +/**********************************************************************//** + Handle server information about addition of a clause +**************************************************************************/ +void client_recv_create_clause(int counterpart, int giver, + enum clause_type type, int value) +{ + struct Treaty *ptreaty; + struct player *we; + struct player *they; + + we = client_player(); + they = player_by_number(counterpart); + ptreaty = find_treaty(we, they); + + if (ptreaty == NULL) { + return; + } + + gui_prepare_clause_updt(ptreaty, they); + + add_clause(ptreaty, player_by_number(giver), type, value); + + gui_recv_create_clause(ptreaty, they); +} + +/**********************************************************************//** + Handle server information about removal of a clause +**************************************************************************/ +void client_recv_remove_clause(int counterpart, int giver, + enum clause_type type, int value) +{ + struct Treaty *ptreaty; + struct player *we; + struct player *they; + + we = client_player(); + they = player_by_number(counterpart); + ptreaty = find_treaty(we, they); + + if (ptreaty == NULL) { + return; + } + + gui_prepare_clause_updt(ptreaty, they); + + remove_clause(ptreaty, player_by_number(giver), type, value); + + gui_recv_remove_clause(ptreaty, they); +} diff --git a/client/clitreaty.h b/client/clitreaty.h new file mode 100644 index 0000000000..0789f1c141 --- /dev/null +++ b/client/clitreaty.h @@ -0,0 +1,33 @@ +/*********************************************************************** + Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. +***********************************************************************/ +#ifndef FC__CLITREATY_H +#define FC__CLITREATY_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +void client_init_meeting(int counterpart, int initiated_from); +void client_recv_accept_treaty(int counterpart, bool I_accepted, + bool other_accepted); +void client_recv_cancel_meeting(int counterpart, int initiated_from); +void client_recv_create_clause(int counterpart, int giver, + enum clause_type type, int value); +void client_recv_remove_clause(int counterpart, int giver, + enum clause_type type, int value); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* FC__CLITREATY_H */ diff --git a/client/gui-gtk-3.22/diplodlg.c b/client/gui-gtk-3.22/diplodlg.c index 63890e5e13..6a2f909f01 100644 --- a/client/gui-gtk-3.22/diplodlg.c +++ b/client/gui-gtk-3.22/diplodlg.c @@ -52,9 +52,9 @@ #define MAX_NUM_CLAUSES 64 struct Diplomacy_dialog { - struct Treaty treaty; - struct gui_dialog* dialog; - + struct Treaty *treaty; + struct gui_dialog *dialog; + GtkWidget *menu0; GtkWidget *menu1; @@ -65,7 +65,7 @@ struct Diplomacy_dialog { }; struct Diplomacy_notebook { - struct gui_dialog* dialog; + struct gui_dialog *dialog; GtkWidget *notebook; }; @@ -80,11 +80,13 @@ struct Diplomacy_notebook { static struct dialog_list *dialog_list; static struct Diplomacy_notebook *dipl_main; -static struct Diplomacy_dialog *create_diplomacy_dialog(struct player *plr0, - struct player *plr1); +static struct Diplomacy_dialog *create_diplomacy_dialog(struct Treaty *ptreaty, + struct player *plr0, + struct player *plr1); -static struct Diplomacy_dialog *find_diplomacy_dialog(int other_player_id); -static void popup_diplomacy_dialog(int other_player_id, int initiated_from); +static struct Diplomacy_dialog *find_diplomacy_dialog(struct player *they); +static void popup_diplomacy_dialog(struct Treaty *ptreaty, struct player *they, + struct player *initiator); static void diplomacy_dialog_map_callback(GtkWidget *w, gpointer data); static void diplomacy_dialog_seamap_callback(GtkWidget *w, gpointer data); static void diplomacy_dialog_tech_callback(GtkWidget *w, gpointer data); @@ -109,17 +111,15 @@ static void diplomacy_main_response(struct gui_dialog *dlg, int response, /************************************************************************//** Server tells us that either party has accepted treaty ****************************************************************************/ -void handle_diplomacy_accept_treaty(int counterpart, bool I_accepted, - bool other_accepted) +void gui_recv_accept_treaty(struct Treaty *ptreaty, struct player *they) { - struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(counterpart); + struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(they); if (!pdialog) { return; } - pdialog->treaty.accept0 = I_accepted; - pdialog->treaty.accept1 = other_accepted; + fc_assert(pdialog->treaty == ptreaty); update_diplomacy_dialog(pdialog); gui_dialog_alert(pdialog->dialog); @@ -128,38 +128,50 @@ void handle_diplomacy_accept_treaty(int counterpart, bool I_accepted, /************************************************************************//** Someone is initiating meeting with us. ****************************************************************************/ -void handle_diplomacy_init_meeting(int counterpart, int initiated_from) +void gui_init_meeting(struct Treaty *ptreaty, struct player *they, + struct player *initiator) { - popup_diplomacy_dialog(counterpart, initiated_from); + popup_diplomacy_dialog(ptreaty, they, initiator); } /************************************************************************//** Meeting has been cancelled. ****************************************************************************/ -void handle_diplomacy_cancel_meeting(int counterpart, int initiated_from) +void gui_recv_cancel_meeting(struct Treaty *ptreaty, struct player *they, + struct player *initiator) { - struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(counterpart); + struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(they); if (!pdialog) { return; } + fc_assert(pdialog->treaty == ptreaty); + close_diplomacy_dialog(pdialog); } +/**********************************************************************//** + Prepare to clause creation or removal. +**************************************************************************/ +void gui_prepare_clause_updt(struct Treaty *ptreaty, struct player *they) +{ + /* Not needed */ +} + /************************************************************************//** Added clause to the meeting ****************************************************************************/ -void handle_diplomacy_create_clause(int counterpart, int giver, - enum clause_type type, int value) +void gui_recv_create_clause(struct Treaty *ptreaty, struct player *they) { - struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(counterpart); + struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(they); if (!pdialog) { return; } - add_clause(&pdialog->treaty, player_by_number(giver), type, value); + fc_assert(pdialog->treaty == ptreaty); + update_diplomacy_dialog(pdialog); gui_dialog_alert(pdialog->dialog); } @@ -167,16 +179,16 @@ void handle_diplomacy_create_clause(int counterpart, int giver, /************************************************************************//** Removed clause from meeting. ****************************************************************************/ -void handle_diplomacy_remove_clause(int counterpart, int giver, - enum clause_type type, int value) +void gui_recv_remove_clause(struct Treaty *ptreaty, struct player *they) { - struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(counterpart); + struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(they); if (!pdialog) { return; } - remove_clause(&pdialog->treaty, player_by_number(giver), type, value); + fc_assert(pdialog->treaty == ptreaty); + update_diplomacy_dialog(pdialog); gui_dialog_alert(pdialog->dialog); } @@ -184,26 +196,22 @@ void handle_diplomacy_remove_clause(int counterpart, int giver, /************************************************************************//** Popup the dialog 10% inside the main-window ****************************************************************************/ -static void popup_diplomacy_dialog(int other_player_id, int initiated_from) +static void popup_diplomacy_dialog(struct Treaty *ptreaty, struct player *they, + struct player *initiator) { - struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(other_player_id); - - if (!can_client_issue_orders()) { - return; - } + struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(they); - if (!is_human(client.conn.playing)) { + if (!is_human(client_player())) { return; /* Don't show if we are not human controlled. */ } if (!pdialog) { - pdialog = create_diplomacy_dialog(client.conn.playing, - player_by_number(other_player_id)); + pdialog = create_diplomacy_dialog(ptreaty, client_player(), they); } gui_dialog_present(pdialog->dialog); /* We initated the meeting - Make the tab active */ - if (player_by_number(initiated_from) == client.conn.playing) { + if (initiator == client_player()) { /* we have to raise the diplomacy meeting tab as well as the selected * meeting. */ fc_assert_ret(dipl_main != NULL); @@ -244,8 +252,8 @@ static void popup_add_menu(GtkMenuShell *parent, gpointer data) pdialog = (struct Diplomacy_dialog *) data; pgiver = (struct player *) g_object_get_data(G_OBJECT(parent), "plr"); - pother = (pgiver == pdialog->treaty.plr0 - ? pdialog->treaty.plr1 : pdialog->treaty.plr0); + pother = (pgiver == pdialog->treaty->plr0 + ? pdialog->treaty->plr1 : pdialog->treaty->plr0); /* Maps. */ @@ -414,7 +422,7 @@ static void popup_add_menu(GtkMenuShell *parent, gpointer data) /* Pacts. */ - if (pgiver == pdialog->treaty.plr0) { + if (pgiver == pdialog->treaty->plr0) { enum diplstate_type ds; ds = player_diplstate_get(pgiver, pother)->type; @@ -458,10 +466,10 @@ static void row_callback(GtkTreeView *view, GtkTreePath *path, index = gtk_tree_path_get_indices(path); i = 0; - clause_list_iterate(pdialog->treaty.clauses, pclause) { + clause_list_iterate(pdialog->treaty->clauses, pclause) { if (i == index[0]) { dsend_packet_diplomacy_remove_clause_req(&client.conn, - player_number(pdialog->treaty.plr1), + player_number(pdialog->treaty->plr1), player_number(pclause->from), pclause->type, pclause->value); @@ -549,7 +557,7 @@ static void diplomacy_main_response(struct gui_dialog *dlg, int response, * client. Closing the last dialog will also close the main tab.*/ dsend_packet_diplomacy_cancel_meeting_req(&client.conn, player_number( - adialog->treaty.plr1)); + adialog->treaty->plr1)); } dialog_list_iterate_end; break; } @@ -600,7 +608,7 @@ static void diplomacy_response(struct gui_dialog *dlg, int response, case GTK_RESPONSE_ACCEPT: /* Accept treaty. */ dsend_packet_diplomacy_accept_treaty_req(&client.conn, player_number( - pdialog->treaty.plr1)); + pdialog->treaty->plr1)); break; default: @@ -611,7 +619,7 @@ static void diplomacy_response(struct gui_dialog *dlg, int response, case RESPONSE_CANCEL_MEETING: /* Cancel meetings. */ dsend_packet_diplomacy_cancel_meeting_req(&client.conn, player_number( - pdialog->treaty.plr1)); + pdialog->treaty->plr1)); break; } } @@ -619,7 +627,8 @@ static void diplomacy_response(struct gui_dialog *dlg, int response, /************************************************************************//** Setups diplomacy dialog widgets. ****************************************************************************/ -static struct Diplomacy_dialog *create_diplomacy_dialog(struct player *plr0, +static struct Diplomacy_dialog *create_diplomacy_dialog(struct Treaty *ptreaty, + struct player *plr0, struct player *plr1) { struct Diplomacy_notebook *dipl_dialog; @@ -638,7 +647,7 @@ static struct Diplomacy_dialog *create_diplomacy_dialog(struct player *plr0, pdialog = fc_malloc(sizeof(*pdialog)); dialog_list_prepend(dialog_list, pdialog); - init_treaty(&pdialog->treaty, plr0, plr1); + pdialog->treaty = ptreaty; /* Get main diplomacy tab. */ dipl_dialog = diplomacy_main_create(); @@ -915,7 +924,7 @@ static void update_diplomacy_dialog(struct Diplomacy_dialog *pdialog) store = pdialog->store; gtk_list_store_clear(store); - clause_list_iterate(pdialog->treaty.clauses, pclause) { + clause_list_iterate(pdialog->treaty->clauses, pclause) { char buf[128]; client_diplomacy_clause_string(buf, sizeof(buf), pclause); @@ -932,10 +941,10 @@ static void update_diplomacy_dialog(struct Diplomacy_dialog *pdialog) "Please add some clauses. ---"), -1); } - pixbuf = get_thumb_pixbuf(pdialog->treaty.accept0); + pixbuf = get_thumb_pixbuf(pdialog->treaty->accept0); gtk_image_set_from_pixbuf(GTK_IMAGE(pdialog->image0), pixbuf); g_object_unref(G_OBJECT(pixbuf)); - pixbuf = get_thumb_pixbuf(pdialog->treaty.accept1); + pixbuf = get_thumb_pixbuf(pdialog->treaty->accept1); gtk_image_set_from_pixbuf(GTK_IMAGE(pdialog->image1), pixbuf); g_object_unref(G_OBJECT(pixbuf)); } @@ -1018,7 +1027,7 @@ static void diplomacy_dialog_map_callback(GtkWidget *w, gpointer data) pgiver = (struct player *)g_object_get_data(G_OBJECT(w), "plr"); dsend_packet_diplomacy_create_clause_req(&client.conn, - player_number(pdialog->treaty.plr1), + player_number(pdialog->treaty->plr1), player_number(pgiver), CLAUSE_MAP, 0); } @@ -1033,7 +1042,7 @@ static void diplomacy_dialog_seamap_callback(GtkWidget *w, gpointer data) pgiver = (struct player *)g_object_get_data(G_OBJECT(w), "plr"); dsend_packet_diplomacy_create_clause_req(&client.conn, - player_number(pdialog->treaty.plr1), + player_number(pdialog->treaty->plr1), player_number(pgiver), CLAUSE_SEAMAP, 0); } @@ -1047,8 +1056,8 @@ static void diplomacy_dialog_add_pact_clause(GtkWidget *w, gpointer data, struct Diplomacy_dialog *pdialog = (struct Diplomacy_dialog *)data; dsend_packet_diplomacy_create_clause_req(&client.conn, - player_number(pdialog->treaty.plr1), - player_number(pdialog->treaty.plr0), + player_number(pdialog->treaty->plr1), + player_number(pdialog->treaty->plr0), type, 0); } @@ -1086,7 +1095,7 @@ static void diplomacy_dialog_vision_callback(GtkWidget *w, gpointer data) (struct player *) g_object_get_data(G_OBJECT(w), "plr"); dsend_packet_diplomacy_create_clause_req(&client.conn, - player_number(pdialog->treaty.plr1), + player_number(pdialog->treaty->plr1), player_number(pgiver), CLAUSE_VISION, 0); } @@ -1101,7 +1110,7 @@ static void diplomacy_dialog_embassy_callback(GtkWidget *w, gpointer data) (struct player *) g_object_get_data(G_OBJECT(w), "plr"); dsend_packet_diplomacy_create_clause_req(&client.conn, - player_number(pdialog->treaty.plr1), + player_number(pdialog->treaty->plr1), player_number(pgiver), CLAUSE_EMBASSY, 0); } @@ -1134,14 +1143,13 @@ void diplomacy_dialog_done(void) /************************************************************************//** Find diplomacy dialog between player and other player ****************************************************************************/ -static struct Diplomacy_dialog *find_diplomacy_dialog(int other_player_id) +static struct Diplomacy_dialog *find_diplomacy_dialog(struct player *they) { struct player *plr0 = client.conn.playing; - struct player *plr1 = player_by_number(other_player_id); dialog_list_iterate(dialog_list, pdialog) { - if ((pdialog->treaty.plr0 == plr0 && pdialog->treaty.plr1 == plr1) - || (pdialog->treaty.plr0 == plr1 && pdialog->treaty.plr1 == plr0)) { + if ((pdialog->treaty->plr0 == plr0 && pdialog->treaty->plr1 == they) + || (pdialog->treaty->plr0 == they && pdialog->treaty->plr1 == plr0)) { return pdialog; } } dialog_list_iterate_end; @@ -1161,7 +1169,7 @@ static void diplo_dialog_returnkey(GtkWidget *w, gpointer data) if (amount >= 0 && amount <= pgiver->economic.gold) { dsend_packet_diplomacy_create_clause_req(&client.conn, - player_number(pdialog->treaty.plr1), + player_number(pdialog->treaty->plr1), player_number(pgiver), CLAUSE_GOLD, amount); } else { diff --git a/client/gui-gtk-4.0/diplodlg.c b/client/gui-gtk-4.0/diplodlg.c index e236a13c39..72cf96d7aa 100644 --- a/client/gui-gtk-4.0/diplodlg.c +++ b/client/gui-gtk-4.0/diplodlg.c @@ -52,8 +52,8 @@ #define MAX_NUM_CLAUSES 64 struct Diplomacy_dialog { - struct Treaty treaty; - struct gui_dialog* dialog; + struct Treaty *treaty; + struct gui_dialog *dialog; GtkWidget *menu0; GtkWidget *menu1; @@ -65,7 +65,7 @@ struct Diplomacy_dialog { }; struct Diplomacy_notebook { - struct gui_dialog* dialog; + struct gui_dialog *dialog; GtkWidget *notebook; }; @@ -80,11 +80,13 @@ struct Diplomacy_notebook { static struct dialog_list *dialog_list; static struct Diplomacy_notebook *dipl_main; -static struct Diplomacy_dialog *create_diplomacy_dialog(struct player *plr0, - struct player *plr1); +static struct Diplomacy_dialog *create_diplomacy_dialog(struct Treaty *ptreaty, + struct player *plr0, + struct player *plr1); -static struct Diplomacy_dialog *find_diplomacy_dialog(int other_player_id); -static void popup_diplomacy_dialog(int other_player_id, int initiated_from); +static struct Diplomacy_dialog *find_diplomacy_dialog(struct player *they); +static void popup_diplomacy_dialog(struct Treaty *ptreaty, struct player *they, + struct player *initiator); #ifdef MENUS_GTK3 static void diplomacy_dialog_map_callback(GtkWidget *w, gpointer data); @@ -113,17 +115,15 @@ static void diplomacy_main_response(struct gui_dialog *dlg, int response, /************************************************************************//** Server tells us that either party has accepted treaty ****************************************************************************/ -void handle_diplomacy_accept_treaty(int counterpart, bool I_accepted, - bool other_accepted) +void gui_recv_accept_treaty(struct Treaty *ptreaty, struct player *they) { - struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(counterpart); + struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(they); if (!pdialog) { return; } - pdialog->treaty.accept0 = I_accepted; - pdialog->treaty.accept1 = other_accepted; + fc_assert(pdialog->treaty == ptreaty); update_diplomacy_dialog(pdialog); gui_dialog_alert(pdialog->dialog); @@ -132,38 +132,50 @@ void handle_diplomacy_accept_treaty(int counterpart, bool I_accepted, /************************************************************************//** Someone is initiating meeting with us. ****************************************************************************/ -void handle_diplomacy_init_meeting(int counterpart, int initiated_from) +void gui_init_meeting(struct Treaty *ptreaty, struct player *they, + struct player *initiator) { - popup_diplomacy_dialog(counterpart, initiated_from); + popup_diplomacy_dialog(ptreaty, they, initiator); } /************************************************************************//** Meeting has been cancelled. ****************************************************************************/ -void handle_diplomacy_cancel_meeting(int counterpart, int initiated_from) +void gui_recv_cancel_meeting(struct Treaty *ptreaty, struct player *they, + struct player *initiator) { - struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(counterpart); + struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(they); if (!pdialog) { return; } + fc_assert(pdialog->treaty == ptreaty); + close_diplomacy_dialog(pdialog); } +/**********************************************************************//** + Prepare to clause creation or removal. +**************************************************************************/ +void gui_prepare_clause_updt(struct Treaty *ptreaty, struct player *they) +{ + /* Not needed */ +} + /************************************************************************//** Added clause to the meeting ****************************************************************************/ -void handle_diplomacy_create_clause(int counterpart, int giver, - enum clause_type type, int value) +void gui_recv_create_clause(struct Treaty *ptreaty, struct player *they) { - struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(counterpart); + struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(they); if (!pdialog) { return; } - add_clause(&pdialog->treaty, player_by_number(giver), type, value); + fc_assert(pdialog->treaty == ptreaty); + update_diplomacy_dialog(pdialog); gui_dialog_alert(pdialog->dialog); } @@ -171,16 +183,16 @@ void handle_diplomacy_create_clause(int counterpart, int giver, /************************************************************************//** Removed clause from meeting. ****************************************************************************/ -void handle_diplomacy_remove_clause(int counterpart, int giver, - enum clause_type type, int value) +void gui_recv_remove_clause(struct Treaty *ptreaty, struct player *they) { - struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(counterpart); + struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(they); if (!pdialog) { return; } - remove_clause(&pdialog->treaty, player_by_number(giver), type, value); + fc_assert(pdialog->treaty == ptreaty); + update_diplomacy_dialog(pdialog); gui_dialog_alert(pdialog->dialog); } @@ -188,26 +200,22 @@ void handle_diplomacy_remove_clause(int counterpart, int giver, /************************************************************************//** Popup the dialog 10% inside the main-window ****************************************************************************/ -static void popup_diplomacy_dialog(int other_player_id, int initiated_from) +static void popup_diplomacy_dialog(struct Treaty *ptreaty, struct player *they, + struct player *initiator) { - struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(other_player_id); - - if (!can_client_issue_orders()) { - return; - } + struct Diplomacy_dialog *pdialog = find_diplomacy_dialog(they); - if (!is_human(client.conn.playing)) { + if (!is_human(client_player())) { return; /* Don't show if we are not human controlled. */ } if (!pdialog) { - pdialog = create_diplomacy_dialog(client.conn.playing, - player_by_number(other_player_id)); + pdialog = create_diplomacy_dialog(ptreaty, client_player(), they); } gui_dialog_present(pdialog->dialog); /* We initated the meeting - Make the tab active */ - if (player_by_number(initiated_from) == client.conn.playing) { + if (initiator == client_player()) { /* we have to raise the diplomacy meeting tab as well as the selected * meeting. */ fc_assert_ret(dipl_main != NULL); @@ -249,8 +257,8 @@ static void popup_add_menu(GtkMenuShell *parent, gpointer data) pdialog = (struct Diplomacy_dialog *) data; pgiver = (struct player *) g_object_get_data(G_OBJECT(parent), "plr"); - pother = (pgiver == pdialog->treaty.plr0 - ? pdialog->treaty.plr1 : pdialog->treaty.plr0); + pother = (pgiver == pdialog->treaty->plr0 + ? pdialog->treaty->plr1 : pdialog->treaty->plr0); /* Maps. */ @@ -419,7 +427,7 @@ static void popup_add_menu(GtkMenuShell *parent, gpointer data) /* Pacts. */ - if (pgiver == pdialog->treaty.plr0) { + if (pgiver == pdialog->treaty->plr0) { enum diplstate_type ds; ds = player_diplstate_get(pgiver, pother)->type; @@ -464,10 +472,10 @@ static void row_callback(GtkTreeView *view, GtkTreePath *path, index = gtk_tree_path_get_indices(path); i = 0; - clause_list_iterate(pdialog->treaty.clauses, pclause) { + clause_list_iterate(pdialog->treaty->clauses, pclause) { if (i == index[0]) { dsend_packet_diplomacy_remove_clause_req(&client.conn, - player_number(pdialog->treaty.plr1), + player_number(pdialog->treaty->plr1), player_number(pclause->from), pclause->type, pclause->value); @@ -553,7 +561,7 @@ static void diplomacy_main_response(struct gui_dialog *dlg, int response, * client. Closing the last dialog will also close the main tab.*/ dsend_packet_diplomacy_cancel_meeting_req(&client.conn, player_number( - adialog->treaty.plr1)); + adialog->treaty->plr1)); } dialog_list_iterate_end; break; } @@ -604,7 +612,7 @@ static void diplomacy_response(struct gui_dialog *dlg, int response, case GTK_RESPONSE_ACCEPT: /* Accept treaty. */ dsend_packet_diplomacy_accept_treaty_req(&client.conn, player_number( - pdialog->treaty.plr1)); + pdialog->treaty->plr1)); break; default: @@ -615,7 +623,7 @@ static void diplomacy_response(struct gui_dialog *dlg, int response, case RESPONSE_CANCEL_MEETING: /* Cancel meetings. */ dsend_packet_diplomacy_cancel_meeting_req(&client.conn, player_number( - pdialog->treaty.plr1)); + pdialog->treaty->plr1)); break; } } @@ -623,7 +631,8 @@ static void diplomacy_response(struct gui_dialog *dlg, int response, /************************************************************************//** Setups diplomacy dialog widgets. ****************************************************************************/ -static struct Diplomacy_dialog *create_diplomacy_dialog(struct player *plr0, +static struct Diplomacy_dialog *create_diplomacy_dialog(struct Treaty *ptreaty, + struct player *plr0, struct player *plr1) { struct Diplomacy_notebook *dipl_dialog; @@ -648,7 +657,7 @@ static struct Diplomacy_dialog *create_diplomacy_dialog(struct player *plr0, pdialog = fc_malloc(sizeof(*pdialog)); dialog_list_prepend(dialog_list, pdialog); - init_treaty(&pdialog->treaty, plr0, plr1); + pdialog->treaty = ptreaty; /* Get main diplomacy tab. */ dipl_dialog = diplomacy_main_create(); @@ -933,7 +942,7 @@ static void update_diplomacy_dialog(struct Diplomacy_dialog *pdialog) store = pdialog->store; gtk_list_store_clear(store); - clause_list_iterate(pdialog->treaty.clauses, pclause) { + clause_list_iterate(pdialog->treaty->clauses, pclause) { char buf[128]; client_diplomacy_clause_string(buf, sizeof(buf), pclause); @@ -950,10 +959,10 @@ static void update_diplomacy_dialog(struct Diplomacy_dialog *pdialog) "Please add some clauses. ---"), -1); } - pixbuf = get_thumb_pixbuf(pdialog->treaty.accept0); + pixbuf = get_thumb_pixbuf(pdialog->treaty->accept0); gtk_image_set_from_pixbuf(GTK_IMAGE(pdialog->image0), pixbuf); g_object_unref(G_OBJECT(pixbuf)); - pixbuf = get_thumb_pixbuf(pdialog->treaty.accept1); + pixbuf = get_thumb_pixbuf(pdialog->treaty->accept1); gtk_image_set_from_pixbuf(GTK_IMAGE(pdialog->image1), pixbuf); g_object_unref(G_OBJECT(pixbuf)); } @@ -1037,7 +1046,7 @@ static void diplomacy_dialog_map_callback(GtkWidget *w, gpointer data) pgiver = (struct player *)g_object_get_data(G_OBJECT(w), "plr"); dsend_packet_diplomacy_create_clause_req(&client.conn, - player_number(pdialog->treaty.plr1), + player_number(pdialog->treaty->plr1), player_number(pgiver), CLAUSE_MAP, 0); } @@ -1052,7 +1061,7 @@ static void diplomacy_dialog_seamap_callback(GtkWidget *w, gpointer data) pgiver = (struct player *)g_object_get_data(G_OBJECT(w), "plr"); dsend_packet_diplomacy_create_clause_req(&client.conn, - player_number(pdialog->treaty.plr1), + player_number(pdialog->treaty->plr1), player_number(pgiver), CLAUSE_SEAMAP, 0); } @@ -1066,8 +1075,8 @@ static void diplomacy_dialog_add_pact_clause(GtkWidget *w, gpointer data, struct Diplomacy_dialog *pdialog = (struct Diplomacy_dialog *)data; dsend_packet_diplomacy_create_clause_req(&client.conn, - player_number(pdialog->treaty.plr1), - player_number(pdialog->treaty.plr0), + player_number(pdialog->treaty->plr1), + player_number(pdialog->treaty->plr0), type, 0); } @@ -1105,7 +1114,7 @@ static void diplomacy_dialog_vision_callback(GtkWidget *w, gpointer data) (struct player *) g_object_get_data(G_OBJECT(w), "plr"); dsend_packet_diplomacy_create_clause_req(&client.conn, - player_number(pdialog->treaty.plr1), + player_number(pdialog->treaty->plr1), player_number(pgiver), CLAUSE_VISION, 0); } @@ -1120,7 +1129,7 @@ static void diplomacy_dialog_embassy_callback(GtkWidget *w, gpointer data) (struct player *) g_object_get_data(G_OBJECT(w), "plr"); dsend_packet_diplomacy_create_clause_req(&client.conn, - player_number(pdialog->treaty.plr1), + player_number(pdialog->treaty->plr1), player_number(pgiver), CLAUSE_EMBASSY, 0); } @@ -1154,14 +1163,13 @@ void diplomacy_dialog_done(void) /************************************************************************//** Find diplomacy dialog between player and other player ****************************************************************************/ -static struct Diplomacy_dialog *find_diplomacy_dialog(int other_player_id) +static struct Diplomacy_dialog *find_diplomacy_dialog(struct player *they) { struct player *plr0 = client.conn.playing; - struct player *plr1 = player_by_number(other_player_id); dialog_list_iterate(dialog_list, pdialog) { - if ((pdialog->treaty.plr0 == plr0 && pdialog->treaty.plr1 == plr1) - || (pdialog->treaty.plr0 == plr1 && pdialog->treaty.plr1 == plr0)) { + if ((pdialog->treaty->plr0 == plr0 && pdialog->treaty->plr1 == they) + || (pdialog->treaty->plr0 == they && pdialog->treaty->plr1 == plr0)) { return pdialog; } } dialog_list_iterate_end; @@ -1181,7 +1189,7 @@ static void diplo_dialog_returnkey(GtkWidget *w, gpointer data) if (amount >= 0 && amount <= pgiver->economic.gold) { dsend_packet_diplomacy_create_clause_req(&client.conn, - player_number(pdialog->treaty.plr1), + player_number(pdialog->treaty->plr1), player_number(pgiver), CLAUSE_GOLD, amount); } else { diff --git a/client/gui-qt/diplodlg.cpp b/client/gui-qt/diplodlg.cpp index 792d2d0a08..3461694c05 100644 --- a/client/gui-qt/diplodlg.cpp +++ b/client/gui-qt/diplodlg.cpp @@ -51,8 +51,10 @@ extern QApplication *qapp; /************************************************************************//** Constructor for diplomacy widget ****************************************************************************/ -diplo_wdg::diplo_wdg(int counterpart, int initiated_from): QWidget() +diplo_wdg::diplo_wdg(struct Treaty *ptreaty, + struct player *they, struct player *initiator): QWidget() { + struct player *we; color *colr; QString text; QString text2; @@ -77,19 +79,19 @@ diplo_wdg::diplo_wdg(int counterpart, int initiated_from): QWidget() get_color(tileset, COLOR_MAPVIEW_CITYTEXT), get_color(tileset, COLOR_MAPVIEW_CITYTEXT_DARK) }; - if (counterpart == initiated_from) { - initiated_from = client_player_number(); + if (they == initiator) { + we = client_player(); + } else { + we = initiator; } p1_accept = false; p2_accept = false; - player1 = initiated_from; - player2 = counterpart; + plr1 = we; + plr2 = they; layout = new QGridLayout; - init_treaty(&treaty, player_by_number(counterpart), - player_by_number(initiated_from)); - state = player_diplstate_get(player_by_number(player1), - player_by_number(player2)); + treaty = ptreaty; + state = player_diplstate_get(we, they); text_tooltip = QString(diplstate_type_translated_name(state->type)); if (state->turns_left > 0) { text_tooltip = text_tooltip + " ("; @@ -101,10 +103,10 @@ diplo_wdg::diplo_wdg(int counterpart, int initiated_from): QWidget() } label3 = new QLabel; text = "

" - + QString(nation_plural_for_player(player_by_number(initiated_from))) + + QString(nation_plural_for_player(we)) .toHtmlEscaped() + "

"; - colr = get_player_color(tileset, player_by_number(initiated_from)); + colr = get_player_color(tileset, we); text = "