Freeciv-3.2
Loading...
Searching...
No Matches
diplodlg.c
Go to the documentation of this file.
1/***********************************************************************
2 Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2, or (at your option)
6 any later version.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12***********************************************************************/
13
14#ifdef HAVE_CONFIG_H
15#include <fc_config.h>
16#endif
17
18#include <stdio.h>
19#include <stdlib.h>
20
21#include <gtk/gtk.h>
22
23/* utility */
24#include "log.h"
25#include "mem.h"
26#include "shared.h"
27#include "support.h"
28
29/* common */
30#include "diptreaty.h"
31#include "fcintl.h"
32#include "game.h"
33#include "government.h"
34#include "map.h"
35#include "nation.h"
36#include "packets.h"
37#include "player.h"
38#include "research.h"
39
40/* client */
41#include "chatline.h"
42#include "client_main.h"
43#include "climisc.h"
44#include "options.h"
45
46/* client/gui-gtk-4.0 */
47#include "diplodlg.h"
48#include "gui_main.h"
49#include "gui_stuff.h"
50#include "mapview.h"
51#include "plrdlg.h"
52
53struct Diplomacy_dialog {
54 struct Treaty *treaty;
55 struct gui_dialog *dialog;
56
59
61};
62
63struct Diplomacy_notebook {
64 struct gui_dialog *dialog;
66};
67
68struct city_deal {
69 int giver;
70 int receiver;
71 int id;
72};
73
74#define SPECLIST_TAG dialog
75#define SPECLIST_TYPE struct Diplomacy_dialog
76#include "speclist.h"
77
78#define dialog_list_iterate(dialoglist, pdialog) \
79 TYPED_LIST_ITERATE(struct Diplomacy_dialog, dialoglist, pdialog)
80#define dialog_list_iterate_end LIST_ITERATE_END
81
82static struct dialog_list *dialog_list;
84
86 struct player *plr0,
87 struct player *plr1);
88
90static void popup_diplomacy_dialog(struct Treaty *ptreaty, struct player *they,
91 struct player *initiator);
93 GVariant *parameter,
94 gpointer data);
96 GVariant *parameter,
97 gpointer data);
98
100 GVariant *parameter,
101 gpointer data);
103 GVariant *parameter,
104 gpointer data);
106 GVariant *parameter,
107 gpointer data);
109 GVariant *parameter,
110 gpointer data);
112 GVariant *parameter,
113 gpointer data);
115 GVariant *parameter,
116 gpointer data);
118 GVariant *parameter,
119 gpointer data);
121 GVariant *parameter,
122 gpointer data);
123
124static void close_diplomacy_dialog(struct Diplomacy_dialog *pdialog);
125static void update_diplomacy_dialog(struct Diplomacy_dialog *pdialog);
126static void diplo_dialog_returnkey(GtkWidget *w, gpointer data);
127
128static struct Diplomacy_notebook *diplomacy_main_create(void);
129static void diplomacy_main_destroy(void);
130static void diplomacy_main_response(struct gui_dialog *dlg, int response,
131 gpointer data);
132
133#define RESPONSE_CANCEL_MEETING 100
134#define RESPONSE_CANCEL_MEETING_ALL 101
135
136/************************************************************************/
140{
142
143 if (!pdialog) {
144 return;
145 }
146
147 fc_assert(pdialog->treaty == ptreaty);
148
150 gui_dialog_alert(pdialog->dialog);
151}
152
153/************************************************************************/
161
162/************************************************************************/
166 struct player *initiator)
167{
169
170 if (!pdialog) {
171 return;
172 }
173
174 fc_assert(pdialog->treaty == ptreaty);
175
176 close_diplomacy_dialog(pdialog);
177}
178
179/**********************************************************************/
183{
184 /* Not needed */
185}
186
187/************************************************************************/
191{
193
194 if (!pdialog) {
195 return;
196 }
197
198 fc_assert(pdialog->treaty == ptreaty);
199
201 gui_dialog_alert(pdialog->dialog);
202}
203
204/************************************************************************/
208{
210
211 if (!pdialog) {
212 return;
213 }
214
215 fc_assert(pdialog->treaty == ptreaty);
216
218 gui_dialog_alert(pdialog->dialog);
219}
220
221/************************************************************************/
224static void popup_diplomacy_dialog(struct Treaty *ptreaty, struct player *they,
225 struct player *initiator)
226{
228
229 if (!is_human(client_player())) {
230 return; /* Don't show if we are not human controlled. */
231 }
232
233 if (!pdialog) {
235 }
236
237 gui_dialog_present(pdialog->dialog);
238 /* We initated the meeting - Make the tab active */
239 if (initiator == client_player()) {
240 /* we have to raise the diplomacy meeting tab as well as the selected
241 * meeting. */
244 gui_dialog_raise(pdialog->dialog);
245
246 if (players_dialog_shell != NULL) {
248 }
249 }
250}
251
252/************************************************************************/
256{
257 const struct advance *padvance1 = (const struct advance *) a;
258 const struct advance *padvance2 = (const struct advance *) b;
259
262}
263
264/************************************************************************/
268 struct Diplomacy_dialog *pdialog,
269 struct player *partner, bool them)
270{
272 GSimpleAction *act;
273 bool any_map = FALSE;
274 char act_plr_part[20];
275 char act_name[60];
276 struct player *pgiver, *pother;
277
278 if (them) {
279 fc_strlcpy(act_plr_part, "_them", sizeof(act_plr_part));
280 pgiver = partner;
282 } else {
283 fc_strlcpy(act_plr_part, "_us", sizeof(act_plr_part));
285 pother = partner;
286 }
287
289
290 /* Maps. */
293
294 fc_snprintf(act_name, sizeof(act_name), "worldmap%s", act_plr_part);
296 g_object_set_data(G_OBJECT(act), "plr", pgiver);
299 pdialog);
300
301 fc_snprintf(act_name, sizeof(act_name), "win.worldmap%s", act_plr_part);
303
304 any_map = TRUE;
305 }
306
308 if (!any_map) {
310 }
311
312 fc_snprintf(act_name, sizeof(act_name), "seamap%s", act_plr_part);
314 g_object_set_data(G_OBJECT(act), "plr", pgiver);
317 pdialog);
318
319 fc_snprintf(act_name, sizeof(act_name), "win.seamap%s", act_plr_part);
321
322 any_map = TRUE;
323 }
324
325 if (any_map) {
327 }
328
329 /* Trading: advances */
331 const struct research *gresearch = research_get(pgiver);
332 const struct research *oresearch = research_get(pother);
335 int i;
336
338
341
343 && (!team_embassy /* We don't know what the other could actually receive */
348 == TECH_PREREQS_KNOWN)) {
350 }
352
353 if (NULL != sorting_list) {
355 const struct advance *padvance;
356
358
359 /* TRANS: All technologies menu item in the diplomatic dialog. */
360 fc_snprintf(act_name, sizeof(act_name), "advance%sall", act_plr_part);
362
363 g_object_set_data(G_OBJECT(act), "player_from",
365 g_object_set_data(G_OBJECT(act), "player_to",
368 g_signal_connect(act, "activate",
371
372 fc_snprintf(act_name, sizeof(act_name), "win.advance%sall", act_plr_part);
374
375 for (list_item = sorting_list, i = 0; NULL != list_item;
377
378 fc_snprintf(act_name, sizeof(act_name), "advance%s%d",
379 act_plr_part, i);
381
382 padvance = (const struct advance *) list_item->data;
383 g_object_set_data(G_OBJECT(act), "player_from",
385 g_object_set_data(G_OBJECT(act), "player_to",
388 g_signal_connect(act, "activate",
391
392 fc_snprintf(act_name, sizeof(act_name), "win.advance%s%d",
393 act_plr_part, i);
396 act_name));
397 }
398
400 }
401
403 }
404
405 /* Trading: cities. */
406
407 /****************************************************************
408 Creates a sorted list of plr0's cities, excluding the capital and
409 any cities not visible to plr1. This means that you can only trade
410 cities visible to requesting player.
411
412 - Kris Bubendorfer
413 *****************************************************************/
415 int i = 0;
416 int n = city_list_size(pgiver->cities);
417
419
420 if (n > 0) {
421 struct city **city_list_ptrs;
422
423 city_list_ptrs = fc_malloc(sizeof(struct city *) * n);
424
425 city_list_iterate(pgiver->cities, pcity) {
426 if (!is_capital(pcity)) {
427 city_list_ptrs[i] = pcity;
428 i++;
429 }
431
432 if (i > 0) { /* Cities other than capitals */
433 int j;
434
435 qsort(city_list_ptrs, i, sizeof(struct city *), city_name_compare);
436
437 for (j = 0; j < i; j++) {
438 struct city_deal *deal = fc_malloc(sizeof(struct city_deal));
439
440 fc_snprintf(act_name, sizeof(act_name), "city%s%d", act_plr_part, i);
442
443 deal->giver = player_number(pgiver);
444 deal->receiver = player_number(pother);
445 deal->id = city_list_ptrs[j]->id;
446
448 g_signal_connect(act, "activate",
450 (gpointer)deal);
451
452 fc_snprintf(act_name, sizeof(act_name), "win.city%s%d",
453 act_plr_part, i);
456 act_name));
457 }
458 }
459
461 }
462
464 }
465
466 /* Give shared vision. */
468 fc_snprintf(act_name, sizeof(act_name), "vision%s", act_plr_part);
470 g_object_set_data(G_OBJECT(act), "plr", pgiver);
473 pdialog);
474
475 fc_snprintf(act_name, sizeof(act_name), "win.vision%s", act_plr_part);
476 menu_item_append_unref(topmenu, g_menu_item_new(_("_Give shared vision"), act_name));
477
480 }
481
482 /* Give embassy. */
484 fc_snprintf(act_name, sizeof(act_name), "embassy%s", act_plr_part);
486 g_object_set_data(G_OBJECT(act), "plr", pgiver);
489 pdialog);
490
491 fc_snprintf(act_name, sizeof(act_name), "win.embassy%s", act_plr_part);
493
494 /* Don't take in account the embassy effects. */
497 }
498
499 /* Shared tiles */
501 fc_snprintf(act_name, sizeof(act_name), "tiles%s", act_plr_part);
503 g_object_set_data(G_OBJECT(act), "plr", pgiver);
506 pdialog);
507
508 fc_snprintf(act_name, sizeof(act_name), "win.tiles%s", act_plr_part);
510 }
511
512 /* Pacts. */
513 if (pgiver == pdialog->treaty->plr0) {
514 enum diplstate_type ds;
515 int pact_clauses = 0;
516
518
520
522 fc_snprintf(act_name, sizeof(act_name), "ceasefire%s", act_plr_part);
525 g_signal_connect(act, "activate",
527
528 fc_snprintf(act_name, sizeof(act_name), "win.ceasefire%s", act_plr_part);
530 g_menu_item_new(Q_("?diplomatic_state:Cease-fire"),
531 act_name));
532
534 ds != DS_CEASEFIRE && ds != DS_TEAM);
535 pact_clauses++;
536 }
537
539 fc_snprintf(act_name, sizeof(act_name), "peace%s", act_plr_part);
542 g_signal_connect(act, "activate",
544
545 fc_snprintf(act_name, sizeof(act_name), "win.peace%s", act_plr_part);
546 menu_item_append_unref(submenu, g_menu_item_new(Q_("?diplomatic_state:Peace"),
547 act_name));
548
550 ds != DS_PEACE && ds != DS_TEAM);
551 pact_clauses++;
552 }
553
555 fc_snprintf(act_name, sizeof(act_name), "alliance%s", act_plr_part);
558 g_signal_connect(act, "activate",
560
561 fc_snprintf(act_name, sizeof(act_name), "win.alliance%s", act_plr_part);
563 g_menu_item_new(Q_("?diplomatic_state:Alliance"),
564 act_name));
565
567 ds != DS_ALLIANCE && ds != DS_TEAM);
568 pact_clauses++;
569 }
570
571 if (pact_clauses > 0) {
573 } else {
575 }
576 }
577
578 return topmenu;
579}
580
581/************************************************************************/
586{
587 struct Diplomacy_dialog *pdialog = (struct Diplomacy_dialog *)data;
588 gint i;
589 gint *index;
590
591 index = gtk_tree_path_get_indices(path);
592
593 i = 0;
595 if (i == index[0]) {
597 player_number(pdialog->treaty->plr1),
598 player_number(pclause->from),
599 pclause->type,
600 pclause->value);
601 return;
602 }
603 i++;
605}
606
607/************************************************************************/
652
653/************************************************************************/
656static void diplomacy_main_destroy(void)
657{
658 if (dipl_main->dialog) {
660 }
662 dipl_main = NULL;
663}
664
665/************************************************************************/
668static void diplomacy_main_response(struct gui_dialog *dlg, int response,
669 gpointer data)
670{
671 if (!dipl_main) {
672 return;
673 }
674
675 switch (response) {
676 default:
677 log_error("unhandled response in %s: %d", __FUNCTION__, response);
678 fc__fallthrough; /* No break. */
679 case GTK_RESPONSE_DELETE_EVENT: /* GTK: delete the widget. */
680 case RESPONSE_CANCEL_MEETING_ALL: /* Cancel all meetings. */
682 /* This will do a round trip to the server ans close the dialog in the
683 * client. Closing the last dialog will also close the main tab.*/
686 adialog->treaty->plr1));
688 break;
689 }
690}
691
692/************************************************************************/
695static void diplomacy_destroy(struct Diplomacy_dialog *pdialog)
696{
697 if (NULL != pdialog->dialog) {
698 /* pdialog->dialog may be NULL if the tab has been destroyed
699 * by an other way. */
700 gui_dialog_destroy(pdialog->dialog);
701 pdialog->dialog = NULL;
702 }
704
705 if (dialog_list) {
706 /* Diplomatic meetings in one main tab. */
707 if (dialog_list_size(dialog_list) > 0) {
708 if (dipl_main && dipl_main->dialog) {
709 gchar *buf;
710
711 buf = g_strdup_printf(_("Diplomacy [%d]"), dialog_list_size(dialog_list));
713 g_free(buf);
714 }
715 } else if (dipl_main) {
716 /* No meeting left - destroy main tab. */
718 }
719 }
720
721 /* Last sub-tab must not be freed before diplomacy_main_destroy() call. */
722 free(pdialog);
723}
724
725/************************************************************************/
728static void diplomacy_response(struct gui_dialog *dlg, int response,
729 gpointer data)
730{
731 struct Diplomacy_dialog *pdialog = NULL;
732
733 fc_assert_ret(data);
734 pdialog = (struct Diplomacy_dialog *)data;
735
736 switch (response) {
737 case GTK_RESPONSE_ACCEPT: /* Accept treaty. */
740 pdialog->treaty->plr1));
741 break;
742
743 default:
744 log_error("unhandled response in %s: %d", __FUNCTION__, response);
745 fc__fallthrough; /* No break. */
746 case GTK_RESPONSE_DELETE_EVENT: /* GTK: delete the widget. */
747 case GTK_RESPONSE_CANCEL: /* GTK: cancel button. */
748 case RESPONSE_CANCEL_MEETING: /* Cancel meetings. */
751 pdialog->treaty->plr1));
752 break;
753 }
754}
755
756/************************************************************************/
760 struct player *plr0,
761 struct player *plr1)
762{
764 GtkWidget *vbox, *hgrid, *table, *mainbox;
765 GtkWidget *label, *sw, *view, *pic, *spin;
767 struct sprite *flag_spr;
768 GtkListStore *store;
770 int i;
771 struct Diplomacy_dialog *pdialog;
772 char plr_buf[4 * MAX_LEN_NAME];
773 gchar *buf;
774 int grid_col = 0;
775 int main_row = 0;
776 GActionGroup *group;
777 GMenu *menu;
778
779 pdialog = fc_malloc(sizeof(*pdialog));
780
782 pdialog->treaty = ptreaty;
783
784 /* Get main diplomacy tab. */
786
787 buf = g_strdup_printf(_("Diplomacy [%d]"), dialog_list_size(dialog_list));
789 g_free(buf);
790
791 notebook = dipl_dialog->notebook;
792
793 gui_dialog_new(&(pdialog->dialog), GTK_NOTEBOOK(notebook), pdialog, FALSE);
794
795 /* Buttons */
797 _("Accept treaty"), GTK_RESPONSE_ACCEPT);
799 _("Cancel meeting"), RESPONSE_CANCEL_MEETING);
800
801 /* Responses for one meeting. */
803
804 /* Label for the new meeting. */
807
808 /* Sort meeting tabs alphabetically by the tab label. */
809 for (i = 0; i < gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook)); i++) {
812 struct gui_dialog *prev_dialog
813 = g_object_get_data(G_OBJECT(prev_page), "gui-dialog-data");
814 const char *prev_label
816
817 if (fc_strcasecmp(buf, prev_label) < 0) {
819 pdialog->dialog->grid, i);
820 break;
821 }
822 }
823 g_free(buf);
824
825 /* Us. */
832
833 /* Our nation. */
837 buf = g_strdup_printf("<span size=\"large\"><u>%s</u></span>",
840 g_free(buf);
842
846
847 /* Our flag */
849
853
854 /* Our name. */
859 buf = g_strdup_printf("<span size=\"large\" weight=\"bold\">%s</span>",
860 ruler_title_for_player(plr0, plr_buf, sizeof(plr_buf)));
862 g_free(buf);
864
865 pdialog->pic0 = gtk_picture_new();
866 gtk_grid_attach(GTK_GRID(hgrid), pdialog->pic0, grid_col++, 0, 1, 1);
867
868 /* Menu for clauses: we. */
871
872 menu = create_clause_menu(group, pdialog, plr1, FALSE);
874
875 /* Main table for clauses and (if activated) gold trading: we. */
881
884 1.0);
887 gtk_grid_attach(GTK_GRID(table), spin, 1, 0, 1, 1);
888 g_object_set_data(G_OBJECT(spin), "plr", plr0);
889 g_signal_connect_after(spin, "value-changed",
891
892 label = g_object_new(GTK_TYPE_LABEL, "use-underline", TRUE,
893 "mnemonic-widget", spin, "label", _("Gold:"),
894 "xalign", 0.0, "yalign", 0.5, NULL);
895 gtk_grid_attach(GTK_GRID(table), label, 0, 0, 1, 1);
896
897 gtk_grid_attach(GTK_GRID(table), aux_menu, 2, 0, 1, 1);
898 } else {
899 gtk_grid_attach(GTK_GRID(table), aux_menu, 0, 0, 1, 1);
900 }
902
903 /* Them. */
910
911 /* Their nation. */
915 buf = g_strdup_printf("<span size=\"large\"><u>%s</u></span>",
918 g_free(buf);
920
922 grid_col = 0;
925
926 /* Their flag */
928
932
933 /* Their name. */
938 buf = g_strdup_printf("<span size=\"large\" weight=\"bold\">%s</span>",
939 title_for_player(plr1, plr_buf, sizeof(plr_buf)));
941 g_free(buf);
943
944 pdialog->pic1 = gtk_picture_new();
945 gtk_grid_attach(GTK_GRID(hgrid), pdialog->pic1, grid_col++, 0, 1, 1);
946
947 /* Menu for clauses: they. */
950
951 menu = create_clause_menu(group, pdialog, plr1, TRUE);
953
954 /* Main table for clauses and (if activated) gold trading: they. */
960
963 1.0);
966 gtk_grid_attach(GTK_GRID(table), spin, 1, 0, 1, 1);
967 g_object_set_data(G_OBJECT(spin), "plr", plr1);
968 g_signal_connect_after(spin, "value-changed",
970
971 label = g_object_new(GTK_TYPE_LABEL, "use-underline", TRUE,
972 "mnemonic-widget", spin, "label", _("Gold:"),
973 "xalign", 0.0, "yalign", 0.5, NULL);
974 gtk_grid_attach(GTK_GRID(table), label, 0, 0, 1, 1);
975
976 gtk_grid_attach(GTK_GRID(table), aux_menu, 2, 0, 1, 1);
977 } else {
978 gtk_grid_attach(GTK_GRID(table), aux_menu, 0, 0, 1, 1);
979 }
981
982 /* Clauses. */
987
989 pdialog->store = store;
990
995 g_object_unref(store);
997
1000 rend, "text", 0, NULL);
1001
1011
1013 "use-underline", TRUE,
1014 "mnemonic-widget", view,
1015 "label", _("C_lauses:"),
1016 "xalign", 0.0,
1017 "yalign", 0.5,
1018 NULL);
1019
1021
1025
1027
1028 g_signal_connect(view, "row_activated", G_CALLBACK(row_callback), pdialog);
1029
1030 update_diplomacy_dialog(pdialog);
1031 gui_dialog_show_all(pdialog->dialog);
1032
1033 return pdialog;
1034}
1035
1036/************************************************************************/
1039static void update_diplomacy_dialog(struct Diplomacy_dialog *pdialog)
1040{
1041 GtkListStore *store;
1042 GtkTreeIter it;
1043 bool blank = TRUE;
1045
1046 store = pdialog->store;
1047
1048 gtk_list_store_clear(store);
1050 char buf[128];
1051
1053
1054 gtk_list_store_append(store, &it);
1055 gtk_list_store_set(store, &it, 0, buf, -1);
1056 blank = FALSE;
1058
1059 if (blank) {
1060 gtk_list_store_append(store, &it);
1061 gtk_list_store_set(store, &it, 0,
1062 _("--- This treaty is blank. "
1063 "Please add some clauses. ---"), -1);
1064 }
1065
1072}
1073
1074/************************************************************************/
1078 GVariant *parameter,
1079 gpointer data)
1080{
1081 int giver, dest, other, tech;
1082
1083 giver = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(action), "player_from"));
1084 dest = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(action), "player_to"));
1085 tech = GPOINTER_TO_INT(data);
1086 if (player_by_number(giver) == client_player()) {
1087 other = dest;
1088 } else {
1089 other = giver;
1090 }
1091
1092 if (A_LAST == tech) {
1093 /* All techs. */
1094 struct player *pgiver = player_by_number(giver);
1095 struct player *pdest = player_by_number(dest);
1096 const struct research *dresearch, *gresearch;
1097
1100
1105
1111 == TECH_PREREQS_KNOWN)) {
1113 CLAUSE_ADVANCE, i);
1114 }
1116 } else {
1117 /* Only one tech. */
1119 CLAUSE_ADVANCE, tech);
1120 }
1121}
1122
1123/************************************************************************/
1128 GVariant *parameter,
1129 gpointer data)
1130{
1131 struct city_deal *deal_data = (struct city_deal *)data;
1132 int other;
1133
1134 if (player_by_number(deal_data->giver) == client.conn.playing) {
1136 } else {
1137 other = deal_data->giver;
1138 }
1139
1142
1143 free(deal_data);
1144}
1145
1146/************************************************************************/
1150 gpointer data)
1151{
1152 struct Diplomacy_dialog *pdialog = (struct Diplomacy_dialog *)data;
1153 struct player *pgiver;
1154
1155 pgiver = (struct player *)g_object_get_data(G_OBJECT(action), "plr");
1156
1158 player_number(pdialog->treaty->plr1),
1160}
1161
1162/************************************************************************/
1166 gpointer data)
1167{
1168 struct Diplomacy_dialog *pdialog = (struct Diplomacy_dialog *)data;
1169 struct player *pgiver;
1170
1171 pgiver = (struct player *)g_object_get_data(G_OBJECT(action), "plr");
1172
1174 player_number(pdialog->treaty->plr1),
1176 0);
1177}
1178
1179/************************************************************************/
1183{
1184 struct Diplomacy_dialog *pdialog = (struct Diplomacy_dialog *)data;
1185
1187 player_number(pdialog->treaty->plr1),
1188 player_number(pdialog->treaty->plr0),
1189 type, 0);
1190}
1191
1192/************************************************************************/
1201
1202/************************************************************************/
1211
1212/************************************************************************/
1221
1222/************************************************************************/
1226 GVariant *parameter,
1227 gpointer data)
1228{
1229 struct Diplomacy_dialog *pdialog = (struct Diplomacy_dialog *) data;
1230 struct player *pgiver;
1231
1232 pgiver = (struct player *)g_object_get_data(G_OBJECT(action), "plr");
1233
1235 player_number(pdialog->treaty->plr1),
1237 0);
1238}
1239
1240/************************************************************************/
1244 GVariant *parameter,
1245 gpointer data)
1246{
1247 struct Diplomacy_dialog *pdialog = (struct Diplomacy_dialog *) data;
1248 struct player *pgiver;
1249
1250 pgiver = (struct player *)g_object_get_data(G_OBJECT(action), "plr");
1251
1253 player_number(pdialog->treaty->plr1),
1255 0);
1256}
1257
1258/************************************************************************/
1262 GVariant *parameter,
1263 gpointer data)
1264{
1265 struct Diplomacy_dialog *pdialog = (struct Diplomacy_dialog *) data;
1266 struct player *pgiver;
1267
1268 pgiver = (struct player *)g_object_get_data(G_OBJECT(action), "plr");
1269
1271 player_number(pdialog->treaty->plr1),
1274 0);
1275}
1276
1277/************************************************************************/
1281{
1282 diplomacy_destroy(pdialog);
1283}
1284
1285/************************************************************************/
1289{
1291 dipl_main = NULL;
1292}
1293
1294/************************************************************************/
1301
1302/************************************************************************/
1306{
1307 struct player *plr0 = client.conn.playing;
1308
1310 if ((pdialog->treaty->plr0 == plr0 && pdialog->treaty->plr1 == they)
1311 || (pdialog->treaty->plr0 == they && pdialog->treaty->plr1 == plr0)) {
1312 return pdialog;
1313 }
1315
1316 return NULL;
1317}
1318
1319/************************************************************************/
1323{
1324 struct Diplomacy_dialog *pdialog = (struct Diplomacy_dialog *) data;
1325 struct player *pgiver =
1326 (struct player *) g_object_get_data(G_OBJECT(w), "plr");
1328
1331 player_number(pdialog->treaty->plr1),
1334 } else {
1335 output_window_append(ftc_client, _("Invalid amount of gold specified."));
1336 }
1337}
1338
1339/************************************************************************/
#define n
Definition astring.c:77
void output_window_append(const struct ft_color color, const char *featured_text)
bool is_capital(const struct city *pcity)
Definition city.c:1579
const char * city_name_get(const struct city *pcity)
Definition city.c:1137
int city_name_compare(const void *p1, const void *p2)
Definition city.c:1711
#define city_list_iterate(citylist, pcity)
Definition city.h:508
#define city_list_iterate_end
Definition city.h:510
struct civclient client
const char * title_for_player(const struct player *pplayer, char *buf, size_t buf_len)
#define client_player()
void client_diplomacy_clause_string(char *buf, int bufsiz, struct Clause *pclause)
Definition climisc.c:241
char * incite_cost
Definition comments.c:75
struct Treaty struct player struct player *initiator gui_recv_create_clause
Definition diplodlg_g.h:32
struct Treaty * ptreaty
Definition diplodlg_g.h:28
struct Treaty struct player struct player *initiator struct Treaty struct player *they gui_recv_accept_treaty
Definition diplodlg_g.h:36
struct Treaty struct player * they
Definition diplodlg_g.h:28
gui_recv_cancel_meeting
Definition diplodlg_g.h:27
bool clause_enabled(enum clause_type type)
Definition diptreaty.c:289
#define clause_list_iterate_end
Definition diptreaty.h:70
#define clause_list_iterate(clauselist, pclause)
Definition diptreaty.h:68
int Tech_type_id
Definition fc_types.h:377
#define MAX_LEN_NAME
Definition fc_types.h:66
#define Q_(String)
Definition fcintl.h:70
#define _(String)
Definition fcintl.h:67
const struct ft_color ftc_client
struct civ_game game
Definition game.c:62
const char * ruler_title_for_player(const struct player *pplayer, char *buf, size_t buf_len)
Definition government.c:391
static void diplomacy_dialog_add_pact_clause(GtkWidget *w, gpointer data, int type)
Definition diplodlg.c:1113
#define RESPONSE_CANCEL_MEETING
Definition diplodlg.c:114
static gint sort_advance_names(gconstpointer a, gconstpointer b)
Definition diplodlg.c:236
static void close_diplomacy_dialog(struct Diplomacy_dialog *pdialog)
Definition diplodlg.c:1198
static void diplomacy_dialog_tech_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1014
static void row_callback(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data)
Definition diplodlg.c:515
static void diplomacy_dialog_ceasefire_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1127
static void update_diplomacy_dialog(struct Diplomacy_dialog *pdialog)
Definition diplodlg.c:976
static struct Diplomacy_dialog * create_diplomacy_dialog(struct Treaty *ptreaty, struct player *plr0, struct player *plr1)
Definition diplodlg.c:689
void gui_init_meeting(struct Treaty *ptreaty, struct player *they, struct player *initiator)
Definition diplodlg.c:137
static void diplomacy_dialog_seamap_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1097
static void diplomacy_dialog_city_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1062
static void diplomacy_dialog_map_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1082
void diplomacy_dialog_init(void)
Definition diplodlg.c:1206
static void diplomacy_destroy(struct Diplomacy_dialog *pdialog)
Definition diplodlg.c:625
#define dialog_list_iterate_end
Definition diplodlg.c:83
static struct Diplomacy_notebook * diplomacy_main_create(void)
Definition diplodlg.c:541
static struct Diplomacy_dialog * find_diplomacy_dialog(struct player *they)
Definition diplodlg.c:1223
static void diplomacy_dialog_vision_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1151
void close_all_diplomacy_dialogs(void)
Definition diplodlg.c:1260
#define RESPONSE_CANCEL_MEETING_ALL
Definition diplodlg.c:115
static void diplomacy_dialog_embassy_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1166
static void diplomacy_dialog_shared_tiles_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1181
static void diplomacy_response(struct gui_dialog *dlg, int response, gpointer data)
Definition diplodlg.c:658
void gui_recv_remove_clause(struct Treaty *ptreaty, struct player *they)
Definition diplodlg.c:188
#define dialog_list_iterate(dialoglist, pdialog)
Definition diplodlg.c:81
static struct dialog_list * dialog_list
Definition diplodlg.c:85
static void diplomacy_main_response(struct gui_dialog *dlg, int response, gpointer data)
Definition diplodlg.c:598
static void diplomacy_dialog_peace_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1135
void diplomacy_dialog_done(void)
Definition diplodlg.c:1215
static void diplo_dialog_returnkey(GtkWidget *w, gpointer data)
Definition diplodlg.c:1240
static void popup_diplomacy_dialog(struct Treaty *ptreaty, struct player *they, struct player *initiator)
Definition diplodlg.c:205
static void diplomacy_main_destroy(void)
Definition diplodlg.c:586
void gui_prepare_clause_updt(struct Treaty *ptreaty, struct player *they)
Definition diplodlg.c:163
static void diplomacy_dialog_alliance_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1143
static struct Diplomacy_notebook * dipl_main
Definition diplodlg.c:86
GtkWidget * top_notebook
Definition gui_main.c:129
void gui_dialog_destroy(struct gui_dialog *dlg)
Definition gui_stuff.c:954
void gui_dialog_present(struct gui_dialog *dlg)
Definition gui_stuff.c:835
void gui_dialog_raise(struct gui_dialog *dlg)
Definition gui_stuff.c:865
void gui_dialog_new(struct gui_dialog **pdlg, GtkNotebook *notebook, gpointer user_data, bool check_top)
Definition gui_stuff.c:517
void gui_dialog_set_return_dialog(struct gui_dialog *dlg, struct gui_dialog *return_dialog)
Definition gui_stuff.c:997
void gui_dialog_response_set_callback(struct gui_dialog *dlg, GUI_DIALOG_RESPONSE_FUN fun)
Definition gui_stuff.c:988
void gui_dialog_show_all(struct gui_dialog *dlg)
Definition gui_stuff.c:795
void gui_dialog_set_title(struct gui_dialog *dlg, const char *title)
Definition gui_stuff.c:935
void gui_dialog_alert(struct gui_dialog *dlg)
Definition gui_stuff.c:888
GtkWidget * gui_dialog_add_button(struct gui_dialog *dlg, const char *icon_name, const char *text, int response)
Definition gui_stuff.c:706
GdkPixbuf * get_thumb_pixbuf(int onoff)
Definition mapview.c:292
struct gui_dialog * players_dialog_shell
Definition plrdlg.c:58
GType type
Definition repodlgs.c:1313
static GMenu * create_clause_menu(GActionGroup *group, struct Diplomacy_dialog *pdialog, struct player *partner, bool them)
Definition diplodlg.c:267
GtkWidget * aux_menu_new(void)
Definition gui_stuff.c:243
void gui_dialog_add_content_widget(struct gui_dialog *dlg, GtkWidget *wdg)
Definition gui_stuff.c:1104
#define submenu_append_unref(menu, name, submenu)
Definition gui_stuff.h:165
#define menu_item_append_unref(menu, item)
Definition gui_stuff.h:149
void picture_set_from_surface(GtkPicture *pic, cairo_surface_t *surf)
Definition sprite.c:544
#define fc_assert_ret(condition)
Definition log.h:191
#define fc_assert(condition)
Definition log.h:176
#define log_error(message,...)
Definition log.h:103
#define fc_malloc(sz)
Definition mem.h:34
struct nation_type * nation_of_player(const struct player *pplayer)
Definition nation.c:444
const char * nation_plural_for_player(const struct player *pplayer)
Definition nation.c:178
int dsend_packet_diplomacy_create_clause_req(struct connection *pc, int counterpart, int giver, enum clause_type type, int value)
int dsend_packet_diplomacy_cancel_meeting_req(struct connection *pc, int counterpart)
int dsend_packet_diplomacy_remove_clause_req(struct connection *pc, int counterpart, int giver, enum clause_type type, int value)
int dsend_packet_diplomacy_accept_treaty_req(struct connection *pc, int counterpart)
struct player * player_by_number(const int player_id)
Definition player.c:849
int player_number(const struct player *pplayer)
Definition player.c:837
bool player_has_real_embassy(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:240
bool team_has_embassy(const struct team *pteam, const struct player *tgt_player)
Definition player.c:220
struct player_diplstate * player_diplstate_get(const struct player *plr1, const struct player *plr2)
Definition player.c:324
bool gives_shared_vision(const struct player *me, const struct player *them)
Definition player.c:1485
#define is_human(plr)
Definition player.h:229
struct research * research_get(const struct player *pplayer)
Definition research.c:128
enum tech_state research_invention_state(const struct research *presearch, Tech_type_id tech)
Definition research.c:619
bool research_invention_gettable(const struct research *presearch, const Tech_type_id tech, bool allow_holes)
Definition research.c:693
GtkWidget * pic0
Definition diplodlg.c:57
GtkWidget * pic1
Definition diplodlg.c:58
struct Treaty * treaty
Definition diplodlg.c:54
struct gui_dialog * dialog
Definition diplodlg.c:55
GtkListStore * store
Definition diplodlg.c:63
struct gui_dialog * dialog
Definition diplodlg.c:67
GtkWidget * notebook
Definition diplodlg.c:68
struct player * plr0
Definition diptreaty.h:79
bool accept0
Definition diptreaty.h:80
bool accept1
Definition diptreaty.h:80
struct clause_list * clauses
Definition diptreaty.h:81
struct player * plr1
Definition diptreaty.h:79
int giver
Definition diplodlg.c:72
int receiver
Definition diplodlg.c:73
Definition city.h:320
struct packet_game_info info
Definition game.h:89
struct connection conn
Definition client_main.h:96
struct player * playing
Definition connection.h:151
GtkWidget * vbox
Definition gui_stuff.h:72
GtkWidget * grid
Definition gui_stuff.h:71
GtkWidget * label
Definition gui_stuff.h:87
GtkWidget * notebook
Definition gui_stuff.h:88
bool tech_trade_allow_holes
enum diplstate_type type
Definition player.h:197
struct player_economic economic
Definition player.h:282
int fc_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:974
size_t fc_strlcpy(char *dest, const char *src, size_t n)
Definition support.c:791
int fc_strcasecmp(const char *str0, const char *str1)
Definition support.c:189
int fc_strcoll(const char *str0, const char *str1)
Definition support.c:473
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
#define fc__fallthrough
Definition support.h:119
const char * advance_name_translation(const struct advance *padvance)
Definition tech.c:290
Tech_type_id advance_number(const struct advance *padvance)
Definition tech.c:98
#define advance_iterate(_p)
Definition tech.h:275
#define advance_iterate_end
Definition tech.h:276
#define A_LAST
Definition tech.h:45
struct sprite * get_nation_flag_sprite(const struct tileset *t, const struct nation_type *pnation)
Definition tilespec.c:6756