Freeciv-3.2
Loading...
Searching...
No Matches
dialogs.cpp
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// Qt
19#include <QApplication>
20#include <QButtonGroup>
21#include <QComboBox>
22#include <QGroupBox>
23#include <QHeaderView>
24#include <QImage>
25#include <QMessageBox>
26#include <QMouseEvent>
27#include <QPainter>
28#include <QPainterPath>
29#include <QRadioButton>
30#include <QRect>
31#include <QTableWidgetItem>
32#include <QTextEdit>
33#include <QVBoxLayout>
34#include <QWindow>
35#include <QtMath>
36
37// utility
38#include "astring.h"
39
40// common
41#include "actions.h"
42#include "city.h"
43#include "game.h"
44#include "government.h"
45#include "improvement.h"
46#include "movement.h"
47#include "nation.h"
48#include "research.h"
49#include "sex.h"
50
51// client
52#include "audio.h"
53#include "chatline_common.h"
54#include "client_main.h"
55#include "control.h"
56#include "helpdata.h"
57#include "packhand.h"
58#include "svgflag.h"
59#include "text.h"
60#include "tilespec.h"
61
62// gui-qt
63#include "dialogs.h"
64#include "fc_client.h"
65#include "gui_main.h"
66#include "hudwidget.h"
67#include "qtg_cxxside.h"
68#include "sprite.h"
69
70// Locations for non action enabler controlled buttons.
71#define BUTTON_WAIT (ACTION_COUNT + 1)
72#define BUTTON_CANCEL (BUTTON_WAIT + 1)
73#define BUTTON_COUNT (BUTTON_CANCEL + 1)
74
76extern void popdown_players_report();
77extern void popdown_economy_report();
78extern void popdown_units_report();
79extern void popdown_science_report();
80extern void popdown_city_report();
81extern void popdown_endgame_report();
82
83static void spy_request_strike_bld_list(QVariant data1, QVariant data2);
84static void diplomat_incite(QVariant data1, QVariant data2);
85static void diplomat_incite_escape(QVariant data1, QVariant data2);
86static void spy_request_sabotage_list(QVariant data1, QVariant data2);
87static void spy_request_sabotage_esc_list(QVariant data1, QVariant data2);
88static void spy_sabotage(QVariant data1, QVariant data2);
89static void spy_steal(QVariant data1, QVariant data2);
90static void spy_steal_esc(QVariant data1, QVariant data2);
91static void spy_steal_something(QVariant data1, QVariant data2);
92static void diplomat_steal(QVariant data1, QVariant data2);
93static void diplomat_steal_esc(QVariant data1, QVariant data2);
94static void spy_poison(QVariant data1, QVariant data2);
95static void spy_poison_esc(QVariant data1, QVariant data2);
96static void spy_spread_plague(QVariant data1, QVariant data2);
97static void spy_steal_gold(QVariant data1, QVariant data2);
98static void spy_steal_gold_esc(QVariant data1, QVariant data2);
99static void spy_steal_maps(QVariant data1, QVariant data2);
100static void spy_steal_maps_esc(QVariant data1, QVariant data2);
101static void spy_escape(QVariant data1, QVariant data2);
102static void spy_nuke_city(QVariant data1, QVariant data2);
103static void spy_nuke_city_esc(QVariant data1, QVariant data2);
104static void nuke_city(QVariant data1, QVariant data2);
105static void destroy_city(QVariant data1, QVariant data2);
106static void diplomat_embassy(QVariant data1, QVariant data2);
107static void spy_embassy(QVariant data1, QVariant data2);
108static void spy_sabotage_unit(QVariant data1, QVariant data2);
109static void spy_sabotage_unit_esc(QVariant data1, QVariant data2);
110static void spy_investigate(QVariant data1, QVariant data2);
111static void diplomat_investigate(QVariant data1, QVariant data2);
112static void diplomat_sabotage(QVariant data1, QVariant data2);
113static void diplomat_sabotage_esc(QVariant data1, QVariant data2);
114static void diplomat_bribe(QVariant data1, QVariant data2);
115static void spy_attack(QVariant data1, QVariant data2);
116static void caravan_marketplace(QVariant data1, QVariant data2);
117static void caravan_establish_trade(QVariant data1, QVariant data2);
118static void caravan_help_build(QVariant data1, QVariant data2);
119static void unit_disband_recover(QVariant data1, QVariant data2);
120static void capture_units(QVariant data1, QVariant data2);
121static void nuke_units(QVariant data1, QVariant data2);
122static void collect_ransom(QVariant data1, QVariant data2);
123static void wipe_units(QVariant data1, QVariant data2);
124static void expel_unit(QVariant data1, QVariant data2);
125static void bombard(QVariant data1, QVariant data2);
126static void bombard2(QVariant data1, QVariant data2);
127static void bombard3(QVariant data1, QVariant data2);
128static void bombard4(QVariant data1, QVariant data2);
129static void bombard_lethal(QVariant data1, QVariant data2);
130static void bombard_lethal2(QVariant data1, QVariant data2);
131static void found_city(QVariant data1, QVariant data2);
132static void transform_terrain(QVariant data1, QVariant data2);
133static void cultivate(QVariant data1, QVariant data2);
134static void plant(QVariant data1, QVariant data2);
135static void pillage(QVariant data1, QVariant data2);
136static void clean(QVariant data1, QVariant data2);
137static void road(QVariant data1, QVariant data2);
138static void base(QVariant data1, QVariant data2);
139static void mine(QVariant data1, QVariant data2);
140static void irrigate(QVariant data1, QVariant data2);
141static void nuke(QVariant data1, QVariant data2);
142static void attack(QVariant data1, QVariant data2);
143static void attack2(QVariant data1, QVariant data2);
144static void suicide_attack(QVariant data1, QVariant data2);
145static void suicide_attack2(QVariant data1, QVariant data2);
146static void paradrop(QVariant data1, QVariant data2);
147static void paradrop_conquer(QVariant data1, QVariant data2);
148static void paradrop_frighten(QVariant data1, QVariant data2);
149static void paradrop_frighten_conquer(QVariant data1, QVariant data2);
150static void paradrop_enter(QVariant data1, QVariant data2);
151static void paradrop_enter_conquer(QVariant data1, QVariant data2);
152static void teleport(QVariant data1, QVariant data2);
153static void teleport_conquer(QVariant data1, QVariant data2);
154static void teleport_frighten(QVariant data1, QVariant data2);
155static void teleport_frighten_conquer(QVariant data1, QVariant data2);
156static void teleport_enter(QVariant data1, QVariant data2);
157static void teleport_enter_conquer(QVariant data1, QVariant data2);
158static void disembark1(QVariant data1, QVariant data2);
159static void disembark2(QVariant data1, QVariant data2);
160static void disembark3(QVariant data1, QVariant data2);
161static void disembark4(QVariant data1, QVariant data2);
162static void enter_hut(QVariant data1, QVariant data2);
163static void enter_hut2(QVariant data1, QVariant data2);
164static void enter_hut3(QVariant data1, QVariant data2);
165static void enter_hut4(QVariant data1, QVariant data2);
166static void frighten_hut(QVariant data1, QVariant data2);
167static void frighten_hut2(QVariant data1, QVariant data2);
168static void frighten_hut3(QVariant data1, QVariant data2);
169static void frighten_hut4(QVariant data1, QVariant data2);
170static void regular_move(QVariant data1, QVariant data2);
171static void regular_move2(QVariant data1, QVariant data2);
172static void regular_move3(QVariant data1, QVariant data2);
173static void convert_unit(QVariant data1, QVariant data2);
174static void fortify(QVariant data1, QVariant data2);
175static void disband_unit(QVariant data1, QVariant data2);
176static void homeless(QVariant data1, QVariant data2);
177static void join_city(QVariant data1, QVariant data2);
178static void unit_home_city(QVariant data1, QVariant data2);
179static void unit_upgrade(QVariant data1, QVariant data2);
180static void airlift(QVariant data1, QVariant data2);
181static void conquer_city(QVariant data1, QVariant data2);
182static void conquer_city2(QVariant data1, QVariant data2);
183static void conquer_city3(QVariant data1, QVariant data2);
184static void conquer_city4(QVariant data1, QVariant data2);
185static void conquer_extras(QVariant data1, QVariant data2);
186static void conquer_extras2(QVariant data1, QVariant data2);
187static void conquer_extras3(QVariant data1, QVariant data2);
188static void conquer_extras4(QVariant data1, QVariant data2);
189static void heal_unit(QVariant data1, QVariant data2);
190static void heal_unit2(QVariant data1, QVariant data2);
191static void transport_board(QVariant data1, QVariant data2);
192static void transport_board2(QVariant data1, QVariant data2);
193static void transport_board3(QVariant data1, QVariant data2);
194static void transport_embark(QVariant data1, QVariant data2);
195static void transport_embark2(QVariant data1, QVariant data2);
196static void transport_embark3(QVariant data1, QVariant data2);
197static void transport_embark4(QVariant data1, QVariant data2);
198static void transport_deboard(QVariant data1, QVariant data2);
199static void transport_unload(QVariant data1, QVariant data2);
200static void transport_load(QVariant data1, QVariant data2);
201static void transport_load2(QVariant data1, QVariant data2);
202static void transport_load3(QVariant data1, QVariant data2);
203static void keep_moving(QVariant data1, QVariant data2);
204static void pillage_something(QVariant data1, QVariant data2);
205static void action_entry(choice_dialog *cd,
206 action_id act,
207 const struct act_prob *act_probs,
208 const char *custom,
209 QVariant data1, QVariant data2);
210
211
212static bool is_showing_pillage_dialog = false;
214static bool is_race_dialog_open = false;
215
216/* Information used in action selection follow up questions. Can't be
217 * stored in the action selection dialog since it is closed before the
218 * follow up question is asked. */
220
221/* Don't remove a unit's action decision want or move on to the next actor
222 unit that wants a decision in the current unit selection. */
223static bool did_not_decide = false;
224
225extern char forced_tileset_name[512];
227
228/***********************************************************************/
233{
235
236 // Unit acting against a city target.
278
279 // Unit acting against a unit target.
298
299 // Unit acting against all units at a tile.
310
311 // Unit acting against a tile.
357
358 // Unit acting against all tile extras.
363
364 // Unit acting with no target except itself.
369
370 return action_function;
371}
372
373/* Mapping from an action to the function to call when its button is
374 * pushed. */
376
377/***********************************************************************/
382{
383 titlebar_height = 0;
384 moving_now = false;
385 setSizeGripEnabled(true);
387}
388
389/***********************************************************************/
393{
394 raise();
395}
396
397/***********************************************************************/
401{
403
404 QPainter p(this);
407 QStyle *style = this->style();
408 QRect active_area = this->rect();
411
412 qpal.setColor(QPalette::Active, QPalette::ToolTipText, Qt::white);
413 tbar_opt.initFrom(this);
414 titlebar_height = style->pixelMetric(QStyle::PM_TitleBarHeight,
415 &tbar_opt, this) + 2;
416 close_pix = close_pix.scaledToHeight(titlebar_height);
417 tbar_opt.rect = QRect(0, 0, this->width(), titlebar_height);
418 text_rect = QRect(0, 0, this->width() - close_pix.width() , titlebar_height);
419 close_rect = QRect(this->width() - close_pix.width(), 0, this->width(),
421 tbar_opt.titleBarState = this->windowState();
422 tbar_opt.text = tbar_opt.fontMetrics.elidedText(this->windowTitle(),
423 Qt::ElideRight,
424 text_rect.width());
425 style->drawComplexControl(QStyle::CC_TitleBar, &tbar_opt, &p, this);
426 style->drawItemText(&p, text_rect, Qt::AlignCenter, qpal,
427 true, tbar_opt.text, QPalette::ToolTipText);
428 style->drawItemPixmap(&p, close_rect, Qt::AlignLeft,
429 close_pix.scaledToHeight(titlebar_height));
430
431 active_area.setTopLeft(QPoint(0, titlebar_height));
432 this->setContentsMargins(0, titlebar_height, 0, 0);
433 win_opt.initFrom(this);
434 win_opt.rect = active_area;
435 style->drawPrimitive(QStyle::PE_Widget, &win_opt, &p, this);
436}
437
438/***********************************************************************/
447
448/***********************************************************************/
452{
453 QPoint pos = event->pos();
454 int x = pos.x();
455 int y = pos.y();
456
457 if (y <= titlebar_height
458 && x <= width() - close_pix.width()) {
459 point = mevent_gpos(event) - geometry().topLeft();
460 moving_now = true;
461 setCursor(Qt::SizeAllCursor);
462 } else if (y <= titlebar_height
463 && x > width() - close_pix.width()) {
464 close();
465 }
466}
467
468/***********************************************************************/
472{
473 moving_now = false;
474 setCursor(Qt::ArrowCursor);
475}
476
477/***********************************************************************/
481 QWidget *parent) : qfc_dialog(parent)
482{
483 int i;
487 QPixmap *pix;
488 QHeaderView *header;
489 QSize size;
491 QLabel *ns_label;
492
493 setAttribute(Qt::WA_DeleteOnClose);
494 is_race_dialog_open = true;
496 selected_nation_tabs = new QTableWidget;
497 nation_tabs = new QTableWidget();
498 styles = new QTableWidget;
499 ok_button = new QPushButton;
501 ns_label = new QLabel;
502 tplayer = pplayer;
503
504 selected_nation = -1;
505 selected_style = -1;
506 setWindowTitle(_("Select Nation"));
507 selected_nation_tabs->setRowCount(0);
508 selected_nation_tabs->setColumnCount(1);
509 selected_nation_tabs->setSelectionMode(QAbstractItemView::SingleSelection);
510 selected_nation_tabs->verticalHeader()->setVisible(false);
511 selected_nation_tabs->horizontalHeader()->setVisible(false);
512 selected_nation_tabs->setProperty("showGrid", "true");
513 selected_nation_tabs->setEditTriggers(QAbstractItemView::NoEditTriggers);
514 selected_nation_tabs->setShowGrid(false);
515 selected_nation_tabs->setAlternatingRowColors(true);
516
517 nation_tabs->setRowCount(0);
518 nation_tabs->setColumnCount(1);
519 nation_tabs->setSelectionMode(QAbstractItemView::SingleSelection);
520 nation_tabs->verticalHeader()->setVisible(false);
521 nation_tabs->horizontalHeader()->setVisible(false);
522 nation_tabs->setProperty("showGrid", "true");
523 nation_tabs->setEditTriggers(QAbstractItemView::NoEditTriggers);
524 nation_tabs->setShowGrid(false);
525 ns_label->setText(_("Nation Set:"));
526 styles->setRowCount(0);
527 styles->setColumnCount(2);
528 styles->setSelectionMode(QAbstractItemView::SingleSelection);
529 styles->verticalHeader()->setVisible(false);
530 styles->horizontalHeader()->setVisible(false);
531 styles->setProperty("showGrid", "false");
532 styles->setProperty("selectionBehavior", "SelectRows");
533 styles->setEditTriggers(QAbstractItemView::NoEditTriggers);
534 styles->setShowGrid(false);
535
537 no_name = new QGroupBox(parent);
541 sex_buttons->addButton(is_male, SEX_MALE);
543 sex_buttons->addButton(is_female, SEX_FEMALE);
544
545 leader_name->setEditable(true);
546 qgroupbox_layout->addWidget(leader_name, 1, 0, 1, 2);
547 qgroupbox_layout->addWidget(is_male, 2, 1);
548 qgroupbox_layout->addWidget(is_female, 2, 0);
551 no_name->setLayout(qgroupbox_layout);
552
554 description->setReadOnly(true);
555 description->setPlainText(_("Choose nation"));
556 no_name->setTitle(_("Your leader name"));
557
558 // Fill styles, no need to update them later
559
562
563 if (i >= 0) {
565 styles->insertRow(i);
567 item->setData(Qt::DecorationRole, *pix);
568 item->setData(Qt::UserRole, style_number(pstyle));
569 size.setWidth(pix->width());
570 size.setHeight(pix->height());
571 item->setSizeHint(size);
572 styles->setItem(i, 0, item);
575 styles->setItem(i, 1, item);
576 }
578
579 header = styles->horizontalHeader();
580 header->setSectionResizeMode(QHeaderView::Stretch);
581 header->resizeSections(QHeaderView::ResizeToContents);
582 header = styles->verticalHeader();
583 header->resizeSections(QHeaderView::ResizeToContents);
588 // Create nation sets
589 refresh();
590
591 connect(styles->selectionModel(),
593 const QItemSelection &)),
595 connect(selected_nation_tabs->selectionModel(),
597 const QItemSelection &)),
600 SLOT(leader_selected(int)));
601 connect(leader_name->lineEdit(), &QLineEdit::returnPressed,
604 SLOT(nationset_changed(int)));
605 connect(nation_tabs->selectionModel(),
607 const QItemSelection &)),
609
610 ok_button = new QPushButton;
611 ok_button->setText(_("Cancel"));
612 connect(ok_button, &QAbstractButton::pressed, this, &races_dialog::cancel_pressed);
613 main_layout->addWidget(ok_button, 8, 2, 1, 1);
614 random_button = new QPushButton;
615 random_button->setText(_("Random"));
616 connect(random_button, &QAbstractButton::pressed, this, &races_dialog::random_pressed);
617 main_layout->addWidget(random_button, 8, 0, 1, 1);
618 ok_button = new QPushButton;
619 ok_button->setText(_("Ok"));
620 connect(ok_button, &QAbstractButton::pressed, this, &races_dialog::ok_pressed);
621 main_layout->addWidget(ok_button, 8, 3, 1, 1);
622 main_layout->addWidget(no_name, 0, 3, 2, 1);
623 if (nation_set_count() > 1) {
624 main_layout->addWidget(ns_label, 0, 0, 1, 1);
625 main_layout->addWidget(qnation_set, 0, 1, 1, 1);
626 main_layout->addWidget(nation_tabs, 1, 0, 5, 2);
627 } else {
628 main_layout->addWidget(nation_tabs, 0, 0, 6, 2);
629 }
630 main_layout->addWidget(styles, 2, 3, 4, 1);
631 main_layout->addWidget(description, 6, 0, 2, 4);
632 main_layout->addWidget(selected_nation_tabs, 0, 2, 6, 1);
633
635 set_index(-99);
636
637 if (C_S_RUNNING == client_state()) {
638 title = _("Edit Nation");
639 } else if (NULL != pplayer && pplayer == client.conn.playing) {
640 title = _("What Nation Will You Be?");
641 } else {
642 title = _("Pick Nation");
643 }
644
647}
648
649/***********************************************************************/
656
657/***********************************************************************/
661{
662 struct nation_group *group;
664 QHeaderView *header;
665 int i;
666 int count;
667
668 nation_tabs->clearContents();
669 nation_tabs->setRowCount(0);
670 nation_tabs->insertRow(0);
672 item->setText(_("All nations"));
673 item->setData(Qt::UserRole, -99);
674 nation_tabs->setItem(0, 0, item);
675
676 for (i = 1; i < nation_group_count() + 1; i++) {
677 group = nation_group_by_number(i - 1);
678 if (is_nation_group_hidden(group)) {
679 continue;
680 }
681 count = 0;
682 // Checking if group is empty
683 nations_iterate(pnation) {
684 if (!is_nation_playable(pnation)
685 || !is_nation_pickable(pnation)
686 || !nation_is_in_group(pnation, group)) {
687 continue;
688 }
689 count ++;
691 if (count == 0) {
692 continue;
693 }
694 nation_tabs->insertRow(i);
696 item->setData(Qt::UserRole, i - 1);
697 item->setText(nation_group_name_translation(group));
698 nation_tabs->setItem(i, 0, item);
699 }
700 header = nation_tabs->horizontalHeader();
701 header->resizeSections(QHeaderView::Stretch);
702 header = nation_tabs->verticalHeader();
703 header->resizeSections(QHeaderView::ResizeToContents);
704 set_index(-99);
705}
706
707/***********************************************************************/
711{
712 struct option *popt;
713 struct nation_set *s;
714
716 if (popt) {
718 qnation_set->setCurrentIndex(nation_set_index(s));
719 qnation_set->setToolTip(_(nation_set_description(s)));
720 }
721}
722
723/***********************************************************************/
727{
728 QModelIndexList indexes = selected.indexes();
729 QModelIndex index ;
730
731 if (indexes.isEmpty()) {
732 return;
733 }
734
735 index = indexes.at(0);
736 set_index(index.row());
737}
738
739/***********************************************************************/
744{
746 QPixmap *pix;
747 QFont f;
748 struct nation_group *group;
749 int i;
750 struct sprite *s;
751 QHeaderView *header;
752 bool svg = is_svg_flag_enabled();
753
754 selected_nation_tabs->clearContents();
755 selected_nation_tabs->setRowCount(0);
756
757 last_index = 0;
758 i = nation_tabs->currentRow();
759 if (i != -1) {
760 item = nation_tabs->item(i, 0);
761 index = item->data(Qt::UserRole).toInt();
762 }
763
764 group = nation_group_by_number(index);
765 i = 0;
766 nations_iterate(pnation) {
767 if (!is_nation_playable(pnation)
768 || !is_nation_pickable(pnation)) {
769 continue;
770 }
771 if (!nation_is_in_group(pnation, group) && index != -99) {
772 continue;
773 }
775 selected_nation_tabs->insertRow(i);
776 s = get_nation_flag_sprite(tileset, pnation);
777 if (pnation->player) {
778 f = item->font();
779 f.setStrikeOut(true);
780 item->setFont(f);
781 }
782 pix = s->pm;
783 if (svg) {
784 item->setData(Qt::DecorationRole, (*pix).scaledToHeight(50));
785 } else {
786 item->setData(Qt::DecorationRole, *pix);
787 }
788 item->setData(Qt::UserRole, nation_number(pnation));
789 item->setText(nation_adjective_translation(pnation));
790 selected_nation_tabs->setItem(i, 0, item);
792
793 selected_nation_tabs->sortByColumn(0, Qt::AscendingOrder);
794 header = selected_nation_tabs->horizontalHeader();
795 header->resizeSections(QHeaderView::Stretch);
796 header = selected_nation_tabs->verticalHeader();
797 header->resizeSections(QHeaderView::ResizeToContents);
798}
799
800/***********************************************************************/
804{
805 char buf[4096];
806 QModelIndex index ;
808 QModelIndexList indexes = selected.indexes();
809 QString str;
811 int style, ind;
812
813 if (indexes.isEmpty()) {
814 return;
815 }
816
817 index = indexes.at(0);
818 if (indexes.isEmpty()) {
819 return;
820 }
821 qvar = index.data(Qt::UserRole);
822 selected_nation = qvar.toInt();
823
825 description->setPlainText(buf);
826 leader_name->clear();
827 if (client.conn.playing == tplayer) {
828 leader_name->addItem(client.conn.playing->name, true);
829 }
832 str = QString::fromUtf8(nation_leader_name(pleader));
835
836 // Select style for nation
837
839 qvar = qvar.fromValue<int>(style);
840
841 for (ind = 0; ind < styles->rowCount(); ind++) {
842 item = styles->item(ind, 0);
843
844 if (item->data(Qt::UserRole) == qvar) {
845 styles->selectRow(ind);
846 }
847 }
848}
849
850/***********************************************************************/
854{
855 QModelIndex index ;
857 QModelIndexList indexes = selected.indexes();
858
859 if (indexes.isEmpty()) {
860 return;
861 }
862
863 index = indexes.at(0);
864 qvar = index.data(Qt::UserRole);
865 selected_style = qvar.toInt();
866}
867
868/***********************************************************************/
872{
873 if (leader_name->itemData(index).toBool()) {
874 is_male->setChecked(true);
875 is_female->setChecked(false);
876 } else {
877 is_male->setChecked(false);
878 is_female->setChecked(true);
879 }
880}
881
882/***********************************************************************/
887{
889 struct player *natplr;
890
891 if (selected_nation == -1) {
892 return;
893 }
894
895 if (selected_style == -1) {
896 output_window_append(ftc_client, _("You must select your style."));
897 return;
898 }
899
900 if (leader_name->currentText().length() == 0) {
901 output_window_append(ftc_client, _("You must type a legal name."));
902 return;
903 }
904
906 if (natplr != NULL && natplr != client_player()) {
908 _("Nation has been chosen by other player"));
909 return;
910 }
911
912 ln_bytes = leader_name->currentText().toUtf8();
914 selected_nation, sex_buttons->checkedId(),
915 ln_bytes.data(),
917 close();
918 deleteLater();
919}
920
921/***********************************************************************/
925 const char *lines, QWidget *parent)
926 : fcwidget()
927{
928 int x, y;
930
931 setAttribute(Qt::WA_DeleteOnClose);
932 setCursor(Qt::ArrowCursor);
934 setFrameStyle(QFrame::Box);
935 cw = new close_widget(this);
936 cw->put_to_corner();
937
941 qlist = qlines.split("\n");
942 small_font = *fc_font::instance()->get_font("gui_qt_font_notify_label");
943 x = 0;
944 y = 0;
945 calc_size(x, y);
946 resize(x, y);
947 gui()->mapview_wdg->find_place(gui()->mapview_wdg->width() - x - 4, 4,
948 x, y, x, y, 0);
949 move(x, y);
950 was_destroyed = false;
951
952}
953
954/***********************************************************************/
958{
959 QString s, q;
960 int i;
964
965 for (i = 0; i < qlist.size(); ++i) {
966 s = qlist.at(i);
967 q = q + s;
968 if (i < qlist.size() - 1) {
969 q = q + QChar('\n');
970 }
971 }
972 capt_bytes = qcaption.toUtf8();
973 hl_bytes = qheadline.toUtf8();
974 qb_bytes = q.toUtf8();
976 hl_bytes.data(),
977 qb_bytes.data());
978 close();
979 destroy();
980}
981
982/***********************************************************************/
986{
988 int i;
989 QStringList str_list;
990
991 str_list = qlist;
992 str_list << qcaption << qheadline;
993
994 for (i = 0; i < str_list.count(); i++) {
995 x = qMax(x, fm.horizontalAdvance(str_list.at(i)));
996 y = y + 3 + fm.height();
997 }
998 x = x + 15;
999}
1000
1001/***********************************************************************/
1005{
1006 QPainter painter(this);
1007 QPainterPath path;
1008 QPen pen;
1010 int i;
1011
1012 pen.setWidth(1);
1013 pen.setColor(palette().color(QPalette::Text));
1014 painter.setFont(small_font);
1015 painter.setPen(pen);
1016 painter.drawText(10, fm.height() + 3, qcaption);
1017 painter.drawText(10, 2 * fm.height() + 6, qheadline);
1018 for (i = 0; i < qlist.count(); i++) {
1019 painter.drawText(10, 3 + (fm.height() + 3) * (i + 3), qlist[i]);
1020 }
1021 cw->put_to_corner();
1022}
1023
1024/***********************************************************************/
1028{
1029 cursor = mevent_gpos(event) - geometry().topLeft();
1030
1031 if (event->button() == Qt::RightButton) {
1032 was_destroyed = true;
1033 close();
1034 }
1035}
1036
1037/***********************************************************************/
1041{
1043
1044 setCursor(Qt::SizeAllCursor);
1045}
1046
1047/***********************************************************************/
1051{
1052 setCursor(Qt::ArrowCursor);
1053}
1054
1055/***********************************************************************/
1059{
1060 was_destroyed = true;
1061 destroy();
1062}
1063
1064/***********************************************************************/
1070{
1071 was_destroyed = true;
1072 destroy();
1073}
1074
1075/***********************************************************************/
1079{
1080 vs_city = -1;
1081 vs_unit = -1;
1082}
1083
1084/***********************************************************************/
1088{
1089 if (!m_instance) {
1090 m_instance = new qdef_act;
1091 }
1092 return m_instance;
1093}
1094
1095/***********************************************************************/
1099{
1100 if (m_instance) {
1101 delete m_instance;
1102 m_instance = 0;
1103 }
1104}
1105
1106/***********************************************************************/
1110{
1111 vs_city = i;
1112}
1113
1114/***********************************************************************/
1118{
1119 vs_unit = i;
1120}
1121
1122/***********************************************************************/
1126{
1127 return vs_city;
1128}
1129
1130/***********************************************************************/
1134{
1135 return vs_unit;
1136}
1137
1138/***********************************************************************/
1142{
1143 delete this;
1144}
1145
1146/***********************************************************************/
1150{
1152 false, "", 0);
1153 delete this;
1154}
1155
1156/***********************************************************************/
1159notify_goto::notify_goto(const char *headline, const char *lines,
1160 const struct text_tag_list *tags, tile *ptile,
1161 QWidget *parent): QMessageBox(parent)
1162{
1164 setAttribute(Qt::WA_DeleteOnClose);
1165 goto_but = this->addButton(_("Goto Location"), QMessageBox::ActionRole);
1166 goto_but->setIcon(fc_icons::instance()->get_icon("go-up"));
1167 inspect_but = this->addButton(_("Inspect City"), QMessageBox::ActionRole);
1168 inspect_but->setIcon(fc_icons::instance()->get_icon("plus"));
1169
1170 close_but = this->addButton(QMessageBox::Close);
1171 gtile = ptile;
1172 if (!gtile) {
1173 goto_but->setVisible(false);
1174 inspect_but->setVisible(false);
1175 } else {
1176 struct city *pcity = tile_city(gtile);
1177 inspect_but->setVisible(NULL != pcity
1178 && city_owner(pcity) == client.conn.playing);
1179 }
1181 qlines = lines;
1182 qlines.replace("\n", " ");
1183 setText(qlines);
1184 connect(goto_but, &QAbstractButton::pressed, this, &notify_goto::goto_tile);
1185 connect(inspect_but, &QAbstractButton::pressed, this, &notify_goto::inspect_city);
1186 connect(close_but, &QAbstractButton::pressed, this, &QWidget::close);
1187 show();
1188}
1189
1190/***********************************************************************/
1194{
1196 close();
1197}
1198
1199/***********************************************************************/
1203{
1204 struct city *pcity = tile_city(gtile);
1205 if (pcity) {
1207 }
1208 close();
1209}
1210
1211/***********************************************************************/
1215{
1216 QString rule_name;
1218 const char *rn;
1219 struct option *poption = optset_option_by_name(server_optset, "nationset");
1220
1221 rule_name = qnation_set->currentData().toString();
1222 rn_bytes = rule_name.toUtf8(); /* Hold QByteArray in a variable to
1223 * extend its, and data() buffer's,
1224 * lifetime */
1225 rn = rn_bytes.data();
1229 }
1230}
1231
1232/***********************************************************************/
1237void popup_notify_goto_dialog(const char *headline, const char *lines,
1238 const struct text_tag_list *tags,
1239 struct tile *ptile)
1240{
1241 notify_goto *ask = new notify_goto(headline, lines, tags, ptile,
1242 gui()->central_wdg);
1243 ask->show();
1244}
1245
1246/***********************************************************************/
1249void popup_connect_msg(const char *headline, const char *message)
1250{
1251 QMessageBox *msg = new QMessageBox(gui()->central_wdg);
1252
1253 msg->setText(message);
1254 msg->setStandardButtons(QMessageBox::Ok);
1255 msg->setWindowTitle(headline);
1256 msg->setAttribute(Qt::WA_DeleteOnClose);
1257 msg->show();
1258}
1259
1260/***********************************************************************/
1263void popup_notify_dialog(const char *caption, const char *headline,
1264 const char *lines)
1265{
1267 gui()->mapview_wdg);
1268 nd->show();
1269}
1270
1271/***********************************************************************/
1274void popup_races_dialog(struct player *pplayer)
1275{
1276 if (!is_race_dialog_open) {
1277 race_dialog = new races_dialog(pplayer, gui()->central_wdg);
1278 is_race_dialog_open = true;
1279 race_dialog->show();
1280 }
1281 race_dialog->showNormal();
1282}
1283
1284/***********************************************************************/
1289{
1290 if (is_race_dialog_open) {
1291 race_dialog->close();
1292 is_race_dialog_open = false;
1293 }
1294}
1295
1296/***********************************************************************/
1300{
1301 if (ptile != NULL
1302 && (unit_list_size(ptile->units) > 1
1303 || (unit_list_size(ptile->units) == 1 && tile_city(ptile)))) {
1304 gui()->toggle_unit_sel_widget(ptile);
1305 }
1306}
1307
1308/***********************************************************************/
1312{
1313 gui()->update_unit_sel();
1314}
1315
1316/***********************************************************************/
1325
1326/***********************************************************************/
1329void races_update_pickable(bool nationset_change)
1330{
1331 if (is_race_dialog_open) {
1333 }
1334}
1335
1336/***********************************************************************/
1341{
1342 if (is_race_dialog_open) {
1344 }
1345}
1346
1347/***********************************************************************/
1351{
1354 = (gov != nullptr ? government_number(gov) : G_LAST);
1355
1357 ask = new hud_message_box(gui()->central_wdg);
1358 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
1359 ask->setDefaultButton(QMessageBox::Cancel);
1360 ask->set_text_title(_("You say you wanna revolution?"),
1361 _("Revolution!"));
1362 ask->setAttribute(Qt::WA_DeleteOnClose);
1363 QObject::connect(ask, &hud_message_box::accepted, [=]() {
1364 if (government_id == G_LAST) {
1365 revolution_response(nullptr);
1366 } else {
1368
1369 if (government) {
1371 }
1372 }
1373 });
1374 ask->show();
1375 } else {
1377 }
1378}
1379
1380/***********************************************************************/
1393
1394/***********************************************************************/
1401
1402/***********************************************************************/
1410
1411/***********************************************************************/
1419
1420/***********************************************************************/
1427
1428/***********************************************************************/
1435
1436/***********************************************************************/
1440 QWidget *parent,
1441 void (*run_on_close_in)(int)): QWidget(parent)
1442{
1443 QLabel *l = new QLabel(text);
1444
1445 setProperty("themed_choice", true);
1446 layout = new QVBoxLayout(this);
1448
1449 layout->addWidget(l);
1450 setWindowFlags(Qt::Dialog);
1452 setAttribute(Qt::WA_DeleteOnClose);
1453 gui()->set_diplo_dialog(this);
1454
1466
1467 targeted_unit = nullptr;
1468 // No buttons are added yet.
1469 for (int i = 0; i < BUTTON_COUNT; i++) {
1471 }
1472}
1473
1474/***********************************************************************/
1478{
1479 buttons_list.clear();
1480 action_button_map.clear();
1481 gui()->set_diplo_dialog(NULL);
1482
1483 if (run_on_close) {
1486 }
1487}
1488
1489/***********************************************************************/
1493{
1495
1498 struct canvas *pix;
1499 QPushButton *next, *prev;
1500 unit_skip = new QHBoxLayout;
1501 next = new QPushButton();
1502 next->setIcon(fc_icons::instance()->get_icon("city-right"));
1503 next->setIconSize(QSize(32, 32));
1504 next->setFixedSize(QSize(36, 36));
1505 prev = new QPushButton();
1506 prev->setIcon(fc_icons::instance()->get_icon("city-left"));
1507 prev->setIconSize(QSize(32, 32));
1508 prev->setFixedSize(QSize(36, 36));
1509 target_unit_button = new QPushButton;
1512 pix->map_pixmap.fill(Qt::transparent);
1513 put_unit(targeted_unit, pix, 1.0, 0, 0);
1514 target_unit_button->setIcon(QIcon(pix->map_pixmap));
1515 qtg_canvas_free(pix);
1516 target_unit_button->setIconSize(QSize(96, 96));
1517 target_unit_button->setFixedSize(QSize(100, 100));
1518 unit_skip->addStretch(100);
1519 unit_skip->addWidget(prev, Qt::AlignCenter);
1520 unit_skip->addWidget(target_unit_button, Qt::AlignCenter);
1521 unit_skip->addWidget(next, Qt::AlignCenter);
1522 layout->addLayout(unit_skip);
1523 unit_skip->addStretch(100);
1524 connect(prev, &QAbstractButton::clicked, this, &choice_dialog::prev_unit);
1525 connect(next, &QAbstractButton::clicked, this, &choice_dialog::next_unit);
1526 }
1527
1529}
1530
1531/***********************************************************************/
1535 QVariant data2, QString tool_tip = "",
1536 const int button_id = -1)
1537{
1539 data1, data2);
1540 int action = buttons_list.count();
1541
1542 QObject::connect(button, &QPushButton::clicked,
1545 });
1546
1547 buttons_list.append(button);
1548
1549 if (!tool_tip.isEmpty()) {
1550 button->setToolTip(tool_tip);
1551 }
1552
1553 if (0 <= button_id) {
1554 // The id is valid.
1555 action_button_map[button_id] = button;
1556 }
1557
1558 layout->addWidget(button);
1559}
1560
1561/***********************************************************************/
1565{
1566 QPoint p;
1567
1568 p = mapFromGlobal(QCursor::pos());
1569 p.setY(p.y()-this->height());
1570 p.setX(p.x()-this->width());
1571 move(p);
1572 show();
1573}
1574
1575/***********************************************************************/
1582
1583/***********************************************************************/
1587{
1588 if (id < 0) {
1589 fc_assert_msg(0 <= id, "Invalid button ID.");
1590 return NULL;
1591 }
1592
1593 return action_button_map[id];
1594}
1595
1596/***********************************************************************/
1600{
1603
1605 if (action == -1) {
1606 return false;
1607 }
1608 func = af_map[action];
1609
1610 func(q1, q2);
1611 return true;
1612}
1613
1614/***********************************************************************/
1618{
1621
1623 if (action == -1) {
1624 return false;
1625 }
1626 func = af_map[action];
1627 func(q1, q2);
1628 return true;
1629}
1630
1631/***********************************************************************/
1635{
1636 struct tile *ptile;
1637 struct unit *new_target = nullptr;
1638 bool break_next = false;
1639 bool first = true;
1640 struct canvas *pix;
1641
1642 if (targeted_unit == nullptr) {
1643 return;
1644 }
1645
1646 ptile = targeted_unit->tile;
1647
1648 unit_list_iterate(ptile->units, ptgt) {
1649 if (first) {
1650 new_target = ptgt;
1651 first = false;
1652 }
1653 if (break_next) {
1654 new_target = ptgt;
1655 break;
1656 }
1657 if (ptgt == targeted_unit) {
1658 break_next = true;
1659 }
1664 pix->map_pixmap.fill(Qt::transparent);
1665 put_unit(targeted_unit, pix, 1.0, 0, 0);
1666 target_unit_button->setIcon(QIcon(pix->map_pixmap));
1667 qtg_canvas_free(pix);
1668 switch_target();
1669}
1670
1671/***********************************************************************/
1675{
1676 struct tile *ptile;
1677 struct unit *new_target = nullptr;
1678 struct canvas *pix;
1679 if (targeted_unit == nullptr) {
1680 return;
1681 }
1682
1683 ptile = targeted_unit->tile;
1684 unit_list_iterate(ptile->units, ptgt) {
1685 if ((ptgt == targeted_unit) && new_target != nullptr) {
1686 break;
1687 }
1688 new_target = ptgt;
1693 pix->map_pixmap.fill(Qt::transparent);
1694 put_unit(targeted_unit, pix, 1.0, 0, 0);
1695 target_unit_button->setIcon(QIcon(pix->map_pixmap));
1696 qtg_canvas_free(pix);
1697 switch_target();
1698}
1699
1700/***********************************************************************/
1704{
1705 if (targeted_unit == nullptr) {
1706 return;
1707 }
1708 unit_skip->setParent(nullptr);
1713 : NULL),
1714 act_probs);
1715 layout->addLayout(unit_skip);
1716}
1717
1718/***********************************************************************/
1722{
1723 if (targeted_unit == nullptr) {
1724 return;
1725 }
1726
1727 unit_skip->setParent(nullptr);
1729 unit_id,
1734 layout->addLayout(unit_skip);
1735}
1736
1737/***********************************************************************/
1741{
1743 pfcn_void func = button->getFunc();
1744
1745 func(button->getData1(), button->getData2());
1746 close();
1747}
1748
1749/***********************************************************************/
1758{
1759 // Store the data in the stack.
1760 last_buttons_stack.append(button);
1761
1762 /* Temporary remove the button so it will end up below buttons added
1763 * before unstack_all_buttons() is called. */
1764 layout->removeWidget(button);
1765
1766 // Synchronize the list with the layout.
1767 buttons_list.removeAll(button);
1768}
1769
1770/***********************************************************************/
1775{
1776 while (!last_buttons_stack.isEmpty()) {
1777 Choice_dialog_button *button = last_buttons_stack.takeLast();
1778
1779 // Reinsert the button below the other buttons.
1780 buttons_list.append(button);
1781 layout->addWidget(button);
1782 }
1783}
1784
1785/***********************************************************************/
1788static void caravan_marketplace(QVariant data1, QVariant data2)
1789{
1790 int actor_unit_id = data1.toInt();
1791 int target_city_id = data2.toInt();
1792
1794 && NULL != game_city_by_number(target_city_id)) {
1796 target_city_id, 0, "");
1797 }
1798}
1799
1800/***********************************************************************/
1804{
1805 int actor_unit_id = data1.toInt();
1806 int target_city_id = data2.toInt();
1807
1809 && NULL != game_city_by_number(target_city_id)) {
1811 target_city_id, 0, "");
1812 }
1813}
1814
1815/***********************************************************************/
1818static void caravan_help_build(QVariant data1, QVariant data2)
1819{
1820 int caravan_id = data1.toInt();
1821 int caravan_target_id = data2.toInt();
1822
1827 }
1828}
1829
1830/***********************************************************************/
1833static void unit_disband_recover(QVariant data1, QVariant data2)
1834{
1835 int actor_id = data1.toInt();
1836 int tgt_city_id = data2.toInt();
1837
1838 if (NULL != game_unit_by_number(actor_id)
1841 actor_id, tgt_city_id, 0, "");
1842 }
1843}
1844
1845/***********************************************************************/
1848static void unit_home_city(QVariant data1, QVariant data2)
1849{
1850 int actor_id = data1.toInt();
1851 int tgt_city_id = data2.toInt();
1852
1853 if (NULL != game_unit_by_number(actor_id)
1856 actor_id, tgt_city_id, 0, "");
1857 }
1858}
1859
1860/***********************************************************************/
1863static void unit_upgrade(QVariant data1, QVariant data2)
1864{
1865 struct unit *punit;
1866
1867 int actor_id = data1.toInt();
1868 int tgt_city_id = data2.toInt();
1869
1870 if ((punit = game_unit_by_number(actor_id))
1872 struct unit_list *as_list;
1873
1878 }
1879}
1880
1881/***********************************************************************/
1884static void airlift(QVariant data1, QVariant data2)
1885{
1886 int actor_id = data1.toInt();
1887 int tgt_city_id = data2.toInt();
1888
1889 if (NULL != game_unit_by_number(actor_id)
1892 actor_id, tgt_city_id, 0, "");
1893 }
1894}
1895
1896/***********************************************************************/
1899static void conquer_city(QVariant data1, QVariant data2)
1900{
1901 int actor_id = data1.toInt();
1902 int tgt_city_id = data2.toInt();
1903
1904 if (NULL != game_unit_by_number(actor_id)
1907 actor_id, tgt_city_id, 0, "");
1908 }
1909}
1910
1911/***********************************************************************/
1914static void conquer_city2(QVariant data1, QVariant data2)
1915{
1916 int actor_id = data1.toInt();
1917 int tgt_city_id = data2.toInt();
1918
1919 if (NULL != game_unit_by_number(actor_id)
1922 actor_id, tgt_city_id, 0, "");
1923 }
1924}
1925
1926/***********************************************************************/
1929static void conquer_city3(QVariant data1, QVariant data2)
1930{
1931 int actor_id = data1.toInt();
1932 int tgt_city_id = data2.toInt();
1933
1934 if (game_unit_by_number(actor_id) != nullptr
1935 && game_city_by_number(tgt_city_id) != nullptr) {
1937 actor_id, tgt_city_id, 0, "");
1938 }
1939}
1940
1941/***********************************************************************/
1944static void conquer_city4(QVariant data1, QVariant data2)
1945{
1946 int actor_id = data1.toInt();
1947 int tgt_city_id = data2.toInt();
1948
1949 if (game_unit_by_number(actor_id) != nullptr
1950 && game_city_by_number(tgt_city_id) != nullptr) {
1952 actor_id, tgt_city_id, 0, "");
1953 }
1954}
1955
1956/***********************************************************************/
1959static void conquer_extras(QVariant data1, QVariant data2)
1960{
1961 int actor_id = data1.toInt();
1962 int target_id = data2.toInt();
1963
1964 if (NULL != game_unit_by_number(actor_id)) {
1966 actor_id, target_id, 0, "");
1967 }
1968}
1969
1970/***********************************************************************/
1973static void conquer_extras2(QVariant data1, QVariant data2)
1974{
1975 int actor_id = data1.toInt();
1976 int target_id = data2.toInt();
1977
1978 if (NULL != game_unit_by_number(actor_id)) {
1980 actor_id, target_id, 0, "");
1981 }
1982}
1983
1984/***********************************************************************/
1987static void conquer_extras3(QVariant data1, QVariant data2)
1988{
1989 int actor_id = data1.toInt();
1990 int target_id = data2.toInt();
1991
1992 if (game_unit_by_number(actor_id) != nullptr) {
1994 actor_id, target_id, 0, "");
1995 }
1996}
1997
1998/***********************************************************************/
2001static void conquer_extras4(QVariant data1, QVariant data2)
2002{
2003 int actor_id = data1.toInt();
2004 int target_id = data2.toInt();
2005
2006 if (game_unit_by_number(actor_id) != nullptr) {
2008 actor_id, target_id, 0, "");
2009 }
2010}
2011
2012/***********************************************************************/
2015static void act_sel_wait(QVariant data1, QVariant data2)
2016{
2017 key_unit_wait();
2018}
2019
2020/***********************************************************************/
2023static void keep_moving(QVariant data1, QVariant data2)
2024{
2025}
2026
2027/***********************************************************************/
2031{
2032 if (!gov) {
2034 } else {
2036 }
2037}
2038
2039/***********************************************************************/
2044{
2046 /* The client isn't waiting for information for any unanswered follow
2047 * up questions. */
2048
2049 struct unit *actor_unit;
2050
2052 /* The action selection dialog wasn't closed because the actor unit
2053 * was lost. */
2054
2055 // The probabilities didn't just disappear, right?
2058
2060 }
2061
2062 // The action selection process is over, at least for now.
2064
2065 if (did_not_decide) {
2066 /* The action selection dialog was closed but the player didn't
2067 * decide what the unit should do. */
2068
2069 // Reset so the next action selection dialog does the right thing.
2070 did_not_decide = false;
2071 } else {
2072 // An action, or no action at all, was selected.
2075 }
2076 }
2077}
2078
2079/***********************************************************************/
2083static void diplomat_queue_handle_secondary(int actor_id)
2084{
2085 // Stop waiting. Move on to the next queued unit.
2088}
2089
2090/**********************************************************************/
2097{
2098 // Stop assuming the answer to a follow up question will arrive.
2100}
2101
2102/***********************************************************************/
2107 struct city *target_city,
2108 struct unit *target_unit,
2109 struct tile *target_tile,
2110 struct extra_type *target_extra,
2111 const struct act_prob *act_probs)
2112{
2113 struct astring title = ASTRING_INIT, text = ASTRING_INIT;
2115 qtiles caras;
2116 QVariant qv1, qv2;
2118 struct city *actor_homecity;
2121
2124
2125 foreach (caras, gui()->trade_gen.lines) {
2126 if (caras.autocaravan == actor_unit) {
2127 int i;
2128 if (nullptr != game_unit_by_number(actor_unit->id)
2129 && nullptr != game_city_by_number(target_city->id)) {
2131 target_city->id, 0, "");
2134 i = gui()->trade_gen.lines.indexOf(caras);
2135 gui()->trade_gen.lines.takeAt(i);
2136 return;
2137 }
2138 }
2139 }
2140 if (target_city
2144 return;
2145 }
2146
2147 if (target_unit
2151 return;
2152 }
2153 /* Could be caused by the server failing to reply to a request for more
2154 * information or a bug in the client code. */
2156 "Diplomat queue problem. Is another diplomat window open?");
2157
2158 // No extra input is required as no action has been chosen yet.
2160
2162
2163 astr_set(&title,
2164 // TRANS: %s is a unit name, e.g., Spy
2165 _("Choose Your %s's Strategy"),
2167
2168 if (target_city && actor_homecity) {
2169 astr_set(&text,
2170 _("Your %s from %s reaches the city of %s.\nWhat now?"),
2174 } else if (target_city) {
2175 astr_set(&text,
2176 _("Your %s has arrived at %s.\nWhat is your command?"),
2179 } else if (target_unit) {
2180 astr_set(&text,
2181 // TRANS: Your Spy is ready to act against Roman Freight.
2182 _("Your %s is ready to act against %s %s."),
2186 } else {
2188 "No target specified.");
2189
2190 astr_set(&text,
2191 // TRANS: %s is a unit name, e.g., Diplomat, Spy
2192 _("Your %s is waiting for your command."),
2194 }
2195
2196 cd = gui()->get_diplo_dialog();
2197 if ((cd != nullptr) && cd->targeted_unit != nullptr) {
2198 cd->update_dialog(act_probs);
2199 return;
2200 }
2201 cd = new choice_dialog(astr_str(&title), astr_str(&text),
2202 gui()->game_tab_widget,
2204 qv1 = actor_unit->id;
2205
2206 cd->unit_id = actor_unit->id;
2207
2208 cd->target_id[ATK_SELF] = cd->unit_id;
2209
2210 if (target_city) {
2211 cd->target_id[ATK_CITY] = target_city->id;
2212 } else {
2213 cd->target_id[ATK_CITY] = IDENTITY_NUMBER_ZERO;
2214 }
2215
2216 if (target_unit) {
2217 cd->target_id[ATK_UNIT] = target_unit->id;
2218 } else {
2219 cd->target_id[ATK_UNIT] = IDENTITY_NUMBER_ZERO;
2220 }
2221
2222 if (target_tile) {
2223 cd->target_id[ATK_UNITS] = tile_index(target_tile);
2224 } else {
2225 cd->target_id[ATK_UNITS] = TILE_INDEX_NONE;
2226 }
2227
2228 if (target_tile) {
2229 cd->target_id[ATK_TILE] = tile_index(target_tile);
2230 } else {
2231 cd->target_id[ATK_TILE] = TILE_INDEX_NONE;
2232 }
2233
2234 if (target_tile) {
2235 cd->target_id[ATK_EXTRAS] = tile_index(target_tile);
2236 } else {
2237 cd->target_id[ATK_EXTRAS] = TILE_INDEX_NONE;
2238 }
2239
2240 // No target building or target tech supplied. (Feb 2020)
2241 cd->sub_target_id[ASTK_BUILDING] = B_LAST;
2242 cd->sub_target_id[ASTK_TECH] = A_UNSET;
2243
2244 if (target_extra) {
2245 cd->sub_target_id[ASTK_EXTRA] = extra_number(target_extra);
2247 } else {
2248 cd->sub_target_id[ASTK_EXTRA] = EXTRA_NONE;
2249 cd->sub_target_id[ASTK_EXTRA_NOT_THERE] = EXTRA_NONE;
2250 }
2251
2252 // Unit acting against a city
2253
2254 // Set the correct target for the following actions.
2255 qv2 = cd->target_id[ATK_CITY];
2256
2257 action_iterate(act) {
2262 act_probs[act],
2263 actor_unit,
2264 target_city),
2265 qv1, qv2);
2266 }
2268
2269 // Unit acting against another unit
2270
2271 // Set the correct target for the following actions.
2272 qv2 = cd->target_id[ATK_UNIT];
2273
2274 action_iterate(act) {
2279 act_probs[act],
2280 actor_unit,
2281 target_city),
2282 qv1, qv2);
2283 }
2285
2286 // Unit acting against all units at a tile
2287
2288 // Set the correct target for the following actions.
2289 qv2 = cd->target_id[ATK_UNITS];
2290
2291 action_iterate(act) {
2296 act_probs[act],
2297 actor_unit,
2298 target_city),
2299 qv1, qv2);
2300 }
2302
2303 // Unit acting against a tile.
2304
2305 // Set the correct target for the following actions.
2306 qv2 = cd->target_id[ATK_TILE];
2307
2308 action_iterate(act) {
2313 act_probs[act],
2314 actor_unit,
2315 target_city),
2316 qv1, qv2);
2317 }
2319
2320 // Unit acting against a tile's extras.
2321
2322 // Set the correct target for the following actions.
2323 qv2 = cd->target_id[ATK_EXTRAS];
2324
2325 action_iterate(act) {
2330 act_probs[act],
2331 actor_unit,
2332 target_city),
2333 qv1, qv2);
2334 }
2336
2337 // Unit acting against itself
2338
2339 // Set the correct target for the following actions.
2340 qv2 = cd->target_id[ATK_SELF];
2341
2342 action_iterate(act) {
2347 act_probs[act],
2348 actor_unit,
2349 target_city),
2350 qv1, qv2);
2351 }
2353
2355 cd->add_item(QString(_("&Wait")), func, qv1, qv2,
2356 "", BUTTON_WAIT);
2357
2358 func = keep_moving;
2359 cd->add_item(QString(_("Do nothing")), func, qv1, qv2,
2360 "", BUTTON_CANCEL);
2361
2362 cd->set_layout();
2363 cd->show_me();
2364
2365 // Give follow up questions access to action probabilities.
2367 action_iterate(act) {
2370
2371 astr_free(&title);
2372 astr_free(&text);
2373}
2374
2375/***********************************************************************/
2380{
2381 /* Don't add an action mapping here unless the non targeted version is
2382 * selectable in the targeted version's target selection dialog. */
2383 switch ((enum gen_action)tgt_action_id) {
2389 return ACTION_SPY_STEAL_TECH;
2392 default:
2393 // No non targeted version found.
2394 return ACTION_NONE;
2395 }
2396}
2397
2398/**********************************************************************/
2403{
2404 /* Don't add an action mapping here unless the non targeted version is
2405 * selectable in the targeted version's target selection dialog. */
2406 switch ((enum gen_action)tgt_action_id) {
2413 default:
2414 // No non targeted version found.
2415 return ACTION_NONE;
2416 }
2417}
2418
2419/***********************************************************************/
2423 action_id act,
2424 const struct act_prob *act_probs,
2425 const char *custom,
2426 QVariant data1, QVariant data2)
2427{
2428 QString title;
2430
2431 if (!af_map.contains(act)) {
2432 /* The Qt client doesn't support ordering this action from the
2433 * action selection dialog. */
2434 return;
2435 }
2436
2437 // Don't show disabled actions.
2438 if (!action_prob_possible(act_probs[act])) {
2439 return;
2440 }
2441
2443 act_probs[act],
2444 custom));
2445
2447 act_probs[act]));
2448
2449 cd->add_item(title, af_map[act], data1, data2, tool_tip, act);
2450}
2451
2452/***********************************************************************/
2456 action_id act,
2457 const struct act_prob *act_probs,
2458 const char *custom,
2459 QVariant data1, QVariant data2)
2460{
2461 QString title;
2463
2464 /* An action that just became impossible has its button disabled.
2465 * An action that became possible again must be re-enabled. */
2466 button->setEnabled(action_prob_possible(act_probs[act]));
2467 button->setData1(data1);
2468 button->setData2(data2);
2469 // The probability may have changed.
2471 act_probs[act],
2472 custom));
2473
2475 act_probs[act]));
2476
2477 button->setText(title);
2478 button->setToolTip(tool_tip);
2479}
2480
2481/***********************************************************************/
2484static void disband_unit(QVariant data1, QVariant data2)
2485{
2486 int actor_id = data1.toInt();
2487 int target_id = data2.toInt();
2488
2490 target_id, 0, "");
2491}
2492
2493/***********************************************************************/
2496static void fortify(QVariant data1, QVariant data2)
2497{
2498 int actor_id = data1.toInt();
2499 int target_id = data2.toInt();
2500
2501 if (NULL != game_unit_by_number(actor_id)) {
2503 target_id, 0, "");
2504 }
2505}
2506
2507/***********************************************************************/
2510static void convert_unit(QVariant data1, QVariant data2)
2511{
2512 int actor_id = data1.toInt();
2513 int target_id = data2.toInt();
2514
2516 target_id, 0, "");
2517}
2518
2519/***********************************************************************/
2522static void homeless(QVariant data1, QVariant data2)
2523{
2524 int actor_id = data1.toInt();
2525 int target_id = data2.toInt();
2526
2527 if (NULL != game_unit_by_number(actor_id)) {
2529 target_id, 0, "");
2530 }
2531}
2532
2533/***********************************************************************/
2536static void diplomat_bribe(QVariant data1, QVariant data2)
2537{
2538 int diplomat_id = data1.toInt();
2539 int diplomat_target_id = data2.toInt();
2540
2543 // Wait for the server's reply before moving on to the next queued diplomat.
2545
2548 }
2549}
2550
2551/***********************************************************************/
2554static void spy_sabotage_unit(QVariant data1, QVariant data2)
2555{
2556 int diplomat_id = data1.toInt();
2557 int diplomat_target_id = data2.toInt();
2558
2560 diplomat_target_id, 0, "");
2561}
2562
2563/***********************************************************************/
2566static void spy_sabotage_unit_esc(QVariant data1, QVariant data2)
2567{
2568 int diplomat_id = data1.toInt();
2569 int diplomat_target_id = data2.toInt();
2570
2572 diplomat_target_id, 0, "");
2573}
2574
2575/***********************************************************************/
2578static void heal_unit(QVariant data1, QVariant data2)
2579{
2580 int actor_id = data1.toInt();
2581 int target_id = data2.toInt();
2582
2583 request_do_action(ACTION_HEAL_UNIT, actor_id, target_id, 0, "");
2584}
2585
2586/***********************************************************************/
2589static void heal_unit2(QVariant data1, QVariant data2)
2590{
2591 int actor_id = data1.toInt();
2592 int target_id = data2.toInt();
2593
2594 request_do_action(ACTION_HEAL_UNIT2, actor_id, target_id, 0, "");
2595}
2596
2597/***********************************************************************/
2600static void transport_board(QVariant data1, QVariant data2)
2601{
2602 int actor_id = data1.toInt();
2603 int target_id = data2.toInt();
2604
2605 request_do_action(ACTION_TRANSPORT_BOARD, actor_id, target_id, 0, "");
2606}
2607
2608/***********************************************************************/
2611static void transport_board2(QVariant data1, QVariant data2)
2612{
2613 int actor_id = data1.toInt();
2614 int target_id = data2.toInt();
2615
2616 request_do_action(ACTION_TRANSPORT_BOARD2, actor_id, target_id, 0, "");
2617}
2618
2619/***********************************************************************/
2622static void transport_board3(QVariant data1, QVariant data2)
2623{
2624 int actor_id = data1.toInt();
2625 int target_id = data2.toInt();
2626
2627 request_do_action(ACTION_TRANSPORT_BOARD3, actor_id, target_id, 0, "");
2628}
2629
2630/***********************************************************************/
2633static void transport_embark(QVariant data1, QVariant data2)
2634{
2635 int actor_id = data1.toInt();
2636 int target_id = data2.toInt();
2637
2638 request_do_action(ACTION_TRANSPORT_EMBARK, actor_id, target_id, 0, "");
2639}
2640
2641/***********************************************************************/
2644static void transport_embark2(QVariant data1, QVariant data2)
2645{
2646 int actor_id = data1.toInt();
2647 int target_id = data2.toInt();
2648
2649 request_do_action(ACTION_TRANSPORT_EMBARK2, actor_id, target_id, 0, "");
2650}
2651
2652/***********************************************************************/
2655static void transport_embark3(QVariant data1, QVariant data2)
2656{
2657 int actor_id = data1.toInt();
2658 int target_id = data2.toInt();
2659
2660 request_do_action(ACTION_TRANSPORT_EMBARK3, actor_id, target_id, 0, "");
2661}
2662
2663/***********************************************************************/
2666static void transport_embark4(QVariant data1, QVariant data2)
2667{
2668 int actor_id = data1.toInt();
2669 int target_id = data2.toInt();
2670
2671 request_do_action(ACTION_TRANSPORT_EMBARK4, actor_id, target_id, 0, "");
2672}
2673
2674/***********************************************************************/
2677static void transport_unload(QVariant data1, QVariant data2)
2678{
2679 int actor_id = data1.toInt();
2680 int target_id = data2.toInt();
2681
2682 request_do_action(ACTION_TRANSPORT_UNLOAD, actor_id, target_id, 0, "");
2683}
2684
2685/***********************************************************************/
2688static void transport_load(QVariant data1, QVariant data2)
2689{
2690 int actor_id = data1.toInt();
2691 int target_id = data2.toInt();
2692
2693 request_do_action(ACTION_TRANSPORT_LOAD, actor_id, target_id, 0, "");
2694}
2695
2696/***********************************************************************/
2699static void transport_load2(QVariant data1, QVariant data2)
2700{
2701 int actor_id = data1.toInt();
2702 int target_id = data2.toInt();
2703
2704 request_do_action(ACTION_TRANSPORT_LOAD2, actor_id, target_id, 0, "");
2705}
2706
2707/***********************************************************************/
2710static void transport_load3(QVariant data1, QVariant data2)
2711{
2712 int actor_id = data1.toInt();
2713 int target_id = data2.toInt();
2714
2715 request_do_action(ACTION_TRANSPORT_LOAD3, actor_id, target_id, 0, "");
2716}
2717
2718/***********************************************************************/
2721static void transport_deboard(QVariant data1, QVariant data2)
2722{
2723 int actor_id = data1.toInt();
2724 int target_id = data2.toInt();
2725
2726 request_do_action(ACTION_TRANSPORT_DEBOARD, actor_id, target_id, 0, "");
2727}
2728
2729/***********************************************************************/
2732static void disembark1(QVariant data1, QVariant data2)
2733{
2734 int actor_id = data1.toInt();
2735 int target_id = data2.toInt();
2736
2737 if (NULL != game_unit_by_number(actor_id)
2738 && NULL != index_to_tile(&(wld.map), target_id)) {
2740 actor_id, target_id, 0, "");
2741 }
2742}
2743
2744/***********************************************************************/
2747static void disembark2(QVariant data1, QVariant data2)
2748{
2749 int actor_id = data1.toInt();
2750 int target_id = data2.toInt();
2751
2752 if (NULL != game_unit_by_number(actor_id)
2753 && NULL != index_to_tile(&(wld.map), target_id)) {
2755 actor_id, target_id, 0, "");
2756 }
2757}
2758
2759/***********************************************************************/
2762static void disembark3(QVariant data1, QVariant data2)
2763{
2764 int actor_id = data1.toInt();
2765 int target_id = data2.toInt();
2766
2767 if (game_unit_by_number(actor_id) != nullptr
2768 && index_to_tile(&(wld.map), target_id) != nullptr) {
2770 actor_id, target_id, 0, "");
2771 }
2772}
2773
2774/***********************************************************************/
2777static void disembark4(QVariant data1, QVariant data2)
2778{
2779 int actor_id = data1.toInt();
2780 int target_id = data2.toInt();
2781
2782 if (game_unit_by_number(actor_id) != nullptr
2783 && index_to_tile(&(wld.map), target_id) != nullptr) {
2785 actor_id, target_id, 0, "");
2786 }
2787}
2788
2789/***********************************************************************/
2792static void enter_hut(QVariant data1, QVariant data2)
2793{
2794 int actor_id = data1.toInt();
2795 int target_id = data2.toInt();
2796
2797 if (NULL != game_unit_by_number(actor_id)
2798 && NULL != index_to_tile(&(wld.map), target_id)) {
2800 actor_id, target_id, 0, "");
2801 }
2802}
2803
2804/***********************************************************************/
2807static void enter_hut2(QVariant data1, QVariant data2)
2808{
2809 int actor_id = data1.toInt();
2810 int target_id = data2.toInt();
2811
2812 if (NULL != game_unit_by_number(actor_id)
2813 && NULL != index_to_tile(&(wld.map), target_id)) {
2815 actor_id, target_id, 0, "");
2816 }
2817}
2818
2819/***********************************************************************/
2822static void enter_hut3(QVariant data1, QVariant data2)
2823{
2824 int actor_id = data1.toInt();
2825 int target_id = data2.toInt();
2826
2827 if (game_unit_by_number(actor_id) != nullptr
2828 && index_to_tile(&(wld.map), target_id) != nullptr) {
2830 actor_id, target_id, 0, "");
2831 }
2832}
2833
2834/***********************************************************************/
2837static void enter_hut4(QVariant data1, QVariant data2)
2838{
2839 int actor_id = data1.toInt();
2840 int target_id = data2.toInt();
2841
2842 if (game_unit_by_number(actor_id) != nullptr
2843 && index_to_tile(&(wld.map), target_id) != nullptr) {
2845 actor_id, target_id, 0, "");
2846 }
2847}
2848
2849/***********************************************************************/
2852static void frighten_hut(QVariant data1, QVariant data2)
2853{
2854 int actor_id = data1.toInt();
2855 int target_id = data2.toInt();
2856
2857 if (NULL != game_unit_by_number(actor_id)
2858 && NULL != index_to_tile(&(wld.map), target_id)) {
2860 actor_id, target_id, 0, "");
2861 }
2862}
2863
2864/***********************************************************************/
2867static void frighten_hut2(QVariant data1, QVariant data2)
2868{
2869 int actor_id = data1.toInt();
2870 int target_id = data2.toInt();
2871
2872 if (NULL != game_unit_by_number(actor_id)
2873 && NULL != index_to_tile(&(wld.map), target_id)) {
2875 actor_id, target_id, 0, "");
2876 }
2877}
2878
2879/***********************************************************************/
2882static void frighten_hut3(QVariant data1, QVariant data2)
2883{
2884 int actor_id = data1.toInt();
2885 int target_id = data2.toInt();
2886
2887 if (game_unit_by_number(actor_id) != nullptr
2888 && index_to_tile(&(wld.map), target_id) != nullptr) {
2890 actor_id, target_id, 0, "");
2891 }
2892}
2893
2894/***********************************************************************/
2897static void frighten_hut4(QVariant data1, QVariant data2)
2898{
2899 int actor_id = data1.toInt();
2900 int target_id = data2.toInt();
2901
2902 if (game_unit_by_number(actor_id) != nullptr
2903 && index_to_tile(&(wld.map), target_id) != nullptr) {
2905 actor_id, target_id, 0, "");
2906 }
2907}
2908
2909/**********************************************************************/
2912static void nuke_units(QVariant data1, QVariant data2)
2913{
2914 int actor_id = data1.toInt();
2915 int target_id = data2.toInt();
2916
2918 target_id, 0, "");
2919}
2920
2921/**********************************************************************/
2924static void collect_ransom(QVariant data1, QVariant data2)
2925{
2926 int actor_id = data1.toInt();
2927 int target_id = data2.toInt();
2928
2930 target_id, 0, "");
2931}
2932
2933/**********************************************************************/
2936static void spy_attack(QVariant data1, QVariant data2)
2937{
2938 int actor_id = data1.toInt();
2939 int target_id = data2.toInt();
2940
2942 target_id, 0, "");
2943}
2944
2945/**********************************************************************/
2948static void wipe_units(QVariant data1, QVariant data2)
2949{
2950 int actor_id = data1.toInt();
2951 int target_id = data2.toInt();
2952
2954 target_id, 0, "");
2955}
2956
2957/**********************************************************************/
2960static void capture_units(QVariant data1, QVariant data2)
2961{
2962 int actor_id = data1.toInt();
2963 int target_id = data2.toInt();
2964
2966 target_id, 0, "");
2967}
2968
2969/***********************************************************************/
2972static void expel_unit(QVariant data1, QVariant data2)
2973{
2974 int actor_id = data1.toInt();
2975 int target_id = data2.toInt();
2976
2978 target_id, 0, "");
2979}
2980
2981/***********************************************************************/
2984static void bombard(QVariant data1, QVariant data2)
2985{
2986 int actor_id = data1.toInt();
2987 int target_id = data2.toInt();
2988
2990 target_id, 0, "");
2991}
2992
2993/***********************************************************************/
2996static void bombard2(QVariant data1, QVariant data2)
2997{
2998 int actor_id = data1.toInt();
2999 int target_id = data2.toInt();
3000
3002 target_id, 0, "");
3003}
3004
3005/***********************************************************************/
3008static void bombard3(QVariant data1, QVariant data2)
3009{
3010 int actor_id = data1.toInt();
3011 int target_id = data2.toInt();
3012
3014 target_id, 0, "");
3015}
3016
3017/***********************************************************************/
3020static void bombard4(QVariant data1, QVariant data2)
3021{
3022 int actor_id = data1.toInt();
3023 int target_id = data2.toInt();
3024
3026 target_id, 0, "");
3027}
3028
3029/***********************************************************************/
3032static void bombard_lethal(QVariant data1, QVariant data2)
3033{
3034 int actor_id = data1.toInt();
3035 int target_id = data2.toInt();
3036
3038 target_id, 0, "");
3039}
3040
3041/***********************************************************************/
3044static void bombard_lethal2(QVariant data1, QVariant data2)
3045{
3046 int actor_id = data1.toInt();
3047 int target_id = data2.toInt();
3048
3050 target_id, 0, "");
3051}
3052
3053/***********************************************************************/
3056static void found_city(QVariant data1, QVariant data2)
3057{
3058 int actor_id = data1.toInt();
3059
3061 actor_id);
3062}
3063
3064/***********************************************************************/
3067static void transform_terrain(QVariant data1, QVariant data2)
3068{
3069 int actor_id = data1.toInt();
3070 int target_id = data2.toInt();
3071
3072 if (NULL != game_unit_by_number(actor_id)
3073 && NULL != index_to_tile(&(wld.map), target_id)) {
3075 actor_id, target_id, 0, "");
3076 }
3077}
3078
3079/***********************************************************************/
3082static void cultivate(QVariant data1, QVariant data2)
3083{
3084 int actor_id = data1.toInt();
3085 int target_id = data2.toInt();
3086
3087 if (NULL != game_unit_by_number(actor_id)
3088 && NULL != index_to_tile(&(wld.map), target_id)) {
3090 actor_id, target_id, 0, "");
3091 }
3092}
3093
3094/***********************************************************************/
3097static void plant(QVariant data1, QVariant data2)
3098{
3099 int actor_id = data1.toInt();
3100 int target_id = data2.toInt();
3101
3102 if (NULL != game_unit_by_number(actor_id)
3103 && NULL != index_to_tile(&(wld.map), target_id)) {
3105 actor_id, target_id, 0, "");
3106 }
3107}
3108
3109/***********************************************************************/
3112static void pillage(QVariant data1, QVariant data2)
3113{
3114 int actor_id = data1.toInt();
3115 int target_id = data2.toInt();
3116
3117 if (NULL != game_unit_by_number(actor_id)
3118 && NULL != index_to_tile(&(wld.map), target_id)) {
3120 actor_id, target_id,
3121 /* FIXME: will cause problems if more than
3122 * one action selection dialog at a time
3123 * becomes supported. */
3125 "");
3126 }
3127}
3128
3129/***********************************************************************/
3132static void clean(QVariant data1, QVariant data2)
3133{
3134 int actor_id = data1.toInt();
3135 int target_id = data2.toInt();
3136
3137 if (NULL != game_unit_by_number(actor_id)
3138 && NULL != index_to_tile(&(wld.map), target_id)) {
3140 actor_id, target_id,
3141 /* FIXME: will cause problems if more than
3142 * one action selection dialog at a time
3143 * becomes supported. */
3145 "");
3146 }
3147}
3148
3149/***********************************************************************/
3152static void road(QVariant data1, QVariant data2)
3153{
3154 int actor_id = data1.toInt();
3155 int target_id = data2.toInt();
3156
3157 if (NULL != game_unit_by_number(actor_id)
3158 && NULL != index_to_tile(&(wld.map), target_id)
3161 actor_id, target_id,
3162 /* FIXME: will cause problems if more than
3163 * one action selection dialog at a time
3164 * becomes supported. */
3166 "");
3167 }
3168}
3169
3170/***********************************************************************/
3173static void base(QVariant data1, QVariant data2)
3174{
3175 int actor_id = data1.toInt();
3176 int target_id = data2.toInt();
3177
3178 if (NULL != game_unit_by_number(actor_id)
3179 && NULL != index_to_tile(&(wld.map), target_id)
3182 actor_id, target_id,
3183 /* FIXME: will cause problems if more than
3184 * one action selection dialog at a time
3185 * becomes supported. */
3187 "");
3188 }
3189}
3190
3191/***********************************************************************/
3194static void mine(QVariant data1, QVariant data2)
3195{
3196 int actor_id = data1.toInt();
3197 int target_id = data2.toInt();
3198
3199 if (NULL != game_unit_by_number(actor_id)
3200 && NULL != index_to_tile(&(wld.map), target_id)
3203 actor_id, target_id,
3204 /* FIXME: will cause problems if more than
3205 * one action selection dialog at a time
3206 * becomes supported. */
3208 "");
3209 }
3210}
3211
3212/***********************************************************************/
3215static void irrigate(QVariant data1, QVariant data2)
3216{
3217 int actor_id = data1.toInt();
3218 int target_id = data2.toInt();
3219
3220 if (NULL != game_unit_by_number(actor_id)
3221 && NULL != index_to_tile(&(wld.map), target_id)
3224 actor_id, target_id,
3225 /* FIXME: will cause problems if more than
3226 * one action selection dialog at a time
3227 * becomes supported. */
3229 "");
3230 }
3231}
3232
3233/***********************************************************************/
3236static void nuke(QVariant data1, QVariant data2)
3237{
3238 int diplomat_id = data1.toInt();
3239 int diplomat_target_id = data2.toInt();
3240
3245 }
3246}
3247
3248/***********************************************************************/
3251static void attack(QVariant data1, QVariant data2)
3252{
3253 int diplomat_id = data1.toInt();
3254 int diplomat_target_id = data2.toInt();
3255
3260 }
3261}
3262
3263/***********************************************************************/
3266static void attack2(QVariant data1, QVariant data2)
3267{
3268 int diplomat_id = data1.toInt();
3269 int diplomat_target_id = data2.toInt();
3270
3271 if (game_unit_by_number(diplomat_id) != nullptr
3272 && index_to_tile(&(wld.map), diplomat_target_id) != nullptr) {
3275 }
3276}
3277
3278/***********************************************************************/
3281static void suicide_attack(QVariant data1, QVariant data2)
3282{
3283 int diplomat_id = data1.toInt();
3284 int diplomat_target_id = data2.toInt();
3285
3290 }
3291}
3292
3293/***********************************************************************/
3296static void suicide_attack2(QVariant data1, QVariant data2)
3297{
3298 int diplomat_id = data1.toInt();
3299 int diplomat_target_id = data2.toInt();
3300
3301 if (game_unit_by_number(diplomat_id) != nullptr
3302 && index_to_tile(&(wld.map), diplomat_target_id) != nullptr) {
3305 }
3306}
3307
3308/***********************************************************************/
3311static void paradrop(QVariant data1, QVariant data2)
3312{
3313 int actor_id = data1.toInt();
3314 int target_id = data2.toInt();
3315
3316 if (NULL != game_unit_by_number(actor_id)
3317 && NULL != index_to_tile(&(wld.map), target_id)) {
3319 actor_id, target_id, 0, "");
3320 }
3321}
3322
3323/***********************************************************************/
3326static void teleport(QVariant data1, QVariant data2)
3327{
3328 int actor_id = data1.toInt();
3329 int target_id = data2.toInt();
3330
3331 if (game_unit_by_number(actor_id) != nullptr
3332 && index_to_tile(&(wld.map), target_id) != nullptr) {
3334 actor_id, target_id, 0, "");
3335 }
3336}
3337
3338/***********************************************************************/
3341static void paradrop_conquer(QVariant data1, QVariant data2)
3342{
3343 int actor_id = data1.toInt();
3344 int target_id = data2.toInt();
3345
3346 if (NULL != game_unit_by_number(actor_id)
3347 && NULL != index_to_tile(&(wld.map), target_id)) {
3349 actor_id, target_id, 0, "");
3350 }
3351}
3352
3353/***********************************************************************/
3356static void teleport_conquer(QVariant data1, QVariant data2)
3357{
3358 int actor_id = data1.toInt();
3359 int target_id = data2.toInt();
3360
3361 if (game_unit_by_number(actor_id) != nullptr
3362 && index_to_tile(&(wld.map), target_id) != nullptr) {
3364 actor_id, target_id, 0, "");
3365 }
3366}
3367
3368/***********************************************************************/
3371static void paradrop_frighten(QVariant data1, QVariant data2)
3372{
3373 int actor_id = data1.toInt();
3374 int target_id = data2.toInt();
3375
3376 if (NULL != game_unit_by_number(actor_id)
3377 && NULL != index_to_tile(&(wld.map), target_id)) {
3379 actor_id, target_id, 0, "");
3380 }
3381}
3382
3383/***********************************************************************/
3386static void teleport_frighten(QVariant data1, QVariant data2)
3387{
3388 int actor_id = data1.toInt();
3389 int target_id = data2.toInt();
3390
3391 if (game_unit_by_number(actor_id) != nullptr
3392 && index_to_tile(&(wld.map), target_id) != nullptr) {
3394 actor_id, target_id, 0, "");
3395 }
3396}
3397
3398/***********************************************************************/
3402{
3403 int actor_id = data1.toInt();
3404 int target_id = data2.toInt();
3405
3406 if (NULL != game_unit_by_number(actor_id)
3407 && NULL != index_to_tile(&(wld.map), target_id)) {
3409 actor_id, target_id, 0, "");
3410 }
3411}
3412
3413/***********************************************************************/
3417{
3418 int actor_id = data1.toInt();
3419 int target_id = data2.toInt();
3420
3421 if (game_unit_by_number(actor_id) != nullptr
3422 && index_to_tile(&(wld.map), target_id) != nullptr) {
3424 actor_id, target_id, 0, "");
3425 }
3426}
3427
3428/***********************************************************************/
3431static void paradrop_enter(QVariant data1, QVariant data2)
3432{
3433 int actor_id = data1.toInt();
3434 int target_id = data2.toInt();
3435
3436 if (NULL != game_unit_by_number(actor_id)
3437 && NULL != index_to_tile(&(wld.map), target_id)) {
3439 actor_id, target_id, 0, "");
3440 }
3441}
3442
3443/***********************************************************************/
3446static void teleport_enter(QVariant data1, QVariant data2)
3447{
3448 int actor_id = data1.toInt();
3449 int target_id = data2.toInt();
3450
3451 if (game_unit_by_number(actor_id) != nullptr
3452 && index_to_tile(&(wld.map), target_id) != nullptr) {
3454 actor_id, target_id, 0, "");
3455 }
3456}
3457
3458/***********************************************************************/
3462{
3463 int actor_id = data1.toInt();
3464 int target_id = data2.toInt();
3465
3466 if (NULL != game_unit_by_number(actor_id)
3467 && NULL != index_to_tile(&(wld.map), target_id)) {
3469 actor_id, target_id, 0, "");
3470 }
3471}
3472
3473/***********************************************************************/
3477{
3478 int actor_id = data1.toInt();
3479 int target_id = data2.toInt();
3480
3481 if (game_unit_by_number(actor_id) != nullptr
3482 && index_to_tile(&(wld.map), target_id) != nullptr) {
3484 actor_id, target_id, 0, "");
3485 }
3486}
3487
3488/***********************************************************************/
3491static void join_city(QVariant data1, QVariant data2)
3492{
3493 int actor_id = data1.toInt();
3494 int target_id = data2.toInt();
3495
3496 if (NULL != game_unit_by_number(actor_id)
3497 && NULL != game_city_by_number(target_id)) {
3499 actor_id, target_id, 0, "");
3500 }
3501}
3502
3503/***********************************************************************/
3506static void spy_steal_shared(QVariant data1, QVariant data2,
3507 action_id act_id)
3508{
3509 QString str;
3510 QVariant qv1;
3512 int diplomat_id = data1.toInt();
3513 int diplomat_target_id = data2.toInt();
3516 struct player *pvictim = NULL;
3519
3520 cd = gui()->get_diplo_dialog();
3521 if (cd != NULL) {
3522 cd->close();
3523 }
3524
3525 if (pvcity == nullptr) {
3526 return;
3527 }
3528
3529 // Wait for the player's reply before moving on to the next queued diplomat.
3531
3533
3534 struct astring stra = ASTRING_INIT;
3535 cd = new choice_dialog(_("Steal"), _("Steal Technology"),
3536 gui()->game_tab_widget,
3538
3539 // Put both actor and target city in qv1 since qv2 is taken
3542 actor_and_target.append(act_id);
3543 qv1 = QVariant::fromValue(actor_and_target);
3544
3545 struct player *pplayer = client_player();
3546 const struct research *presearch = research_get(pplayer);
3547 const struct research *vresearch = research_get(pvictim);
3548
3555 // Defeat keyboard shortcut mnemonics
3557 .replace("&", "&&");
3558 cd->add_item(str, func, qv1, i);
3559 }
3561
3563 get_non_targeted_action_id(act_id)])) {
3564 astr_set(&stra, _("At %s's Discretion"),
3567 str = QString(astr_str(&stra)).replace("&", "&&");
3568 cd->add_item(str, func, qv1, A_UNSET);
3569 }
3570
3571 cd->set_layout();
3572 cd->show_me();
3573
3574 astr_free(&stra);
3575}
3576
3577/***********************************************************************/
3580static void spy_steal(QVariant data1, QVariant data2)
3581{
3583}
3584
3585/***********************************************************************/
3588static void spy_steal_esc(QVariant data1, QVariant data2)
3589{
3591}
3592
3593/***********************************************************************/
3596static void spy_steal_something(QVariant data1, QVariant data2)
3597{
3598 int diplomat_id = data1.toList().at(0).toInt();
3599 int diplomat_target_id = data1.toList().at(1).toInt();
3600 action_id act_id = data1.toList().at(2).toInt();
3601
3604 if (data2.toInt() == A_UNSET) {
3605 // This is the untargeted version.
3607 diplomat_id, diplomat_target_id, data2.toInt(), "");
3608 } else {
3609 // This is the targeted version.
3611 diplomat_target_id, data2.toInt(), "");
3612 }
3613 }
3614}
3615
3616/***********************************************************************/
3620{
3621 int actor_id = data1.toInt();
3622 int target_id = data2.toInt();
3623
3624 if (NULL != game_unit_by_number(actor_id)
3625 && NULL != game_city_by_number(target_id)) {
3626 // Wait for the server's reply before moving on to the next queued diplomat.
3628
3629 request_action_details(ACTION_STRIKE_BUILDING, actor_id, target_id);
3630 }
3631}
3632
3633/***********************************************************************/
3637{
3638 int diplomat_id = data1.toInt();
3639 int diplomat_target_id = data2.toInt();
3640
3643 // Wait for the server's reply before moving on to the next queued diplomat.
3645
3648 }
3649}
3650
3651/***********************************************************************/
3655{
3656 int diplomat_id = data1.toInt();
3657 int diplomat_target_id = data2.toInt();
3658
3661 /* Wait for the server's reply before moving on to the next queued
3662 * diplomat. */
3664
3667 }
3668}
3669
3670/***********************************************************************/
3673static void spy_poison(QVariant data1, QVariant data2)
3674{
3675 int diplomat_id = data1.toInt();
3676 int diplomat_target_id = data2.toInt();
3677
3682 }
3683}
3684
3685/***********************************************************************/
3688static void spy_poison_esc(QVariant data1, QVariant data2)
3689{
3690 int diplomat_id = data1.toInt();
3691 int diplomat_target_id = data2.toInt();
3692
3697 }
3698}
3699
3700/***********************************************************************/
3703static void spy_spread_plague(QVariant data1, QVariant data2)
3704{
3705 int diplomat_id = data1.toInt();
3706 int diplomat_target_id = data2.toInt();
3707
3708 if (game_unit_by_number(diplomat_id) != nullptr
3709 && game_city_by_number(diplomat_target_id) != nullptr) {
3712 }
3713}
3714
3715/***********************************************************************/
3718static void spy_nuke_city(QVariant data1, QVariant data2)
3719{
3720 int diplomat_id = data1.toInt();
3721 int diplomat_target_id = data2.toInt();
3722
3727 }
3728}
3729
3730/***********************************************************************/
3733static void spy_nuke_city_esc(QVariant data1, QVariant data2)
3734{
3735 int diplomat_id = data1.toInt();
3736 int diplomat_target_id = data2.toInt();
3737
3742 }
3743}
3744
3745/***********************************************************************/
3748static void nuke_city(QVariant data1, QVariant data2)
3749{
3750 int actor_id = data1.toInt();
3751 int target_id = data2.toInt();
3752
3753 if (NULL != game_unit_by_number(actor_id)
3754 && NULL != game_city_by_number(target_id)) {
3756 actor_id, target_id, 0, "");
3757 }
3758}
3759
3760/***********************************************************************/
3763static void destroy_city(QVariant data1, QVariant data2)
3764{
3765 int diplomat_id = data1.toInt();
3766 int diplomat_target_id = data2.toInt();
3767
3772 }
3773}
3774
3775/***********************************************************************/
3778static void spy_steal_gold(QVariant data1, QVariant data2)
3779{
3780 int diplomat_id = data1.toInt();
3781 int diplomat_target_id = data2.toInt();
3782
3787 }
3788}
3789
3790/***********************************************************************/
3793static void spy_steal_gold_esc(QVariant data1, QVariant data2)
3794{
3795 int diplomat_id = data1.toInt();
3796 int diplomat_target_id = data2.toInt();
3797
3802 }
3803}
3804
3805/***********************************************************************/
3808static void spy_steal_maps(QVariant data1, QVariant data2)
3809{
3810 int diplomat_id = data1.toInt();
3811 int diplomat_target_id = data2.toInt();
3812
3817 }
3818}
3819
3820/***********************************************************************/
3823static void spy_steal_maps_esc(QVariant data1, QVariant data2)
3824{
3825 int diplomat_id = data1.toInt();
3826 int diplomat_target_id = data2.toInt();
3827
3832 }
3833}
3834
3835/***********************************************************************/
3838static void spy_escape(QVariant data1, QVariant data2)
3839{
3840 int diplomat_id = data1.toInt();
3841 int diplomat_target_id = data2.toInt();
3842
3847 }
3848}
3849
3850/***********************************************************************/
3853static void spy_embassy(QVariant data1, QVariant data2)
3854{
3855 int diplomat_id = data1.toInt();
3856 int diplomat_target_id = data2.toInt();
3857
3861 diplomat_target_id, 0, "");
3862 }
3863}
3864
3865/***********************************************************************/
3868static void diplomat_embassy(QVariant data1, QVariant data2)
3869{
3870 int diplomat_id = data1.toInt();
3871 int diplomat_target_id = data2.toInt();
3872
3876 diplomat_target_id, 0, "");
3877 }
3878}
3879
3880/***********************************************************************/
3883static void spy_investigate(QVariant data1, QVariant data2)
3884{
3885 int diplomat_id = data1.toInt();
3886 int diplomat_target_id = data2.toInt();
3887
3891 diplomat_target_id, 0, "");
3892 }
3893}
3894
3895/***********************************************************************/
3898static void diplomat_investigate(QVariant data1, QVariant data2)
3899{
3900 int diplomat_id = data1.toInt();
3901 int diplomat_target_id = data2.toInt();
3902
3906 diplomat_target_id, 0, "");
3907 }
3908}
3909
3910/***********************************************************************/
3913static void diplomat_sabotage(QVariant data1, QVariant data2)
3914{
3915 int diplomat_id = data1.toInt();
3916 int diplomat_target_id = data2.toInt();
3917
3921 diplomat_target_id, B_LAST + 1, "");
3922 }
3923}
3924
3925/***********************************************************************/
3928static void diplomat_sabotage_esc(QVariant data1, QVariant data2)
3929{
3930 int diplomat_id = data1.toInt();
3931 int diplomat_target_id = data2.toInt();
3932
3936 diplomat_target_id, B_LAST + 1, "");
3937 }
3938}
3939
3940/***********************************************************************/
3943static void diplomat_steal(QVariant data1, QVariant data2)
3944{
3945 int diplomat_id = data1.toInt();
3946 int diplomat_target_id = data2.toInt();
3947
3952 }
3953}
3954
3955/***********************************************************************/
3958static void diplomat_steal_esc(QVariant data1, QVariant data2)
3959{
3960 int diplomat_id = data1.toInt();
3961 int diplomat_target_id = data2.toInt();
3962
3967 }
3968}
3969
3970/***********************************************************************/
3973static void diplomat_incite(QVariant data1, QVariant data2)
3974{
3975 int diplomat_id = data1.toInt();
3976 int diplomat_target_id = data2.toInt();
3977
3980 // Wait for the server's reply before moving on to the next queued diplomat.
3982
3985 }
3986}
3987
3988/***********************************************************************/
3992{
3993 int diplomat_id = data1.toInt();
3994 int diplomat_target_id = data2.toInt();
3995
3998 // Wait for the server's reply before moving on to the next queued diplomat.
4000
4003 }
4004}
4005
4006/***********************************************************************/
4009static void regular_move(QVariant data1, QVariant data2)
4010{
4011 int actor_id = data1.toInt();
4012 int target_id = data2.toInt();
4013
4014 if (NULL != game_unit_by_number(actor_id)
4015 && NULL != index_to_tile(&(wld.map), target_id)) {
4017 actor_id, target_id, 0, "");
4018 }
4019}
4020
4021/***********************************************************************/
4024static void regular_move2(QVariant data1, QVariant data2)
4025{
4026 int actor_id = data1.toInt();
4027 int target_id = data2.toInt();
4028
4029 if (game_unit_by_number(actor_id) != nullptr
4030 && index_to_tile(&(wld.map), target_id) != nullptr) {
4032 actor_id, target_id, 0, "");
4033 }
4034}
4035
4036/***********************************************************************/
4039static void regular_move3(QVariant data1, QVariant data2)
4040{
4041 int actor_id = data1.toInt();
4042 int target_id = data2.toInt();
4043
4044 if (game_unit_by_number(actor_id) != nullptr
4045 && index_to_tile(&(wld.map), target_id) != nullptr) {
4047 actor_id, target_id, 0, "");
4048 }
4049}
4050
4051/***********************************************************************/
4055void popup_incite_dialog(struct unit *actor, struct city *tcity, int cost,
4056 const struct action *paction)
4057{
4058 char buf[1024];
4059 char buf2[1024];
4060 int diplomat_id = actor->id;
4061 int diplomat_target_id = tcity->id;
4062 const int act_id = paction->id;
4063
4064 // Should be set before sending request to the server.
4066
4067 fc_snprintf(buf, ARRAY_SIZE(buf), PL_("Treasury contains %d gold.",
4068 "Treasury contains %d gold.",
4069 client_player()->economic.gold),
4070 client_player()->economic.gold);
4071
4073 hud_message_box *impossible = new hud_message_box(gui()->central_wdg);
4074
4076 _("You can't incite a revolt in %s."), city_name_get(tcity));
4077 impossible->set_text_title(buf2, "!");
4078 impossible->setStandardButtons(QMessageBox::Ok);
4079 impossible->setAttribute(Qt::WA_DeleteOnClose);
4080 impossible->show();
4081 } else if (cost <= client_player()->economic.gold) {
4082 hud_message_box *ask = new hud_message_box(gui()->central_wdg);
4083
4085 PL_("Incite a revolt for %d gold?\n%s",
4086 "Incite a revolt for %d gold?\n%s", cost), cost, buf);
4087 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
4088 ask->setDefaultButton(QMessageBox::Cancel);
4089 ask->set_text_title(buf2, _("Incite a Revolt!"));
4090 ask->setAttribute(Qt::WA_DeleteOnClose);
4091 QObject::connect(ask, &hud_message_box::accepted, [=]() {
4094 });
4095 ask->show();
4096 return;
4097 } else {
4098 hud_message_box *too_much = new hud_message_box(gui()->central_wdg);
4099
4101 PL_("Inciting a revolt costs %d gold.\n%s",
4102 "Inciting a revolt costs %d gold.\n%s", cost), cost,
4103 buf);
4104 too_much->set_text_title(buf2, "!");
4105 too_much->setStandardButtons(QMessageBox::Ok);
4106 too_much->setAttribute(Qt::WA_DeleteOnClose);
4107 too_much->show();
4108 }
4109
4111}
4112
4113/***********************************************************************/
4117void popup_bribe_dialog(struct unit *actor, struct unit *tunit, int cost,
4118 const struct action *paction)
4119{
4120 hud_message_box *ask = new hud_message_box(gui()->central_wdg);
4121 char buf[1024];
4122 char buf2[1024];
4123 int diplomat_id = actor->id;
4124 int diplomat_target_id = tunit->id;
4125 const int act_id = paction->id;
4126
4127 // Should be set before sending request to the server.
4129
4130 fc_snprintf(buf, ARRAY_SIZE(buf), PL_("Treasury contains %d gold.",
4131 "Treasury contains %d gold.",
4132 client_player()->economic.gold),
4133 client_player()->economic.gold);
4134
4135 if (cost <= client_player()->economic.gold) {
4136 fc_snprintf(buf2, ARRAY_SIZE(buf2), PL_("Bribe unit for %d gold?\n%s",
4137 "Bribe unit for %d gold?\n%s",
4138 cost), cost, buf);
4139 ask->set_text_title(buf2, _("Bribe Enemy Unit"));
4140 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
4141 ask->setDefaultButton(QMessageBox::Cancel);
4142 ask->setAttribute(Qt::WA_DeleteOnClose);
4143 QObject::connect(ask, &hud_message_box::accepted, [=]() {
4146 });
4147 ask->show();
4148 return;
4149 } else {
4151 PL_("Bribing the unit costs %d gold.\n%s",
4152 "Bribing the unit costs %d gold.\n%s", cost), cost, buf);
4153 ask->set_text_title(buf2, _("Traitors Demand Too Much!"));
4154 ask->setAttribute(Qt::WA_DeleteOnClose);
4155 ask->show();
4156 }
4157
4159}
4160
4161/***********************************************************************/
4164static void pillage_something(QVariant data1, QVariant data2)
4165{
4166 int punit_id;
4167 int what;
4168 struct unit *punit;
4169 struct extra_type *target;
4170
4171 what = data1.toInt();
4172 punit_id = data2.toInt();
4174 if (punit) {
4175 target = extra_by_number(what);
4177 }
4179}
4180
4181/***********************************************************************/
4184static void spy_sabotage(QVariant data1, QVariant data2)
4185{
4186 int diplomat_id = data1.toList().at(0).toInt();
4187 int diplomat_target_id = data1.toList().at(1).toInt();
4188 action_id act_id = data1.toList().at(2).toInt();
4189
4192 if (data2.toInt() == B_LAST) {
4193 // This is the untargeted version.
4195 diplomat_id, diplomat_target_id, data2.toInt(),
4196 "");
4197 } else if (data2.toInt() == -1) {
4198 // This is the city production version.
4200 diplomat_id, diplomat_target_id, data2.toInt(),
4201 "");
4202 } else {
4203 // This is the targeted version.
4205 diplomat_target_id, data2.toInt(), "");
4206 }
4207 }
4208}
4209
4210/***********************************************************************/
4215 const struct action *paction)
4216{
4217 QString str;
4218 QVariant qv1, qv2;
4219 int diplomat_id = actor->id;
4220 int diplomat_target_id = tcity->id;
4223 int nr = 0;
4224 struct astring stra = ASTRING_INIT;
4226
4227 if (paction->result == ACTRES_STRIKE_BUILDING) {
4228 cd = new choice_dialog(_("Strike"),
4229 _("Select Improvement to Strike"),
4230 gui()->game_tab_widget,
4232 } else {
4233 cd = new choice_dialog(_("Sabotage"),
4234 _("Select Improvement to Sabotage"),
4235 gui()->game_tab_widget,
4237 }
4238
4239 // Should be set before sending request to the server.
4241
4242 // Put both actor, target city and action in qv1 since qv2 is taken
4245 actor_and_target.append(paction->id);
4246 qv1 = QVariant::fromValue(actor_and_target);
4247
4250 paction->id)])) {
4252 cd->add_item(QString(_("City Production")), func, qv1, -1);
4253 }
4254
4255 city_built_iterate(tcity, pimprove) {
4256 if (pimprove->sabotage > 0) {
4258 // Defeat keyboard shortcut mnemonics
4260 .replace("&", "&&");
4261 qv2 = nr;
4262 cd->add_item(str, func, qv1, improvement_number(pimprove));
4263 nr++;
4264 }
4266
4269 astr_set(&stra, _("At %s's Discretion"),
4272 str = QString(astr_str(&stra)).replace("&", "&&");
4273 cd->add_item(str, func, qv1, B_LAST);
4274 }
4275
4276 cd->set_layout();
4277 cd->show_me();
4278 astr_free(&stra);
4279}
4280
4281/***********************************************************************/
4286{
4287 QString str;
4288 QVariant qv1, qv2;
4291 struct extra_type *tgt;
4292
4294 return;
4295 }
4296 cd = new choice_dialog(_("What To Pillage"), _("Select what to pillage:"),
4297 gui()->game_tab_widget);
4298 qv2 = punit->id;
4299 while ((tgt = get_preferred_pillage(extras))) {
4300 int what;
4301
4302 what = extra_index(tgt);
4303 BV_CLR(extras, what);
4304
4306 // Defeat keyboard shortcut mnemonics
4307 str = QString(extra_name_translation(tgt)).replace("&", "&&");
4308 qv1 = what;
4309 cd->add_item(str, func, qv1, qv2);
4310 }
4311 cd->set_layout();
4312 cd->show_me();
4313}
4314
4315/***********************************************************************/
4319 QWidget *parent) : hud_message_box(parent)
4320{
4321 QString str;
4322 QPushButton *pb;
4323
4324 setAttribute(Qt::WA_DeleteOnClose);
4325 setModal(false);
4330
4331 str = QString(PL_("Are you sure you want to disband that %1 unit?",
4332 "Are you sure you want to disband those %1 units?",
4334 pb = addButton(_("Yes"), QMessageBox::AcceptRole);
4335 addButton(_("No"), QMessageBox::RejectRole);
4336 set_text_title(str, _("Disband units"));
4338 connect(pb, &QAbstractButton::clicked, this, &disband_box::disband_clicked);
4339}
4340
4341/***********************************************************************/
4352
4353/***********************************************************************/
4360
4361/***********************************************************************/
4364void popup_disband_dialog(struct unit_list *punits)
4365{
4366 disband_box *ask = new disband_box(punits, gui()->central_wdg);
4367 ask->show();
4368}
4369
4370/***********************************************************************/
4375{
4376 hud_message_box *ask = new hud_message_box(gui()->central_wdg);
4377 QString text;
4378 QString title;
4379
4380 title = QString(_("Modpack suggests using %1 tileset."))
4382 text = QString("It might not work with other tilesets.\n"
4383 "You are currently using tileset %1.")
4385 ask->addButton(_("Keep current tileset"), QMessageBox::RejectRole);
4386 ask->addButton(_("Load tileset"), QMessageBox::AcceptRole);
4387 ask->set_text_title(text, title);
4388 ask->setAttribute(Qt::WA_DeleteOnClose);
4389
4390 QObject::connect(ask, &hud_message_box::accepted, [=]() {
4393 gui()->map_scale)) {
4395 _("Can't load requested tileset."));
4396 }
4397 });
4398 ask->show();
4399}
4400
4401/***********************************************************************/
4406{
4407 hud_message_box *ask = new hud_message_box(gui()->central_wdg);
4408 QString text;
4409 QString title;
4410
4411 title = QString(_("Modpack suggests using %1 soundset."))
4413 text = QString("It might not work with other tilesets.\n"
4414 "You are currently using soundset %1.")
4415 .arg(sound_set_name);
4416 ask->addButton(_("Keep current soundset"), QMessageBox::RejectRole);
4417 ask->addButton(_("Load soundset"), QMessageBox::AcceptRole);
4418 ask->set_text_title(text, title);
4419 ask->setAttribute(Qt::WA_DeleteOnClose);
4420 QObject::connect(ask, &hud_message_box::accepted, [=]() {
4422 });
4423 ask->show();
4424}
4425
4426/***********************************************************************/
4431{
4432 hud_message_box *ask = new hud_message_box(gui()->central_wdg);
4433 QString text;
4434 QString title;
4435
4436 title = QString(_("Modpack suggests using %1 musicset."))
4438 text = QString("It might not work with other tilesets.\n"
4439 "You are currently using musicset %1.")
4440 .arg(music_set_name);
4441 ask->addButton(_("Keep current musicset"), QMessageBox::RejectRole);
4442 ask->addButton(_("Load musicset"), QMessageBox::AcceptRole);
4443 ask->set_text_title(text, title);
4444 ask->setAttribute(Qt::WA_DeleteOnClose);
4445 QObject::connect(ask, &hud_message_box::accepted, [=]() {
4447 });
4448 ask->show();
4449}
4450
4451/***********************************************************************/
4456{
4457 // PORTME
4458 return false;
4459}
4460
4461/***********************************************************************/
4465{
4467 int i;
4468
4469 nd_list = gui()->mapview_wdg->findChildren<notify_dialog *>();
4470 for (i = 0; i < nd_list.count(); i++) {
4471 nd_list[i]->restart();
4472 delete nd_list[i];
4473 }
4474}
4475
4476/***********************************************************************/
4481{
4482 int i;
4485 goto_dialog *gtd;
4486
4487 QApplication::alert(gui()->central_wdg);
4488 cd_list = gui()->game_tab_widget->findChildren <choice_dialog *>();
4489 for (i = 0; i < cd_list.count(); i++) {
4490 cd_list[i]->close();
4491 }
4492 nd_list = gui()->game_tab_widget->findChildren <notify_dialog *>();
4493 for (i = 0; i < nd_list.count(); i++) {
4494 nd_list[i]->close();
4495 }
4496
4505 gui()->popdown_unit_sel();
4506
4507 gtd = gui()->gtd;
4508
4509 if (gtd != nullptr) {
4510 gtd->close_dlg();
4511 }
4512}
4513
4514/***********************************************************************/
4520{
4521 choice_dialog *cd = gui()->get_diplo_dialog();
4522
4523 if (cd != NULL) {
4524 return cd->unit_id;
4525 } else {
4526 return IDENTITY_NUMBER_ZERO;
4527 }
4528}
4529
4530/***********************************************************************/
4537{
4538 choice_dialog *cd = gui()->get_diplo_dialog();
4539
4540 if (cd != NULL) {
4541 return cd->target_id[ATK_CITY];
4542 } else {
4543 return IDENTITY_NUMBER_ZERO;
4544 }
4545}
4546
4547/***********************************************************************/
4554{
4555 choice_dialog *cd = gui()->get_diplo_dialog();
4556
4557 if (cd != NULL) {
4558 return cd->target_id[ATK_TILE];
4559 } else {
4560 return TILE_INDEX_NONE;
4561 }
4562}
4563
4564/**********************************************************************/
4571{
4572 choice_dialog *cd = gui()->get_diplo_dialog();
4573
4574 if (cd != NULL) {
4575 return cd->sub_target_id[ASTK_EXTRA];
4576 } else {
4577 return EXTRA_NONE;
4578 }
4579}
4580
4581/***********************************************************************/
4588{
4589 choice_dialog *cd = gui()->get_diplo_dialog();
4590
4591 if (cd != NULL) {
4592 return cd->target_id[ATK_UNIT];
4593 } else {
4594 return IDENTITY_NUMBER_ZERO;
4595 }
4596}
4597
4598/***********************************************************************/
4602 struct city *target_city,
4603 struct unit *target_unit,
4604 struct tile *target_tile,
4605 struct extra_type *target_extra,
4606 const struct act_prob *act_probs)
4607{
4610 Choice_dialog_button *cancel_button;
4611 QVariant qv1, qv2;
4612
4613 asd = gui()->get_diplo_dialog();
4614 if (asd == NULL) {
4616 "The action selection dialog should have been open");
4617 return;
4618 }
4619
4622 "The action selection dialog is for another actor unit.");
4623 }
4624
4625 // Put the actor id in qv1.
4626 qv1 = actor_unit->id;
4627
4628 cancel_button = asd->get_identified_button(BUTTON_CANCEL);
4629 if (cancel_button != NULL) {
4630 /* Temporary remove the Cancel button so it won't end up above
4631 * any added buttons. */
4632 asd->stack_button(cancel_button);
4633 }
4634
4635 wait_button = asd->get_identified_button(BUTTON_WAIT);
4636 if (wait_button != NULL) {
4637 /* Temporary remove the Wait button so it won't end up above
4638 * any added buttons. */
4639 asd->stack_button(wait_button);
4640 }
4641
4642 action_iterate(act) {
4643 const char *custom;
4644
4645 if (action_id_get_actor_kind(act) != AAK_UNIT) {
4646 // Not relevant.
4647 continue;
4648 }
4649
4651 act_probs[act],
4652 actor_unit,
4653 target_city);
4654
4655 // Put the target id in qv2.
4656 switch (action_id_get_target_kind(act)) {
4657 case ATK_UNIT:
4658 if (target_unit != NULL) {
4659 qv2 = target_unit->id;
4660 } else {
4662 || target_unit != NULL,
4663 "Action enabled against non existing unit!");
4664
4666 }
4667 break;
4668 case ATK_CITY:
4669 if (target_city != NULL) {
4670 qv2 = target_city->id;
4671 } else {
4673 || target_city != NULL,
4674 "Action enabled against non existing city!");
4675
4677 }
4678 break;
4679 case ATK_TILE:
4680 case ATK_EXTRAS:
4681 case ATK_UNITS:
4682 if (target_tile != NULL) {
4684 } else {
4686 || target_tile != NULL,
4687 "Action enabled against all units on "
4688 "non existing tile!");
4689
4691 }
4692 break;
4693 case ATK_SELF:
4694 qv2 = actor_unit->id;
4695 break;
4696 case ATK_COUNT:
4698 "Bad target kind");
4699 continue;
4700 }
4701
4702 if (asd->get_identified_button(act)) {
4703 // Update the existing button.
4704 action_entry_update(asd->get_identified_button(act),
4705 act, act_probs, custom,
4706 qv1, qv2);
4707 } else {
4708 // Add the button (unless its probability is 0).
4710 qv1, qv2);
4711 }
4713
4714 if (wait_button != NULL || cancel_button != NULL) {
4715 /* Reinsert the non action buttons below any potential
4716 * buttons recently added. */
4717 asd->unstack_all_buttons();
4718 }
4719}
4720
4721/***********************************************************************/
4725{
4727
4728 cd = gui()->get_diplo_dialog();
4729 if (cd != NULL) {
4730 did_not_decide = true;
4731 cd->close();
4732 }
4733}
4734
4735/***********************************************************************/
4741
4742/***********************************************************************/
4745void show_tileset_error(bool fatal, const char *tset_name, const char *msg)
4746{
4747 QWidget *parent;
4748 fc_client *std_gui = gui();
4749
4750 if (std_gui != nullptr) {
4751 parent = std_gui->central_wdg;
4752 } else {
4753 parent = nullptr;
4754 }
4755
4756 if (std_gui != nullptr || fatal) {
4757 char buf[1024];
4758 QMessageBox *ask = new QMessageBox(parent);
4759
4760 if (tset_name != NULL) {
4761 fc_snprintf(buf, sizeof(buf),
4762 _("Tileset \"%s\" problem, it's probably incompatible with "
4763 "the ruleset:\n%s"), tset_name, msg);
4764 } else {
4765 fc_snprintf(buf, sizeof(buf),
4766 _("Tileset problem, it's probably incompatible with "
4767 "the ruleset:\n%s"), msg);
4768 }
4769
4770 ask->setText(buf);
4771 ask->setStandardButtons(QMessageBox::Ok);
4772 ask->setWindowTitle(_("Tileset error"));
4773
4774 if (std_gui != nullptr && !fatal) {
4775 ask->setAttribute(Qt::WA_DeleteOnClose);
4776 ask->show();
4777 } else {
4778 ask->exec();
4779 }
4780 }
4781}
4782
4783/***********************************************************************/
4786void popup_upgrade_dialog(struct unit_list *punits)
4787{
4788 char buf[512];
4790 QString title;
4792
4793 if (!punits || unit_list_size(punits) == 0) {
4794 return;
4795 }
4796
4797 ask = new hud_message_box(gui()->central_wdg);
4798
4799 punit_ids = new QVector<int>();
4801 punit_ids->push_back(punit->id);
4803
4804 if (!get_units_upgrade_info(buf, sizeof(buf), punits)) {
4805 title = _("Upgrade Unit!");
4806 ask->setStandardButtons(QMessageBox::Ok);
4807 } else {
4808 title = _("Upgrade Obsolete Units");
4809 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
4810 ask->setDefaultButton(QMessageBox::Cancel);
4811 }
4812 ask->set_text_title(buf, title);
4813 ask->setAttribute(Qt::WA_DeleteOnClose);
4814 QObject::connect(ask, &hud_message_box::accepted, [=]() {
4815 std::unique_ptr<QVector<int>> uptr(punit_ids);
4816 struct unit *punit;
4817
4818 for (int id : *uptr) {
4820 if (punit) {
4822 }
4823 }
4824 });
4825 ask->show();
4826}
4827
4828/***********************************************************************/
4832{
4833 QPoint p, final_p;
4834
4836 utile = ptile;
4837 pix = NULL;
4838 show_line = 0;
4839 highligh_num = -1;
4840 ufont.setItalic(true);
4842 update_units();
4843 h_pix = NULL;
4844 create_pixmap();
4845 p = mapFromGlobal(QCursor::pos());
4846 cw = new close_widget(this);
4847 setMouseTracking(true);
4848 final_p.setX(p.x());
4849 final_p.setY(p.y());
4850 if (p.x() + width() > parentWidget()->width()) {
4851 final_p.setX(parentWidget()->width() - width());
4852 }
4853 if (p.y() - height() < 0) {
4854 final_p.setY(height());
4855 }
4856 move(final_p.x(), final_p.y() - height());
4857 setFocus();
4858 /* Build fails with qt5 connect style for static functions
4859 * Qt5.2 so dont update */
4860 QTimer::singleShot(10, this, SLOT(update_img()));
4861}
4862
4863/***********************************************************************/
4867{
4868 delete h_pix;
4869 delete pix;
4870 delete cw;
4871}
4872
4873/***********************************************************************/
4877{
4878 int a;
4879 int x, y, i;
4882 QImage img;
4884 QPainter p;
4885 QPen pen;
4886 QPixmap pixc;
4887 QPixmap *pixp;
4889 QRect crop;
4890 struct canvas *unit_pixmap;
4891 struct unit *punit;
4892 float isosize;
4893
4894 if (pix != NULL) {
4895 delete pix;
4896 pix = NULL;
4897 };
4898 isosize = 0.7;
4900 isosize = 0.5;
4901 }
4902
4903 update_units();
4904 if (unit_list.count() > 0) {
4908 } else {
4911 }
4912 more = false;
4913 if (h_pix != nullptr) {
4914 delete h_pix;
4915 }
4916 h_pix = new QPixmap(item_size.width(), item_size.height());
4917 h_pix->fill(palette().color(QPalette::HighlightedText));
4918 if (unit_count < 5) {
4919 row_count = 1;
4920 pix = new QPixmap((unit_list.size()) * item_size.width(),
4921 item_size.height());
4922 } else if (unit_count < 9) {
4923 row_count = 2;
4924 pix = new QPixmap(4 * item_size.width(), 2 * item_size.height());
4925 } else {
4926 row_count = 3;
4927 if (unit_count > 12) {
4928 more = true;
4929 }
4930 pix = new QPixmap(4 * item_size.width(), 3 * item_size.height());
4931 }
4932 pix->fill(Qt::transparent);
4933 foreach(punit, unit_list) {
4936 unit_pixmap->map_pixmap.fill(Qt::transparent);
4937 put_unit(punit, unit_pixmap, 1.0, 0, 0);
4938 img = unit_pixmap->map_pixmap.toImage();
4940 cropped_img = img.copy(crop);
4944 Qt::KeepAspectRatio,
4945 Qt::SmoothTransformation);
4946 } else {
4949 Qt::KeepAspectRatio,
4950 Qt::SmoothTransformation);
4951 }
4952 pixc = QPixmap::fromImage(img);
4953 pixp = new QPixmap(pixc);
4954 pix_list.push_back(pixp);
4956 }
4957 a = qMin(item_size.width() / 4, 12);
4958 x = 0, y = -item_size.height(), i = -1;
4959 p.begin(pix);
4960 ufont.setPixelSize(a);
4961 p.setFont(ufont);
4962 pen.setColor(palette().color(QPalette::Text));
4963 p.setPen(pen);
4964
4965 while (!pix_list.isEmpty()) {
4966 tmp_pix = pix_list.takeFirst();
4967 i++;
4968 if (i % 4 == 0) {
4969 x = 0;
4970 y = y + item_size.height();
4971 }
4972 punit = unit_list.at(i);
4973 Q_ASSERT(punit != NULL);
4974
4975 if (i == highligh_num) {
4976 p.drawPixmap(x, y, *h_pix);
4977 p.drawPixmap(x, y, *tmp_pix);
4978 } else {
4979 p.drawPixmap(x, y, *tmp_pix);
4980 }
4981
4983 int rate, f;
4984 QString str;
4985
4987 f = ((punit->fuel) - 1);
4990 str = str + "(" + QString(move_points_text((rate * f)
4991 + punit->moves_left, false)) + ")";
4992 }
4993 // TRANS: MP = Movement points
4994 str = QString(_("MP:")) + str;
4995 p.drawText(x, y + item_size.height() - 4, str);
4996 }
4997
4998 x = x + item_size.width();
4999 delete tmp_pix;
5000 }
5001 p.end();
5002 setFixedWidth(pix->width() + 20);
5003 setFixedHeight(pix->height() + 2 * (fm.height() + 6));
5004 qDeleteAll(pix_list.begin(), pix_list.end());
5005 }
5006}
5007
5008/***********************************************************************/
5012{
5013 int a, b;
5014 int old_h;
5016 QPoint pos = event->pos();
5017 int x = pos.x();
5018 int y = pos.y();
5019
5021 highligh_num = -1;
5022 if (x > width() - 11
5023 || y > height() - fm.height() - 5
5024 || y < fm.height() + 3 || x < 11) {
5025 // Do nothing if mouse is on border, just skip next if
5026 } else if (row_count > 0) {
5027 a = (x - 10) / item_size.width();
5028 b = (y - fm.height() - 3) / item_size.height();
5029 highligh_num = b * 4 + a;
5030 }
5031 if (old_h != highligh_num) {
5032 create_pixmap();
5033 update();
5034 }
5035}
5036
5037/***********************************************************************/
5043{
5044 struct unit *punit;
5045 if (event->button() == Qt::RightButton) {
5046 was_destroyed = true;
5047 close();
5048 destroy();
5049 }
5050 if (event->button() == Qt::LeftButton && highligh_num != -1) {
5051 update_units();
5052 if (highligh_num >= unit_list.count()) {
5053 return;
5054 }
5057 was_destroyed = true;
5058 close();
5059 destroy();
5060 }
5061}
5062
5063/***********************************************************************/
5068{
5069 create_pixmap();
5070 update();
5071}
5072
5073/***********************************************************************/
5077{
5079 int h, i;
5080 int *f_size;
5081 QPen pen;
5082 QString str, str2;
5083 struct unit *punit;
5084 int point_size = info_font.pointSize();
5085 int pixel_size = info_font.pixelSize();
5086
5087 if (point_size < 0) {
5088 f_size = &pixel_size;
5089 } else {
5090 f_size = &point_size;
5091 }
5092 if (highligh_num != -1 && highligh_num < unit_list.count()) {
5093 struct astring addition = ASTRING_INIT;
5094
5097
5098 // TRANS: HP - hit points
5099 str2 = QString(_("%1 HP:%2/%3")).arg(QString(astr_str(&addition)),
5100 QString::number(punit->hp),
5101 QString::number(unit_type_get(punit)->hp));
5103 }
5104 str = QString(PL_("%1 unit", "%1 units",
5106 .arg(unit_list_size(utile->units));
5107 for (i = *f_size; i > 4; i--) {
5108 if (point_size < 0) {
5109 info_font.setPixelSize(i);
5110 } else {
5111 info_font.setPointSize(i);
5112 }
5114 if (10 + qfm.horizontalAdvance(str2) < width()) {
5115 break;
5116 }
5117 }
5118 h = fm.height();
5119 if (pix != NULL) {
5120 painter->drawPixmap(10, h + 3, *pix);
5121 pen.setColor(palette().color(QPalette::Text));
5122 painter->setPen(pen);
5123 painter->setFont(info_font);
5124 painter->drawText(10, h, str);
5125 if (highligh_num != -1 && highligh_num < unit_list.count()) {
5126 painter->drawText(10, height() - 5, str2);
5127 }
5128 // Draw scroll
5129 if (more) {
5130 int maxl = ((unit_count - 1) / 4) + 1;
5131 float page_height = 3.0f / maxl;
5132 float page_start = (static_cast<float>(show_line)) / maxl;
5133 pen.setColor(palette().color(QPalette::HighlightedText));
5134 painter->setBrush(palette().color(QPalette::HighlightedText).darker());
5135 painter->setPen(palette().color(QPalette::HighlightedText).darker());
5136 painter->drawRect(pix->width() + 10, h, 8, h + pix->height());
5137 painter->setPen(pen);
5138 painter->drawRoundedRect(pix->width() + 10,
5139 h + page_start * pix->height(),
5140 8, h + page_height * pix->height(), 2, 2);
5141 }
5142 }
5143 if (point_size < 0) {
5144 info_font.setPixelSize(*f_size);
5145 } else {
5146 info_font.setPointSize(*f_size);
5147 }
5148 cw->put_to_corner();
5149}
5150
5151/***********************************************************************/
5155{
5157
5158 painter.begin(this);
5159 paint(&painter, event);
5160 painter.end();
5161}
5162
5163/***********************************************************************/
5168{
5169 was_destroyed = true;
5170 close();
5171 destroy();
5172}
5173
5174/***********************************************************************/
5178{
5179 int i = 1;
5180 struct unit_list *punit_list;
5181
5182 unit_count = 0;
5183 if (utile == NULL) {
5184 struct unit *punit = head_of_units_in_focus();
5185 if (punit) {
5187 }
5188 }
5189 unit_list.clear();
5190 if (utile != nullptr) {
5192 if (punit_list != nullptr) {
5194 unit_count++;
5195 if (i > show_line * 4)
5196 unit_list.push_back(punit);
5197 i++;
5199 }
5200 }
5201 if (unit_list.count() == 0) {
5202 close();
5203 }
5204}
5205
5206/***********************************************************************/
5210{
5211 gui()->mapview_wdg->setFocus();
5212 QWidget::closeEvent(event);
5213}
5214
5215/***********************************************************************/
5219{
5220 int nr;
5221
5222 if (!more && utile == NULL) {
5223 return;
5224 }
5225 nr = qCeil(static_cast<qreal>(unit_list_size(utile->units)) / 4) - 3;
5226 if (event->angleDelta().y() < 0) {
5227 show_line++;
5229 } else {
5230 show_line--;
5231 show_line = qMax(0, show_line);
5232 }
5233 update_units();
5234 create_pixmap();
5235 update();
5236 event->accept();
5237}
5238
5239/***********************************************************************/
5243{
5244 if (event->key() == Qt::Key_Escape) {
5245 was_destroyed = true;
5246 close();
5247 destroy();
5248 }
5249 QWidget::keyPressEvent(event);
5250}
5251
5252/***********************************************************************/
5259
5260/***********************************************************************/
5267
5268/***********************************************************************/
5273{
5274 // Just tell the client common code to handle this.
5275 return false;
5276}
5277
5278/***********************************************************************/
5281bool qtg_request_transport(struct unit *pcargo, struct tile *ptile)
5282{
5283 int tcount;
5285 struct unit_list *potential_transports = unit_list_new();
5286#ifndef FREECIV_NDEBUG
5288#endif
5289
5293 }
5295
5297
5298 if (tcount == 0) {
5301
5302 return false; // Unit was not handled here.
5303 } else if (tcount == 1) {
5304 // There's exactly one potential transport - use it automatically
5307
5309
5310 return true;
5311 }
5312
5313 hul = new hud_unit_loader(pcargo, ptile);
5314 hul->show_me();
5315 return true;
5316}
5317
5318/***********************************************************************/
5322void qtg_popup_combat_info(int attacker_unit_id, int defender_unit_id,
5323 int attacker_hp, int defender_hp,
5324 bool make_att_veteran, bool make_def_veteran)
5325{
5326 if (gui()->qt_settings.show_battle_log) {
5327 hud_unit_combat *huc = new hud_unit_combat(attacker_unit_id,
5328 defender_unit_id,
5329 attacker_hp, defender_hp,
5330 make_att_veteran,
5331 make_def_veteran,
5332 gui()->battlelog_wdg->scale,
5333 gui()->battlelog_wdg);
5334
5335 gui()->battlelog_wdg->add_combat_info(huc);
5336 gui()->battlelog_wdg->show();
5337 }
5338}
5339
5340/**********************************************************************/
5344 struct act_confirmation_data *data)
5345{
5346 hud_message_box *ask = new hud_message_box(gui()->central_wdg);
5347
5348 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
5349 ask->setDefaultButton(QMessageBox::Cancel);
5350 ask->set_text_title(body, hdr);
5351 ask->setAttribute(Qt::WA_DeleteOnClose);
5352 QObject::connect(ask, &hud_message_box::accepted, [=]() {
5354 });
5355 QObject::connect(ask, &hud_message_box::rejected, [=]() {
5357 });
5358
5359 ask->show();
5360}
5361
5362/***********************************************************************/
5366 struct act_confirmation_data *data)
5367{
5369
5370 hdr = QString(_("Are you sure you want to do %1?")).
5372
5373 if (expl != NULL) {
5374 body_text += QString(expl);
5375 }
5376
5378}
5379
5380/**********************************************************************/
5383void qtg_popup_image(const char *tag)
5384{
5385 struct sprite *spr = load_popup_sprite(tag);
5386
5387 if (spr != nullptr) {
5388 QDialog *win = new QDialog(gui());
5389 QVBoxLayout *layout = new QVBoxLayout(win);
5390 QPixmap *pm = new QPixmap(*spr->pm);
5391 QLabel *lbl = new QLabel;
5392 int width, height;
5393
5395 win->setFixedSize(width, height);
5396 lbl->setPixmap(*pm);
5397 layout->addWidget(lbl);
5398 win->setLayout(layout);
5399
5400 win->show();
5401
5403 } else {
5404 log_error(_("No image for tag \"%s\", requested by the server."), tag);
5405 }
5406}
const char * action_prepare_ui_name(action_id act_id, const char *mnemonic, const struct act_prob prob, const char *custom)
Definition actions.c:2073
const char * action_id_name_translation(action_id act_id)
Definition actions.c:2011
bool action_prob_possible(const struct act_prob probability)
Definition actions.c:5821
static struct action * action_by_number(action_id act_id)
Definition actions.h:635
#define action_iterate_end
Definition actions.h:465
#define action_id_get_actor_kind(act_id)
Definition actions.h:648
#define action_iterate(_act_)
Definition actions.h:461
#define action_id_get_target_kind(act_id)
Definition actions.h:652
#define ACTION_NONE
Definition actions.h:311
void astr_free(struct astring *astr)
Definition astring.c:153
void astr_set(struct astring *astr, const char *format,...)
Definition astring.c:267
#define str
Definition astring.c:76
static const char * astr_str(const struct astring *astr) fc__attribute((nonnull(1)))
Definition astring.h:93
#define ASTRING_INIT
Definition astring.h:44
void audio_restart(const char *soundset_name, const char *musicset_name)
Definition audio.c:376
#define BV_CLR(bv, bit)
Definition bitvector.h:86
QRect zealous_crop_rect(QImage &p)
Definition canvas.cpp:419
void qtg_canvas_free(struct canvas *store)
Definition canvas.cpp:48
struct canvas * qtg_canvas_create(int width, int height)
Definition canvas.cpp:36
struct canvas int int struct sprite int int int int height
Definition canvas_g.h:44
struct canvas int int struct sprite int int int width
Definition canvas_g.h:44
void output_window_append(const struct ft_color color, const char *featured_text)
const char * city_improvement_name_translation(const struct city *pcity, const struct impr_type *pimprove)
Definition city.c:663
const char * city_name_get(const struct city *pcity)
Definition city.c:1137
#define INCITE_IMPOSSIBLE_COST
Definition city.h:96
#define city_owner(_pcity_)
Definition city.h:563
#define city_built_iterate(_pcity, _p)
Definition city.h:834
#define city_built_iterate_end
Definition city.h:840
void qtg_real_city_dialog_popup(struct city *pcity)
Definition citydlg.cpp:3822
Choice_dialog_button(const QString title, pfcn_void func_in, QVariant data1_in, QVariant data2_in)
Definition dialogs.cpp:1383
void setData2(QVariant wariat)
Definition dialogs.cpp:1431
void setData1(QVariant wariat)
Definition dialogs.cpp:1423
pfcn_void getFunc()
Definition dialogs.cpp:1397
void stack_button(Choice_dialog_button *button)
Definition dialogs.cpp:1757
void prev_unit()
Definition dialogs.cpp:1674
QVBoxLayout * layout
Definition dialogs.h:263
struct unit * targeted_unit
Definition dialogs.h:286
void unstack_all_buttons()
Definition dialogs.cpp:1774
Choice_dialog_button * get_identified_button(const int id)
Definition dialogs.cpp:1586
QPushButton * target_unit_button
Definition dialogs.h:262
void set_layout()
Definition dialogs.cpp:1492
void update_dialog(const struct act_prob *act_probs)
Definition dialogs.cpp:1703
QList< Choice_dialog_button * > last_buttons_stack
Definition dialogs.h:266
choice_dialog(const QString title, const QString text, QWidget *parent=NULL, void(*run_on_close_in)(int)=NULL)
Definition dialogs.cpp:1439
void next_unit()
Definition dialogs.cpp:1634
QVBoxLayout * get_layout()
Definition dialogs.cpp:1578
QHBoxLayout * unit_skip
Definition dialogs.h:264
QList< Choice_dialog_button * > buttons_list
Definition dialogs.h:265
void(* run_on_close)(int)
Definition dialogs.h:268
int target_id[ATK_COUNT]
Definition dialogs.h:284
void switch_target()
Definition dialogs.cpp:1721
QList< Choice_dialog_button * > action_button_map
Definition dialogs.h:267
int sub_target_id[ASTK_COUNT]
Definition dialogs.h:285
void execute_action(const int action)
Definition dialogs.cpp:1740
void add_item(QString title, pfcn_void func, QVariant data1, QVariant data2, QString tool_tip, const int button_id)
Definition dialogs.cpp:1534
void put_to_corner()
Definition mapview.cpp:502
void disband_clicked()
Definition dialogs.cpp:4344
disband_box(struct unit_list *punits, QWidget *parent=0)
Definition dialogs.cpp:4318
struct unit_list * cpunits
Definition dialogs.h:97
choice_dialog * opened_dialog
Definition fc_client.h:219
choice_dialog * get_diplo_dialog()
Definition dialogs.cpp:5263
void set_diplo_dialog(choice_dialog *widget)
Definition dialogs.cpp:5255
static fc_font * instance()
Definition fonts.cpp:41
QFont * get_font(QString name)
Definition fonts.cpp:63
QPixmap * get_pixmap(const QString &id)
static fc_icons * instance()
bool was_destroyed
Definition mapview.h:176
void close_dlg()
Definition gotodlg.cpp:496
int set_text_title(QString s1, QString s2, bool return_exec=false)
QString qheadline
Definition dialogs.h:193
void restart()
Definition dialogs.cpp:957
close_widget * cw
Definition dialogs.h:189
void mouseReleaseEvent(QMouseEvent *event)
Definition dialogs.cpp:1050
QFont small_font
Definition dialogs.h:195
QString qcaption
Definition dialogs.h:192
notify_dialog(const char *caption, const char *headline, const char *lines, QWidget *parent=0)
Definition dialogs.cpp:924
void calc_size(int &x, int &y)
Definition dialogs.cpp:985
void paintEvent(QPaintEvent *paint_event)
Definition dialogs.cpp:1004
QPoint cursor
Definition dialogs.h:196
void mouseMoveEvent(QMouseEvent *event)
Definition dialogs.cpp:1040
virtual void update_menu()
Definition dialogs.cpp:1058
void mousePressEvent(QMouseEvent *event)
Definition dialogs.cpp:1027
QStringList qlist
Definition dialogs.h:194
QPushButton * close_but
Definition dialogs.h:113
notify_goto(const char *headline, const char *lines, const struct text_tag_list *tags, struct tile *ptile, QWidget *parent)
Definition dialogs.cpp:1159
QPushButton * goto_but
Definition dialogs.h:111
void inspect_city()
Definition dialogs.cpp:1202
struct tile * gtile
Definition dialogs.h:114
QPushButton * inspect_but
Definition dialogs.h:112
void goto_tile()
Definition dialogs.cpp:1193
action_id vs_unit
Definition dialogs.h:60
static qdef_act * action()
Definition dialogs.cpp:1087
action_id vs_city_get()
Definition dialogs.cpp:1125
static qdef_act * m_instance
Definition dialogs.h:58
static void drop()
Definition dialogs.cpp:1098
action_id vs_city
Definition dialogs.h:59
void vs_city_set(int i)
Definition dialogs.cpp:1109
void vs_unit_set(int i)
Definition dialogs.cpp:1117
action_id vs_unit_get()
Definition dialogs.cpp:1133
QPoint point
Definition dialogs.h:81
void paintEvent(QPaintEvent *event)
Definition dialogs.cpp:400
QPixmap close_pix
Definition dialogs.h:83
void reactivate()
Definition dialogs.cpp:392
void mouseMoveEvent(QMouseEvent *event)
Definition dialogs.cpp:441
int titlebar_height
Definition dialogs.h:80
void mousePressEvent(QMouseEvent *event)
Definition dialogs.cpp:451
void mouseReleaseEvent(QMouseEvent *event)
Definition dialogs.cpp:471
qfc_dialog(QWidget *parent)
Definition dialogs.cpp:380
bool moving_now
Definition dialogs.h:82
int selected_style
Definition dialogs.h:164
QComboBox * leader_name
Definition dialogs.h:135
void random_pressed()
Definition dialogs.cpp:1149
int last_index
Definition dialogs.h:166
QTableWidget * selected_nation_tabs
Definition dialogs.h:134
QPushButton * random_button
Definition dialogs.h:143
void refresh()
Definition dialogs.cpp:660
void style_selected(const QItemSelection &selected)
Definition dialogs.cpp:853
void nationset_changed(int index)
Definition dialogs.cpp:1214
int selected_nation
Definition dialogs.h:163
void ok_pressed()
Definition dialogs.cpp:886
void leader_selected(int index)
Definition dialogs.cpp:871
QPushButton * ok_button
Definition dialogs.h:142
QTextEdit * description
Definition dialogs.h:141
void set_index(int index)
Definition dialogs.cpp:743
QComboBox * qnation_set
Definition dialogs.h:136
QRadioButton * is_male
Definition dialogs.h:138
QButtonGroup * sex_buttons
Definition dialogs.h:137
void update_nationset_combo()
Definition dialogs.cpp:710
QTableWidget * styles
Definition dialogs.h:140
void group_selected(const QItemSelection &selected)
Definition dialogs.cpp:726
struct player * tplayer
Definition dialogs.h:165
races_dialog(struct player *pplayer, QWidget *parent=0)
Definition dialogs.cpp:480
QRadioButton * is_female
Definition dialogs.h:139
QTableWidget * nation_tabs
Definition dialogs.h:132
QGridLayout * main_layout
Definition dialogs.h:131
void nation_selected(const QItemSelection &selected)
Definition dialogs.cpp:803
void cancel_pressed()
Definition dialogs.cpp:1141
QPixmap * h_pix
Definition dialogs.h:206
QFont ufont
Definition dialogs.h:210
QFont info_font
Definition dialogs.h:211
void closeEvent(QCloseEvent *event)
Definition dialogs.cpp:5209
void update_img()
Definition dialogs.cpp:5067
int show_line
Definition dialogs.h:233
void mouseMoveEvent(QMouseEvent *event)
Definition dialogs.cpp:5011
int highligh_num
Definition dialogs.h:234
void paint(QPainter *painter, QPaintEvent *event)
Definition dialogs.cpp:5076
void update_menu()
Definition dialogs.cpp:5167
QPixmap * pix
Definition dialogs.h:205
int row_count
Definition dialogs.h:212
QList< unit * > unit_list
Definition dialogs.h:208
units_select(struct tile *ptile, QWidget *parent)
Definition dialogs.cpp:4831
void update_units()
Definition dialogs.cpp:5177
tile * utile
Definition dialogs.h:220
int unit_count
Definition dialogs.h:235
QSize item_size
Definition dialogs.h:207
void paintEvent(QPaintEvent *event)
Definition dialogs.cpp:5154
void create_pixmap()
Definition dialogs.cpp:4876
void wheelEvent(QWheelEvent *event)
Definition dialogs.cpp:5218
void keyPressEvent(QKeyEvent *event)
Definition dialogs.cpp:5242
void mousePressEvent(QMouseEvent *event)
Definition dialogs.cpp:5042
close_widget * cw
Definition dialogs.h:213
char music_set_name[512]
bool client_is_global_observer(void)
struct civclient client
enum client_states client_state(void)
char sound_set_name[512]
#define client_player()
@ C_S_RUNNING
Definition client_main.h:47
void client_unit_init_act_prob_cache(struct unit *punit)
Definition climisc.c:1258
char * incite_cost
Definition comments.c:75
void action_selection_no_longer_in_progress(const int old_actor_id)
Definition control.c:1063
void request_unit_load(struct unit *pcargo, struct unit *ptrans, struct tile *ptile)
Definition control.c:2168
void unit_focus_set(struct unit *punit)
Definition control.c:518
void request_do_action(action_id action, int actor_id, int target_id, int sub_tgt, const char *name)
Definition control.c:1742
void request_unit_disband(struct unit *punit)
Definition control.c:2087
void request_action_details(action_id action, int actor_id, int target_id)
Definition control.c:1810
void request_new_unit_activity_targeted(struct unit *punit, enum unit_activity act, struct extra_type *tgt)
Definition control.c:1950
void action_confirmation(struct act_confirmation_data *data, bool confirm)
Definition control.c:1778
void action_decision_clear_want(const int old_actor_id)
Definition control.c:1092
void key_unit_wait(void)
Definition control.c:3554
struct unit * head_of_units_in_focus(void)
Definition control.c:410
void request_unit_upgrade(struct unit *punit)
Definition control.c:2118
void action_selection_next_in_focus(const int old_actor_id)
Definition control.c:1104
bool qtg_handmade_scenario_warning()
Definition dialogs.cpp:5272
static void attack(QVariant data1, QVariant data2)
Definition dialogs.cpp:3251
static void wipe_units(QVariant data1, QVariant data2)
Definition dialogs.cpp:2948
char forced_tileset_name[512]
static void bombard4(QVariant data1, QVariant data2)
Definition dialogs.cpp:3020
int action_selection_target_extra(void)
Definition dialogs.cpp:4570
static void suicide_attack2(QVariant data1, QVariant data2)
Definition dialogs.cpp:3296
static void destroy_city(QVariant data1, QVariant data2)
Definition dialogs.cpp:3763
static void spy_sabotage_unit(QVariant data1, QVariant data2)
Definition dialogs.cpp:2554
static void pillage(QVariant data1, QVariant data2)
Definition dialogs.cpp:3112
static void caravan_marketplace(QVariant data1, QVariant data2)
Definition dialogs.cpp:1788
static void clean(QVariant data1, QVariant data2)
Definition dialogs.cpp:3132
static void spy_steal_shared(QVariant data1, QVariant data2, action_id act_id)
Definition dialogs.cpp:3506
static void spy_sabotage(QVariant data1, QVariant data2)
Definition dialogs.cpp:4184
int action_selection_target_tile(void)
Definition dialogs.cpp:4553
static void teleport_enter(QVariant data1, QVariant data2)
Definition dialogs.cpp:3446
static void conquer_extras3(QVariant data1, QVariant data2)
Definition dialogs.cpp:1987
static void spy_investigate(QVariant data1, QVariant data2)
Definition dialogs.cpp:3883
static void act_sel_wait(QVariant data1, QVariant data2)
Definition dialogs.cpp:2015
static void nuke_units(QVariant data1, QVariant data2)
Definition dialogs.cpp:2912
int action_selection_actor_unit(void)
Definition dialogs.cpp:4519
static void capture_units(QVariant data1, QVariant data2)
Definition dialogs.cpp:2960
static void road(QVariant data1, QVariant data2)
Definition dialogs.cpp:3152
static bool is_race_dialog_open
Definition dialogs.cpp:214
static void transport_embark4(QVariant data1, QVariant data2)
Definition dialogs.cpp:2666
bool try_default_unit_action(QVariant q1, QVariant q2)
Definition dialogs.cpp:1599
static void fortify(QVariant data1, QVariant data2)
Definition dialogs.cpp:2496
static void teleport_frighten(QVariant data1, QVariant data2)
Definition dialogs.cpp:3386
static void transport_board(QVariant data1, QVariant data2)
Definition dialogs.cpp:2600
static void spy_sabotage_unit_esc(QVariant data1, QVariant data2)
Definition dialogs.cpp:2566
static void disband_unit(QVariant data1, QVariant data2)
Definition dialogs.cpp:2484
static void spy_steal_gold(QVariant data1, QVariant data2)
Definition dialogs.cpp:3778
void popdown_players_report()
Definition plrdlg.cpp:1193
static void spy_escape(QVariant data1, QVariant data2)
Definition dialogs.cpp:3838
static void mine(QVariant data1, QVariant data2)
Definition dialogs.cpp:3194
void popup_musicset_suggestion_dialog(void)
Definition dialogs.cpp:4430
static void spy_steal_gold_esc(QVariant data1, QVariant data2)
Definition dialogs.cpp:3793
static void diplomat_embassy(QVariant data1, QVariant data2)
Definition dialogs.cpp:3868
void unit_select_dialog_popup(struct tile *ptile)
Definition dialogs.cpp:1299
void popup_upgrade_dialog(struct unit_list *punits)
Definition dialogs.cpp:4786
void update_nationset_combo()
Definition dialogs.cpp:1319
void action_selection_close(void)
Definition dialogs.cpp:4724
static void cultivate(QVariant data1, QVariant data2)
Definition dialogs.cpp:3082
static void paradrop_enter(QVariant data1, QVariant data2)
Definition dialogs.cpp:3431
void races_update_pickable(bool nationset_change)
Definition dialogs.cpp:1329
int action_selection_target_city(void)
Definition dialogs.cpp:4536
static void spy_steal_something(QVariant data1, QVariant data2)
Definition dialogs.cpp:3596
#define BUTTON_WAIT
Definition dialogs.cpp:71
void popup_notify_goto_dialog(const char *headline, const char *lines, const struct text_tag_list *tags, struct tile *ptile)
Definition dialogs.cpp:1237
static void spy_poison(QVariant data1, QVariant data2)
Definition dialogs.cpp:3673
static void transport_board2(QVariant data1, QVariant data2)
Definition dialogs.cpp:2611
void show_tech_gained_dialog(Tech_type_id tech)
Definition dialogs.cpp:4738
static void base(QVariant data1, QVariant data2)
Definition dialogs.cpp:3173
static void spy_nuke_city_esc(QVariant data1, QVariant data2)
Definition dialogs.cpp:3733
static void teleport(QVariant data1, QVariant data2)
Definition dialogs.cpp:3326
void popup_soundset_suggestion_dialog(void)
Definition dialogs.cpp:4405
static void enter_hut2(QVariant data1, QVariant data2)
Definition dialogs.cpp:2807
void popup_races_dialog(struct player *pplayer)
Definition dialogs.cpp:1274
static void expel_unit(QVariant data1, QVariant data2)
Definition dialogs.cpp:2972
static void paradrop_frighten(QVariant data1, QVariant data2)
Definition dialogs.cpp:3371
static void diplomat_sabotage(QVariant data1, QVariant data2)
Definition dialogs.cpp:3913
void popup_disband_dialog(struct unit_list *punits)
Definition dialogs.cpp:4364
static action_id get_non_targeted_action_id(action_id tgt_action_id)
Definition dialogs.cpp:2379
static void homeless(QVariant data1, QVariant data2)
Definition dialogs.cpp:2522
static void caravan_help_build(QVariant data1, QVariant data2)
Definition dialogs.cpp:1818
void qtg_popup_image(const char *tag)
Definition dialogs.cpp:5383
static void bombard(QVariant data1, QVariant data2)
Definition dialogs.cpp:2984
void popdown_races_dialog(void)
Definition dialogs.cpp:1288
void popup_tileset_suggestion_dialog(void)
Definition dialogs.cpp:4374
static void conquer_city(QVariant data1, QVariant data2)
Definition dialogs.cpp:1899
void revolution_response(struct government *gov)
Definition dialogs.cpp:2030
void popdown_economy_report()
static void join_city(QVariant data1, QVariant data2)
Definition dialogs.cpp:3491
static void spy_request_sabotage_list(QVariant data1, QVariant data2)
Definition dialogs.cpp:3636
static void diplomat_bribe(QVariant data1, QVariant data2)
Definition dialogs.cpp:2536
static void popup_act_confirmation_dialog(QString hdr, QString body, struct act_confirmation_data *data)
Definition dialogs.cpp:5343
static void unit_disband_recover(QVariant data1, QVariant data2)
Definition dialogs.cpp:1833
static void spy_steal(QVariant data1, QVariant data2)
Definition dialogs.cpp:3580
static void conquer_extras4(QVariant data1, QVariant data2)
Definition dialogs.cpp:2001
static void frighten_hut4(QVariant data1, QVariant data2)
Definition dialogs.cpp:2897
static void airlift(QVariant data1, QVariant data2)
Definition dialogs.cpp:1884
void popup_pillage_dialog(struct unit *punit, bv_extras extras)
Definition dialogs.cpp:4285
void popup_sabotage_dialog(struct unit *actor, struct city *tcity, const struct action *paction)
Definition dialogs.cpp:4214
static void enter_hut3(QVariant data1, QVariant data2)
Definition dialogs.cpp:2822
static void transport_load3(QVariant data1, QVariant data2)
Definition dialogs.cpp:2710
static void spy_attack(QVariant data1, QVariant data2)
Definition dialogs.cpp:2936
static void bombard_lethal(QVariant data1, QVariant data2)
Definition dialogs.cpp:3032
static void plant(QVariant data1, QVariant data2)
Definition dialogs.cpp:3097
static void nuke(QVariant data1, QVariant data2)
Definition dialogs.cpp:3236
static void disembark2(QVariant data1, QVariant data2)
Definition dialogs.cpp:2747
static void transport_unload(QVariant data1, QVariant data2)
Definition dialogs.cpp:2677
void qtg_request_action_confirmation(const char *expl, struct act_confirmation_data *data)
Definition dialogs.cpp:5365
static void teleport_conquer(QVariant data1, QVariant data2)
Definition dialogs.cpp:3356
void action_selection_refresh(struct unit *actor_unit, struct city *target_city, struct unit *target_unit, struct tile *target_tile, struct extra_type *target_extra, const struct act_prob *act_probs)
Definition dialogs.cpp:4601
void popdown_science_report()
static void transport_load2(QVariant data1, QVariant data2)
Definition dialogs.cpp:2699
static void diplomat_steal(QVariant data1, QVariant data2)
Definition dialogs.cpp:3943
static void unit_upgrade(QVariant data1, QVariant data2)
Definition dialogs.cpp:1863
bool popup_theme_suggestion_dialog(const char *theme_name)
Definition dialogs.cpp:4455
static void conquer_city4(QVariant data1, QVariant data2)
Definition dialogs.cpp:1944
static void enter_hut(QVariant data1, QVariant data2)
Definition dialogs.cpp:2792
static void spy_request_strike_bld_list(QVariant data1, QVariant data2)
Definition dialogs.cpp:3619
static void diplomat_incite_escape(QVariant data1, QVariant data2)
Definition dialogs.cpp:3991
static void found_city(QVariant data1, QVariant data2)
Definition dialogs.cpp:3056
static void diplomat_investigate(QVariant data1, QVariant data2)
Definition dialogs.cpp:3898
void qtg_popup_combat_info(int attacker_unit_id, int defender_unit_id, int attacker_hp, int defender_hp, bool make_att_veteran, bool make_def_veteran)
Definition dialogs.cpp:5322
static void bombard3(QVariant data1, QVariant data2)
Definition dialogs.cpp:3008
static void transport_deboard(QVariant data1, QVariant data2)
Definition dialogs.cpp:2721
static void diplomat_incite(QVariant data1, QVariant data2)
Definition dialogs.cpp:3973
static void paradrop_conquer(QVariant data1, QVariant data2)
Definition dialogs.cpp:3341
void popdown_endgame_report()
static void diplomat_steal_esc(QVariant data1, QVariant data2)
Definition dialogs.cpp:3958
static void bombard_lethal2(QVariant data1, QVariant data2)
Definition dialogs.cpp:3044
static void frighten_hut3(QVariant data1, QVariant data2)
Definition dialogs.cpp:2882
static bool is_more_user_input_needed
Definition dialogs.cpp:219
static void bombard2(QVariant data1, QVariant data2)
Definition dialogs.cpp:2996
void popup_incite_dialog(struct unit *actor, struct city *tcity, int cost, const struct action *paction)
Definition dialogs.cpp:4055
static const QHash< action_id, pfcn_void > af_map_init(void)
Definition dialogs.cpp:232
void popdown_all_spaceships_dialogs()
static void nuke_city(QVariant data1, QVariant data2)
Definition dialogs.cpp:3748
void popup_connect_msg(const char *headline, const char *message)
Definition dialogs.cpp:1249
static void diplomat_sabotage_esc(QVariant data1, QVariant data2)
Definition dialogs.cpp:3928
void popdown_units_report()
static void transport_embark2(QVariant data1, QVariant data2)
Definition dialogs.cpp:2644
static void spy_nuke_city(QVariant data1, QVariant data2)
Definition dialogs.cpp:3718
static void teleport_frighten_conquer(QVariant data1, QVariant data2)
Definition dialogs.cpp:3416
void unit_select_dialog_update_real(void *unused)
Definition dialogs.cpp:1311
static void spy_steal_esc(QVariant data1, QVariant data2)
Definition dialogs.cpp:3588
static void paradrop(QVariant data1, QVariant data2)
Definition dialogs.cpp:3311
static void suicide_attack(QVariant data1, QVariant data2)
Definition dialogs.cpp:3281
void races_toggles_set_sensitive(void)
Definition dialogs.cpp:1340
static void transport_load(QVariant data1, QVariant data2)
Definition dialogs.cpp:2688
static action_id get_production_targeted_action_id(action_id tgt_action_id)
Definition dialogs.cpp:2402
static void paradrop_frighten_conquer(QVariant data1, QVariant data2)
Definition dialogs.cpp:3401
static void convert_unit(QVariant data1, QVariant data2)
Definition dialogs.cpp:2510
static bool did_not_decide
Definition dialogs.cpp:223
static void spy_poison_esc(QVariant data1, QVariant data2)
Definition dialogs.cpp:3688
static void pillage_something(QVariant data1, QVariant data2)
Definition dialogs.cpp:4164
static void spy_request_sabotage_esc_list(QVariant data1, QVariant data2)
Definition dialogs.cpp:3654
static void transform_terrain(QVariant data1, QVariant data2)
Definition dialogs.cpp:3067
static void attack2(QVariant data1, QVariant data2)
Definition dialogs.cpp:3266
#define BUTTON_CANCEL
Definition dialogs.cpp:72
static void conquer_extras(QVariant data1, QVariant data2)
Definition dialogs.cpp:1959
static void regular_move(QVariant data1, QVariant data2)
Definition dialogs.cpp:4009
static void heal_unit2(QVariant data1, QVariant data2)
Definition dialogs.cpp:2589
static void transport_board3(QVariant data1, QVariant data2)
Definition dialogs.cpp:2622
static void spy_embassy(QVariant data1, QVariant data2)
Definition dialogs.cpp:3853
static races_dialog * race_dialog
Definition dialogs.cpp:213
static void frighten_hut2(QVariant data1, QVariant data2)
Definition dialogs.cpp:2867
static void conquer_city2(QVariant data1, QVariant data2)
Definition dialogs.cpp:1914
static void conquer_extras2(QVariant data1, QVariant data2)
Definition dialogs.cpp:1973
static void regular_move2(QVariant data1, QVariant data2)
Definition dialogs.cpp:4024
static void frighten_hut(QVariant data1, QVariant data2)
Definition dialogs.cpp:2852
bool qtg_request_transport(struct unit *pcargo, struct tile *ptile)
Definition dialogs.cpp:5281
static void disembark4(QVariant data1, QVariant data2)
Definition dialogs.cpp:2777
int action_selection_target_unit(void)
Definition dialogs.cpp:4587
static void irrigate(QVariant data1, QVariant data2)
Definition dialogs.cpp:3215
static void transport_embark3(QVariant data1, QVariant data2)
Definition dialogs.cpp:2655
static void collect_ransom(QVariant data1, QVariant data2)
Definition dialogs.cpp:2924
static void heal_unit(QVariant data1, QVariant data2)
Definition dialogs.cpp:2578
void popdown_city_report()
Definition cityrep.cpp:1338
static void teleport_enter_conquer(QVariant data1, QVariant data2)
Definition dialogs.cpp:3476
static void regular_move3(QVariant data1, QVariant data2)
Definition dialogs.cpp:4039
static void paradrop_enter_conquer(QVariant data1, QVariant data2)
Definition dialogs.cpp:3461
static void unit_home_city(QVariant data1, QVariant data2)
Definition dialogs.cpp:1848
static void transport_embark(QVariant data1, QVariant data2)
Definition dialogs.cpp:2633
bool try_default_city_action(QVariant q1, QVariant q2)
Definition dialogs.cpp:1617
static void keep_moving(QVariant data1, QVariant data2)
Definition dialogs.cpp:2023
static void spy_steal_maps_esc(QVariant data1, QVariant data2)
Definition dialogs.cpp:3823
static void action_entry_update(Choice_dialog_button *button, action_id act, const struct act_prob *act_probs, const char *custom, QVariant data1, QVariant data2)
Definition dialogs.cpp:2455
static void disembark1(QVariant data1, QVariant data2)
Definition dialogs.cpp:2732
void restart_notify_dialogs()
Definition dialogs.cpp:4464
static void disembark3(QVariant data1, QVariant data2)
Definition dialogs.cpp:2762
static void conquer_city3(QVariant data1, QVariant data2)
Definition dialogs.cpp:1929
static bool is_showing_pillage_dialog
Definition dialogs.cpp:212
static void spy_spread_plague(QVariant data1, QVariant data2)
Definition dialogs.cpp:3703
static void action_entry(choice_dialog *cd, action_id act, const struct act_prob *act_probs, const char *custom, QVariant data1, QVariant data2)
Definition dialogs.cpp:2422
static const QHash< action_id, pfcn_void > af_map
Definition dialogs.cpp:375
static void enter_hut4(QVariant data1, QVariant data2)
Definition dialogs.cpp:2837
static void caravan_establish_trade(QVariant data1, QVariant data2)
Definition dialogs.cpp:1803
void popdown_all_game_dialogs(void)
Definition dialogs.cpp:4480
static void spy_steal_maps(QVariant data1, QVariant data2)
Definition dialogs.cpp:3808
struct unit struct city struct unit * target_unit
Definition dialogs_g.h:55
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id struct unit struct unit int const struct action *paction show_tileset_error
Definition dialogs_g.h:84
popup_action_selection
Definition dialogs_g.h:54
struct unit * actor_unit
Definition dialogs_g.h:54
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id popup_bribe_dialog
Definition dialogs_g.h:72
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id struct unit * actor
Definition dialogs_g.h:72
const char * caption
Definition dialogs_g.h:36
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs action_selection_no_longer_in_progress_gui_specific
Definition dialogs_g.h:68
const char const char * headline
Definition dialogs_g.h:37
popup_notify_dialog
Definition dialogs_g.h:36
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id struct unit struct unit int const struct action *paction bool fatal
Definition dialogs_g.h:85
struct unit struct city struct unit struct tile * target_tile
Definition dialogs_g.h:56
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id struct unit struct unit * punit
Definition dialogs_g.h:73
struct unit struct city * target_city
Definition dialogs_g.h:55
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id struct unit struct unit int cost
Definition dialogs_g.h:73
struct unit struct city struct unit struct tile struct extra_type * target_extra
Definition dialogs_g.h:56
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id struct unit struct unit int const struct action *paction bool const char * tset_name
Definition dialogs_g.h:85
int int id
Definition editgui_g.h:28
enum event_type event
Definition events.c:81
int extra_number(const struct extra_type *pextra)
Definition extras.c:161
struct extra_type * extra_by_number(int id)
Definition extras.c:183
static struct extra_type extras[MAX_EXTRA_TYPES]
Definition extras.c:31
const char * extra_name_translation(const struct extra_type *pextra)
Definition extras.c:194
#define extra_index(_e_)
Definition extras.h:183
#define EXTRA_NONE
Definition extras.h:85
int Tech_type_id
Definition fc_types.h:377
int action_id
Definition fc_types.h:389
int Government_type_id
Definition fc_types.h:381
#define IDENTITY_NUMBER_ZERO
Definition fc_types.h:92
#define PL_(String1, String2, n)
Definition fcintl.h:71
#define _(String)
Definition fcintl.h:67
const struct ft_color ftc_client
struct civ_game game
Definition game.c:62
struct world wld
Definition game.c:63
struct unit * game_unit_by_number(int id)
Definition game.c:116
struct city * game_city_by_number(int id)
Definition game.c:107
struct government * government_by_number(const Government_type_id gov)
Definition government.c:103
Government_type_id government_number(const struct government *pgovern)
Definition government.c:91
#define G_LAST
Definition government.h:48
int action_selection_target_extra(void)
static int actor_unit_id
static void diplomat_queue_handle_primary(void)
static void diplomat_queue_handle_secondary(void)
#define BUTTON_COUNT
void action_selection_refresh(struct unit *actor_unit, struct city *target_city, struct unit *target_unit, struct tile *target_tile, struct extra_type *target_extra, const struct act_prob *act_probs)
static PangoLayout * layout
Definition canvas.c:325
static struct tile * pos
Definition finddlg.c:53
void popdown_help_dialog(void)
Definition helpdlg.c:187
const char * title
Definition repodlgs.c:1314
void(* pfcn_void)(QVariant, QVariant)
Definition dialogs.h:46
#define mevent_gpos(__ev__)
Definition gui_main.h:23
#define CAPTURE_DEFAULT_THIS
Definition gui_main.h:31
void nationset_changed(void)
Definition dialogs.c:3565
#define show(id)
Definition widget.h:235
void popup_revolution_dialog(void)
Definition dialogs.c:112
void helptext_nation(char *buf, size_t bufsz, struct nation_type *pnation, const char *user_text)
Definition helpdata.c:5097
Impr_type_id improvement_number(const struct impr_type *pimprove)
#define B_LAST
Definition improvement.h:42
get_token_fn_t func
Definition inputfile.c:128
#define fc_assert_msg(condition, message,...)
Definition log.h:181
#define fc_assert(condition)
Definition log.h:176
#define fc_assert_action(condition, action)
Definition log.h:187
@ LOG_ERROR
Definition log.h:30
#define log_error(message,...)
Definition log.h:103
struct tile * index_to_tile(const struct civ_map *imap, int mindex)
Definition map.c:456
void put_unit(const struct unit *punit, struct canvas *pcanvas, float zoom, int canvas_x, int canvas_y)
void center_tile_mapcanvas(const struct tile *ptile)
static const void * body(MD5_CTX *ctx, const void *data, unsigned long size)
Definition md5.c:121
#define FC_FREE(ptr)
Definition mem.h:41
const char * move_points_text(int mp, bool reduce)
Definition movement.c:1047
static mpgui * gui
Definition mpgui_qt.cpp:52
const char *const notify_label
Definition fonts.h:28
Nation_type_id nation_number(const struct nation_type *pnation)
Definition nation.c:486
bool nation_leader_is_male(const struct nation_leader *pleader)
Definition nation.c:290
const char * nation_adjective_for_player(const struct player *pplayer)
Definition nation.c:169
const char * nation_adjective_translation(const struct nation_type *pnation)
Definition nation.c:149
struct nation_type * nation_by_number(const Nation_type_id nation)
Definition nation.c:475
int nation_set_index(const struct nation_set *pset)
Definition nation.c:699
bool is_nation_pickable(const struct nation_type *nation)
Definition nation.c:188
const struct nation_leader_list * nation_leaders(const struct nation_type *pnation)
Definition nation.c:230
const char * nation_set_name_translation(const struct nation_set *pset)
Definition nation.c:818
bool is_nation_playable(const struct nation_type *nation)
Definition nation.c:200
bool nation_is_in_group(const struct nation_type *pnation, const struct nation_group *pgroup)
Definition nation.c:1099
const char * nation_set_description(const struct nation_set *pset)
Definition nation.c:828
const char * nation_group_name_translation(const struct nation_group *pgroup)
Definition nation.c:1090
int nation_set_count(void)
Definition nation.c:691
struct nation_group * nation_group_by_number(int id)
Definition nation.c:1004
struct nation_set * nation_set_by_rule_name(const char *name)
Definition nation.c:779
bool is_nation_group_hidden(struct nation_group *pgroup)
Definition nation.c:1057
struct nation_set * nation_set_by_setting_value(const char *setting)
Definition nation.c:859
const char * nation_leader_name(const struct nation_leader *pleader)
Definition nation.c:281
int nation_group_count(void)
Definition nation.c:935
const char * nation_set_rule_name(const struct nation_set *pset)
Definition nation.c:807
struct nation_style * style_of_nation(const struct nation_type *pnation)
Definition nation.c:672
#define nation_leader_list_iterate(leaderlist, pleader)
Definition nation.h:57
#define nation_sets_iterate_end
Definition nation.h:305
#define nation_sets_iterate(NAME_pset)
Definition nation.h:301
#define nations_iterate_end
Definition nation.h:336
#define nations_iterate(NAME_pnation)
Definition nation.h:333
#define nation_leader_list_iterate_end
Definition nation.h:59
const struct option_set * server_optset
Definition options.c:4020
bool option_str_set(struct option *poption, const char *str)
Definition options.c:930
const char * option_str_get(const struct option *poption)
Definition options.c:897
struct option * optset_option_by_name(const struct option_set *poptset, const char *name)
Definition options.c:435
#define REQEST_PLAYER_INITIATED
Definition packets.h:63
int dsend_packet_unit_get_actions(struct connection *pc, int actor_unit_id, int target_unit_id, int target_tile_id, int target_extra_id, int request_kind)
int dsend_packet_nation_select_req(struct connection *pc, int player_no, Nation_type_id nation_no, bool is_male, const char *name, int style)
int dsend_packet_city_name_suggestion_req(struct connection *pc, int unit_id)
void start_revolution(void)
Definition packhand.c:2385
void set_government_choice(struct government *government)
Definition packhand.c:2372
char * lines
Definition packhand.c:131
int player_number(const struct player *pplayer)
Definition player.c:837
const char * research_advance_name_translation(const struct research *presearch, Tech_type_id tech)
Definition research.c:273
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
const char * sex_name_translation(sex_t kind)
Definition sex.c:60
@ SEX_FEMALE
Definition sex.h:22
@ SEX_MALE
Definition sex.h:23
#define ARRAY_SIZE(x)
Definition shared.h:85
size_t size
Definition specvec.h:72
struct sprite int int y
Definition sprite_g.h:31
struct sprite int x
Definition sprite_g.h:31
struct sprite int int int int struct sprite int int float bool smooth get_sprite_dimensions
Definition sprite_g.h:36
QPixmap map_pixmap
Definition canvas.h:25
Definition city.h:320
struct packet_ruleset_control control
Definition game.h:83
struct packet_game_info info
Definition game.h:89
struct connection conn
Definition client_main.h:96
Definition colors.h:21
struct player * playing
Definition connection.h:151
Definition mapimg.c:367
Definition climisc.h:82
struct universal item
Definition climisc.h:83
struct player * player
Definition nation.h:118
bool tech_steal_allow_holes
char preferred_soundset[MAX_LEN_NAME]
char preferred_tileset[MAX_LEN_NAME]
char preferred_musicset[MAX_LEN_NAME]
int revolution_finishes
Definition player.h:271
char name[MAX_LEN_NAME]
Definition player.h:249
Definition menu.h:161
QPixmap * pm
Definition sprite.h:25
Definition tile.h:50
int index
Definition tile.h:51
struct unit_list * units
Definition tile.h:58
int move_rate
Definition unittype.h:517
Definition unit.h:137
int moves_left
Definition unit.h:149
struct unit::@81::@83 client
int id
Definition unit.h:144
int hp
Definition unit.h:150
int fuel
Definition unit.h:152
struct tile * tile
Definition unit.h:139
struct act_prob * act_prob_cache
Definition unit.h:227
int homecity
Definition unit.h:145
struct civ_map map
const char * style_name_translation(const struct nation_style *pstyle)
Definition style.c:99
int style_number(const struct nation_style *pstyle)
Definition style.c:68
int basic_city_style_for_style(struct nation_style *pstyle)
Definition style.c:210
#define styles_iterate(_p)
Definition style.h:46
#define styles_iterate_end
Definition style.h:52
int fc_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:974
#define sz_strlcpy(dest, src)
Definition support.h:195
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
#define is_svg_flag_enabled()
Definition svgflag.h:30
#define advance_index_iterate_end
Definition tech.h:248
#define A_FIRST
Definition tech.h:44
#define A_UNSET
Definition tech.h:48
#define advance_index_iterate(_start, _index)
Definition tech.h:244
struct extra_type * get_preferred_pillage(bv_extras extras)
Definition terrain.c:550
bool get_units_upgrade_info(char *buf, size_t bufsz, struct unit_list *punits)
Definition text.c:1263
const char * get_act_sel_action_custom_text(struct action *paction, const struct act_prob prob, const struct unit *actor_unit, const struct city *target_city)
Definition text.c:1716
const char * act_sel_action_tool_tip(const struct action *paction, const struct act_prob prob)
Definition text.c:1821
struct city * tile_city(const struct tile *ptile)
Definition tile.c:83
#define tile_index(_pt_)
Definition tile.h:88
#define TILE_INDEX_NONE
Definition tile.h:48
int tileset_hex_width(const struct tileset *t)
Definition tilespec.c:721
int tileset_unit_width(const struct tileset *t)
Definition tilespec.c:797
int tileset_unit_height(const struct tileset *t)
Definition tilespec.c:805
struct sprite * load_popup_sprite(const char *tag)
Definition tilespec.c:7589
bool tileset_is_isometric(const struct tileset *t)
Definition tilespec.c:712
struct sprite * get_sample_city_sprite(const struct tileset *t, int style_idx)
Definition tilespec.c:6862
const char * tileset_basename(const struct tileset *t)
Definition tilespec.c:704
int tileset_hex_height(const struct tileset *t)
Definition tilespec.c:730
void unload_popup_sprite(const char *tag)
Definition tilespec.c:7597
struct sprite * get_nation_flag_sprite(const struct tileset *t, const struct nation_type *pnation)
Definition tilespec.c:6767
void tileset_error(enum log_level level, const char *tset_name, const char *format,...)
Definition tilespec.c:624
bool tilespec_reread(const char *new_tileset_name, bool game_fully_initialized, float scale)
Definition tilespec.c:1355
struct unit * transporter_for_unit_at(const struct unit *pcargo, const struct tile *ptile)
Definition unit.c:1930
bool could_unit_load(const struct unit *pcargo, const struct unit *ptrans)
Definition unit.c:708
bool unit_can_do_action(const struct unit *punit, const action_id act_id)
Definition unit.c:367
void unit_activity_astr(const struct unit *punit, struct astring *astr)
Definition unit.c:1163
#define unit_tile(_pu)
Definition unit.h:396
#define unit_owner(_pu)
Definition unit.h:395
#define unit_list_iterate(unitlist, punit)
Definition unitlist.h:31
#define unit_list_iterate_end
Definition unitlist.h:33
const struct unit_type * unit_type_get(const struct unit *punit)
Definition unittype.c:123
const char * unit_name_translation(const struct unit *punit)
Definition unittype.c:1569
#define utype_fuel(ptype)
Definition unittype.h:839