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_steal_gold(QVariant data1, QVariant data2);
97static void spy_steal_gold_esc(QVariant data1, QVariant data2);
98static void spy_steal_maps(QVariant data1, QVariant data2);
99static void spy_steal_maps_esc(QVariant data1, QVariant data2);
100static void spy_escape(QVariant data1, QVariant data2);
101static void spy_nuke_city(QVariant data1, QVariant data2);
102static void spy_nuke_city_esc(QVariant data1, QVariant data2);
103static void nuke_city(QVariant data1, QVariant data2);
104static void destroy_city(QVariant data1, QVariant data2);
105static void diplomat_embassy(QVariant data1, QVariant data2);
106static void spy_embassy(QVariant data1, QVariant data2);
107static void spy_sabotage_unit(QVariant data1, QVariant data2);
108static void spy_sabotage_unit_esc(QVariant data1, QVariant data2);
109static void spy_investigate(QVariant data1, QVariant data2);
110static void diplomat_investigate(QVariant data1, QVariant data2);
111static void diplomat_sabotage(QVariant data1, QVariant data2);
112static void diplomat_sabotage_esc(QVariant data1, QVariant data2);
113static void diplomat_bribe(QVariant data1, QVariant data2);
114static void caravan_marketplace(QVariant data1, QVariant data2);
115static void caravan_establish_trade(QVariant data1, QVariant data2);
116static void caravan_help_build(QVariant data1, QVariant data2);
117static void unit_disband_recover(QVariant data1, QVariant data2);
118static void capture_units(QVariant data1, QVariant data2);
119static void nuke_units(QVariant data1, QVariant data2);
120static void collect_ransom(QVariant data1, QVariant data2);
121static void wipe_units(QVariant data1, QVariant data2);
122static void expel_unit(QVariant data1, QVariant data2);
123static void bombard(QVariant data1, QVariant data2);
124static void bombard2(QVariant data1, QVariant data2);
125static void bombard3(QVariant data1, QVariant data2);
126static void bombard_lethal(QVariant data1, QVariant data2);
127static void found_city(QVariant data1, QVariant data2);
128static void transform_terrain(QVariant data1, QVariant data2);
129static void cultivate(QVariant data1, QVariant data2);
130static void plant(QVariant data1, QVariant data2);
131static void pillage(QVariant data1, QVariant data2);
132static void clean(QVariant data1, QVariant data2);
133static void road(QVariant data1, QVariant data2);
134static void base(QVariant data1, QVariant data2);
135static void mine(QVariant data1, QVariant data2);
136static void irrigate(QVariant data1, QVariant data2);
137static void nuke(QVariant data1, QVariant data2);
138static void attack(QVariant data1, QVariant data2);
139static void suicide_attack(QVariant data1, QVariant data2);
140static void paradrop(QVariant data1, QVariant data2);
141static void paradrop_conquer(QVariant data1, QVariant data2);
142static void paradrop_frighten(QVariant data1, QVariant data2);
143static void paradrop_frighten_conquer(QVariant data1, QVariant data2);
144static void paradrop_enter(QVariant data1, QVariant data2);
145static void paradrop_enter_conquer(QVariant data1, QVariant data2);
146static void disembark1(QVariant data1, QVariant data2);
147static void disembark2(QVariant data1, QVariant data2);
148static void enter_hut(QVariant data1, QVariant data2);
149static void enter_hut2(QVariant data1, QVariant data2);
150static void frighten_hut(QVariant data1, QVariant data2);
151static void frighten_hut2(QVariant data1, QVariant data2);
152static void regular_move(QVariant data1, QVariant data2);
153static void convert_unit(QVariant data1, QVariant data2);
154static void fortify(QVariant data1, QVariant data2);
155static void disband_unit(QVariant data1, QVariant data2);
156static void homeless(QVariant data1, QVariant data2);
157static void join_city(QVariant data1, QVariant data2);
158static void unit_home_city(QVariant data1, QVariant data2);
159static void unit_upgrade(QVariant data1, QVariant data2);
160static void airlift(QVariant data1, QVariant data2);
161static void conquer_city(QVariant data1, QVariant data2);
162static void conquer_city2(QVariant data1, QVariant data2);
163static void conquer_extras(QVariant data1, QVariant data2);
164static void conquer_extras2(QVariant data1, QVariant data2);
165static void heal_unit(QVariant data1, QVariant data2);
166static void heal_unit2(QVariant data1, QVariant data2);
167static void transport_board(QVariant data1, QVariant data2);
168static void transport_board2(QVariant data1, QVariant data2);
169static void transport_board3(QVariant data1, QVariant data2);
170static void transport_embark(QVariant data1, QVariant data2);
171static void transport_embark2(QVariant data1, QVariant data2);
172static void transport_embark3(QVariant data1, QVariant data2);
173static void transport_embark4(QVariant data1, QVariant data2);
174static void transport_deboard(QVariant data1, QVariant data2);
175static void transport_unload(QVariant data1, QVariant data2);
176static void transport_load(QVariant data1, QVariant data2);
177static void transport_load2(QVariant data1, QVariant data2);
178static void transport_load3(QVariant data1, QVariant data2);
179static void keep_moving(QVariant data1, QVariant data2);
180static void pillage_something(QVariant data1, QVariant data2);
181static void action_entry(choice_dialog *cd,
182 action_id act,
183 const struct act_prob *act_probs,
184 const char *custom,
185 QVariant data1, QVariant data2);
186
187
188static bool is_showing_pillage_dialog = false;
190static bool is_race_dialog_open = false;
191
192/* Information used in action selection follow up questions. Can't be
193 * stored in the action selection dialog since it is closed before the
194 * follow up question is asked. */
196
197/* Don't remove a unit's action decision want or move on to the next actor
198 unit that wants a decision in the current unit selection. */
199static bool did_not_decide = false;
200
201extern char forced_tileset_name[512];
203
204/***********************************************************************/
209{
211
212 // Unit acting against a city target.
251
252 // Unit acting against a unit target.
271
272 // Unit acting against all units at a tile.
280
281 // Unit acting against a tile.
310
311 // Unit acting against all tile extras.
314
315 // Unit acting with no target except itself.
320
321 return action_function;
322}
323
324/* Mapping from an action to the function to call when its button is
325 * pushed. */
327
328/***********************************************************************/
333{
334 titlebar_height = 0;
335 moving_now = false;
336 setSizeGripEnabled(true);
338}
339
340/***********************************************************************/
344{
345 raise();
346}
347
348/***********************************************************************/
352{
354
355 QPainter p(this);
358 QStyle *style = this->style();
359 QRect active_area = this->rect();
362
363 qpal.setColor(QPalette::Active, QPalette::ToolTipText, Qt::white);
364 tbar_opt.initFrom(this);
365 titlebar_height = style->pixelMetric(QStyle::PM_TitleBarHeight,
366 &tbar_opt, this) + 2;
367 close_pix = close_pix.scaledToHeight(titlebar_height);
368 tbar_opt.rect = QRect(0, 0, this->width(), titlebar_height);
369 text_rect = QRect(0, 0, this->width() - close_pix.width() , titlebar_height);
370 close_rect = QRect(this->width() - close_pix.width(), 0, this->width(),
372 tbar_opt.titleBarState = this->windowState();
373 tbar_opt.text = tbar_opt.fontMetrics.elidedText(this->windowTitle(),
374 Qt::ElideRight,
375 text_rect.width());
376 style->drawComplexControl(QStyle::CC_TitleBar, &tbar_opt, &p, this);
377 style->drawItemText(&p, text_rect, Qt::AlignCenter, qpal,
378 true, tbar_opt.text, QPalette::ToolTipText);
379 style->drawItemPixmap(&p, close_rect, Qt::AlignLeft,
380 close_pix.scaledToHeight(titlebar_height));
381
382 active_area.setTopLeft(QPoint(0, titlebar_height));
383 this->setContentsMargins(0, titlebar_height, 0, 0);
384 win_opt.initFrom(this);
385 win_opt.rect = active_area;
386 style->drawPrimitive(QStyle::PE_Widget, &win_opt, &p, this);
387}
388
389/***********************************************************************/
398
399/***********************************************************************/
403{
404 QPoint pos = event->pos();
405 int x = pos.x();
406 int y = pos.y();
407
408 if (y <= titlebar_height
409 && x <= width() - close_pix.width()) {
410 point = mevent_gpos(event) - geometry().topLeft();
411 moving_now = true;
412 setCursor(Qt::SizeAllCursor);
413 } else if (y <= titlebar_height
414 && x > width() - close_pix.width()) {
415 close();
416 }
417}
418
419/***********************************************************************/
423{
424 moving_now = false;
425 setCursor(Qt::ArrowCursor);
426}
427
428/***********************************************************************/
432 QWidget *parent) : qfc_dialog(parent)
433{
434 int i;
438 QPixmap *pix;
439 QHeaderView *header;
440 QSize size;
442 QLabel *ns_label;
443
444 setAttribute(Qt::WA_DeleteOnClose);
445 is_race_dialog_open = true;
447 selected_nation_tabs = new QTableWidget;
448 nation_tabs = new QTableWidget();
449 styles = new QTableWidget;
450 ok_button = new QPushButton;
452 ns_label = new QLabel;
453 tplayer = pplayer;
454
455 selected_nation = -1;
456 selected_style = -1;
457 setWindowTitle(_("Select Nation"));
458 selected_nation_tabs->setRowCount(0);
459 selected_nation_tabs->setColumnCount(1);
460 selected_nation_tabs->setSelectionMode(QAbstractItemView::SingleSelection);
461 selected_nation_tabs->verticalHeader()->setVisible(false);
462 selected_nation_tabs->horizontalHeader()->setVisible(false);
463 selected_nation_tabs->setProperty("showGrid", "true");
464 selected_nation_tabs->setEditTriggers(QAbstractItemView::NoEditTriggers);
465 selected_nation_tabs->setShowGrid(false);
466 selected_nation_tabs->setAlternatingRowColors(true);
467
468 nation_tabs->setRowCount(0);
469 nation_tabs->setColumnCount(1);
470 nation_tabs->setSelectionMode(QAbstractItemView::SingleSelection);
471 nation_tabs->verticalHeader()->setVisible(false);
472 nation_tabs->horizontalHeader()->setVisible(false);
473 nation_tabs->setProperty("showGrid", "true");
474 nation_tabs->setEditTriggers(QAbstractItemView::NoEditTriggers);
475 nation_tabs->setShowGrid(false);
476 ns_label->setText(_("Nation Set:"));
477 styles->setRowCount(0);
478 styles->setColumnCount(2);
479 styles->setSelectionMode(QAbstractItemView::SingleSelection);
480 styles->verticalHeader()->setVisible(false);
481 styles->horizontalHeader()->setVisible(false);
482 styles->setProperty("showGrid", "false");
483 styles->setProperty("selectionBehavior", "SelectRows");
484 styles->setEditTriggers(QAbstractItemView::NoEditTriggers);
485 styles->setShowGrid(false);
486
488 no_name = new QGroupBox(parent);
492 sex_buttons->addButton(is_male, SEX_MALE);
494 sex_buttons->addButton(is_female, SEX_FEMALE);
495
496 leader_name->setEditable(true);
497 qgroupbox_layout->addWidget(leader_name, 1, 0, 1, 2);
498 qgroupbox_layout->addWidget(is_male, 2, 1);
499 qgroupbox_layout->addWidget(is_female, 2, 0);
502 no_name->setLayout(qgroupbox_layout);
503
505 description->setReadOnly(true);
506 description->setPlainText(_("Choose nation"));
507 no_name->setTitle(_("Your leader name"));
508
509 // Fill styles, no need to update them later
510
513
514 if (i >= 0) {
516 styles->insertRow(i);
518 item->setData(Qt::DecorationRole, *pix);
519 item->setData(Qt::UserRole, style_number(pstyle));
520 size.setWidth(pix->width());
521 size.setHeight(pix->height());
522 item->setSizeHint(size);
523 styles->setItem(i, 0, item);
526 styles->setItem(i, 1, item);
527 }
529
530 header = styles->horizontalHeader();
531 header->setSectionResizeMode(QHeaderView::Stretch);
532 header->resizeSections(QHeaderView::ResizeToContents);
533 header = styles->verticalHeader();
534 header->resizeSections(QHeaderView::ResizeToContents);
539 // Create nation sets
540 refresh();
541
542 connect(styles->selectionModel(),
544 const QItemSelection &)),
546 connect(selected_nation_tabs->selectionModel(),
548 const QItemSelection &)),
551 SLOT(leader_selected(int)));
552 connect(leader_name->lineEdit(), &QLineEdit::returnPressed,
555 SLOT(nationset_changed(int)));
556 connect(nation_tabs->selectionModel(),
558 const QItemSelection &)),
560
561 ok_button = new QPushButton;
562 ok_button->setText(_("Cancel"));
563 connect(ok_button, &QAbstractButton::pressed, this, &races_dialog::cancel_pressed);
564 main_layout->addWidget(ok_button, 8, 2, 1, 1);
565 random_button = new QPushButton;
566 random_button->setText(_("Random"));
567 connect(random_button, &QAbstractButton::pressed, this, &races_dialog::random_pressed);
568 main_layout->addWidget(random_button, 8, 0, 1, 1);
569 ok_button = new QPushButton;
570 ok_button->setText(_("Ok"));
571 connect(ok_button, &QAbstractButton::pressed, this, &races_dialog::ok_pressed);
572 main_layout->addWidget(ok_button, 8, 3, 1, 1);
573 main_layout->addWidget(no_name, 0, 3, 2, 1);
574 if (nation_set_count() > 1) {
575 main_layout->addWidget(ns_label, 0, 0, 1, 1);
576 main_layout->addWidget(qnation_set, 0, 1, 1, 1);
577 main_layout->addWidget(nation_tabs, 1, 0, 5, 2);
578 } else {
579 main_layout->addWidget(nation_tabs, 0, 0, 6, 2);
580 }
581 main_layout->addWidget(styles, 2, 3, 4, 1);
582 main_layout->addWidget(description, 6, 0, 2, 4);
583 main_layout->addWidget(selected_nation_tabs, 0, 2, 6, 1);
584
586 set_index(-99);
587
588 if (C_S_RUNNING == client_state()) {
589 title = _("Edit Nation");
590 } else if (NULL != pplayer && pplayer == client.conn.playing) {
591 title = _("What Nation Will You Be?");
592 } else {
593 title = _("Pick Nation");
594 }
595
598}
599
600/***********************************************************************/
607
608/***********************************************************************/
612{
613 struct nation_group *group;
615 QHeaderView *header;
616 int i;
617 int count;
618
619 nation_tabs->clearContents();
620 nation_tabs->setRowCount(0);
621 nation_tabs->insertRow(0);
623 item->setText(_("All nations"));
624 item->setData(Qt::UserRole, -99);
625 nation_tabs->setItem(0, 0, item);
626
627 for (i = 1; i < nation_group_count() + 1; i++) {
628 group = nation_group_by_number(i - 1);
629 if (is_nation_group_hidden(group)) {
630 continue;
631 }
632 count = 0;
633 // Checking if group is empty
634 nations_iterate(pnation) {
635 if (!is_nation_playable(pnation)
636 || !is_nation_pickable(pnation)
637 || !nation_is_in_group(pnation, group)) {
638 continue;
639 }
640 count ++;
642 if (count == 0) {
643 continue;
644 }
645 nation_tabs->insertRow(i);
647 item->setData(Qt::UserRole, i - 1);
648 item->setText(nation_group_name_translation(group));
649 nation_tabs->setItem(i, 0, item);
650 }
651 header = nation_tabs->horizontalHeader();
652 header->resizeSections(QHeaderView::Stretch);
653 header = nation_tabs->verticalHeader();
654 header->resizeSections(QHeaderView::ResizeToContents);
655 set_index(-99);
656}
657
658/***********************************************************************/
662{
663 struct option *popt;
664 struct nation_set *s;
665
667 if (popt) {
669 qnation_set->setCurrentIndex(nation_set_index(s));
670 qnation_set->setToolTip(_(nation_set_description(s)));
671 }
672}
673
674/***********************************************************************/
678{
679 QModelIndexList indexes = selected.indexes();
680 QModelIndex index ;
681
682 if (indexes.isEmpty()) {
683 return;
684 }
685
686 index = indexes.at(0);
687 set_index(index.row());
688}
689
690/***********************************************************************/
695{
697 QPixmap *pix;
698 QFont f;
699 struct nation_group *group;
700 int i;
701 struct sprite *s;
702 QHeaderView *header;
703 bool svg = is_svg_flag_enabled();
704
705 selected_nation_tabs->clearContents();
706 selected_nation_tabs->setRowCount(0);
707
708 last_index = 0;
709 i = nation_tabs->currentRow();
710 if (i != -1) {
711 item = nation_tabs->item(i, 0);
712 index = item->data(Qt::UserRole).toInt();
713 }
714
715 group = nation_group_by_number(index);
716 i = 0;
717 nations_iterate(pnation) {
718 if (!is_nation_playable(pnation)
719 || !is_nation_pickable(pnation)) {
720 continue;
721 }
722 if (!nation_is_in_group(pnation, group) && index != -99) {
723 continue;
724 }
726 selected_nation_tabs->insertRow(i);
727 s = get_nation_flag_sprite(tileset, pnation);
728 if (pnation->player) {
729 f = item->font();
730 f.setStrikeOut(true);
731 item->setFont(f);
732 }
733 pix = s->pm;
734 if (svg) {
735 item->setData(Qt::DecorationRole, (*pix).scaledToHeight(50));
736 } else {
737 item->setData(Qt::DecorationRole, *pix);
738 }
739 item->setData(Qt::UserRole, nation_number(pnation));
740 item->setText(nation_adjective_translation(pnation));
741 selected_nation_tabs->setItem(i, 0, item);
743
744 selected_nation_tabs->sortByColumn(0, Qt::AscendingOrder);
745 header = selected_nation_tabs->horizontalHeader();
746 header->resizeSections(QHeaderView::Stretch);
747 header = selected_nation_tabs->verticalHeader();
748 header->resizeSections(QHeaderView::ResizeToContents);
749}
750
751/***********************************************************************/
755{
756 char buf[4096];
757 QModelIndex index ;
759 QModelIndexList indexes = selected.indexes();
760 QString str;
762 int style, ind;
763
764 if (indexes.isEmpty()) {
765 return;
766 }
767
768 index = indexes.at(0);
769 if (indexes.isEmpty()) {
770 return;
771 }
772 qvar = index.data(Qt::UserRole);
773 selected_nation = qvar.toInt();
774
776 description->setPlainText(buf);
777 leader_name->clear();
778 if (client.conn.playing == tplayer) {
779 leader_name->addItem(client.conn.playing->name, true);
780 }
783 str = QString::fromUtf8(nation_leader_name(pleader));
786
787 // Select style for nation
788
790 qvar = qvar.fromValue<int>(style);
791
792 for (ind = 0; ind < styles->rowCount(); ind++) {
793 item = styles->item(ind, 0);
794
795 if (item->data(Qt::UserRole) == qvar) {
796 styles->selectRow(ind);
797 }
798 }
799}
800
801/***********************************************************************/
805{
806 QModelIndex index ;
808 QModelIndexList indexes = selected.indexes();
809
810 if (indexes.isEmpty()) {
811 return;
812 }
813
814 index = indexes.at(0);
815 qvar = index.data(Qt::UserRole);
816 selected_style = qvar.toInt();
817}
818
819/***********************************************************************/
823{
824 if (leader_name->itemData(index).toBool()) {
825 is_male->setChecked(true);
826 is_female->setChecked(false);
827 } else {
828 is_male->setChecked(false);
829 is_female->setChecked(true);
830 }
831}
832
833/***********************************************************************/
838{
840 struct player *natplr;
841
842 if (selected_nation == -1) {
843 return;
844 }
845
846 if (selected_style == -1) {
847 output_window_append(ftc_client, _("You must select your style."));
848 return;
849 }
850
851 if (leader_name->currentText().length() == 0) {
852 output_window_append(ftc_client, _("You must type a legal name."));
853 return;
854 }
855
857 if (natplr != NULL && natplr != client_player()) {
859 _("Nation has been chosen by other player"));
860 return;
861 }
862
863 ln_bytes = leader_name->currentText().toUtf8();
865 selected_nation, sex_buttons->checkedId(),
866 ln_bytes.data(),
868 close();
869 deleteLater();
870}
871
872/***********************************************************************/
876 const char *lines, QWidget *parent)
877 : fcwidget()
878{
879 int x, y;
881
882 setAttribute(Qt::WA_DeleteOnClose);
883 setCursor(Qt::ArrowCursor);
885 setFrameStyle(QFrame::Box);
886 cw = new close_widget(this);
887 cw->put_to_corner();
888
892 qlist = qlines.split("\n");
893 small_font = *fc_font::instance()->get_font("gui_qt_font_notify_label");
894 x = 0;
895 y = 0;
896 calc_size(x, y);
897 resize(x, y);
898 gui()->mapview_wdg->find_place(gui()->mapview_wdg->width() - x - 4, 4,
899 x, y, x, y, 0);
900 move(x, y);
901 was_destroyed = false;
902
903}
904
905/***********************************************************************/
909{
910 QString s, q;
911 int i;
915
916 for (i = 0; i < qlist.size(); ++i) {
917 s = qlist.at(i);
918 q = q + s;
919 if (i < qlist.size() - 1) {
920 q = q + QChar('\n');
921 }
922 }
923 capt_bytes = qcaption.toUtf8();
924 hl_bytes = qheadline.toUtf8();
925 qb_bytes = q.toUtf8();
927 hl_bytes.data(),
928 qb_bytes.data());
929 close();
930 destroy();
931}
932
933/***********************************************************************/
937{
939 int i;
940 QStringList str_list;
941
942 str_list = qlist;
943 str_list << qcaption << qheadline;
944
945 for (i = 0; i < str_list.count(); i++) {
946 x = qMax(x, fm.horizontalAdvance(str_list.at(i)));
947 y = y + 3 + fm.height();
948 }
949 x = x + 15;
950}
951
952/***********************************************************************/
956{
957 QPainter painter(this);
958 QPainterPath path;
959 QPen pen;
961 int i;
962
963 pen.setWidth(1);
964 pen.setColor(palette().color(QPalette::Text));
965 painter.setFont(small_font);
966 painter.setPen(pen);
967 painter.drawText(10, fm.height() + 3, qcaption);
968 painter.drawText(10, 2 * fm.height() + 6, qheadline);
969 for (i = 0; i < qlist.count(); i++) {
970 painter.drawText(10, 3 + (fm.height() + 3) * (i + 3), qlist[i]);
971 }
972 cw->put_to_corner();
973}
974
975/***********************************************************************/
979{
980 cursor = mevent_gpos(event) - geometry().topLeft();
981
982 if (event->button() == Qt::RightButton) {
983 was_destroyed = true;
984 close();
985 }
986}
987
988/***********************************************************************/
992{
994
995 setCursor(Qt::SizeAllCursor);
996}
997
998/***********************************************************************/
1002{
1003 setCursor(Qt::ArrowCursor);
1004}
1005
1006/***********************************************************************/
1010{
1011 was_destroyed = true;
1012 destroy();
1013}
1014
1015/***********************************************************************/
1021{
1022 was_destroyed = true;
1023 destroy();
1024}
1025
1026/***********************************************************************/
1030{
1031 vs_city = -1;
1032 vs_unit = -1;
1033}
1034
1035/***********************************************************************/
1039{
1040 if (!m_instance) {
1041 m_instance = new qdef_act;
1042 }
1043 return m_instance;
1044}
1045
1046/***********************************************************************/
1050{
1051 if (m_instance) {
1052 delete m_instance;
1053 m_instance = 0;
1054 }
1055}
1056
1057/***********************************************************************/
1061{
1062 vs_city = i;
1063}
1064
1065/***********************************************************************/
1069{
1070 vs_unit = i;
1071}
1072
1073/***********************************************************************/
1077{
1078 return vs_city;
1079}
1080
1081/***********************************************************************/
1085{
1086 return vs_unit;
1087}
1088
1089/***********************************************************************/
1093{
1094 delete this;
1095}
1096
1097/***********************************************************************/
1101{
1103 false, "", 0);
1104 delete this;
1105}
1106
1107/***********************************************************************/
1110notify_goto::notify_goto(const char *headline, const char *lines,
1111 const struct text_tag_list *tags, tile *ptile,
1112 QWidget *parent): QMessageBox(parent)
1113{
1115 setAttribute(Qt::WA_DeleteOnClose);
1116 goto_but = this->addButton(_("Goto Location"), QMessageBox::ActionRole);
1117 goto_but->setIcon(fc_icons::instance()->get_icon("go-up"));
1118 inspect_but = this->addButton(_("Inspect City"), QMessageBox::ActionRole);
1119 inspect_but->setIcon(fc_icons::instance()->get_icon("plus"));
1120
1121 close_but = this->addButton(QMessageBox::Close);
1122 gtile = ptile;
1123 if (!gtile) {
1124 goto_but->setVisible(false);
1125 inspect_but->setVisible(false);
1126 } else {
1127 struct city *pcity = tile_city(gtile);
1128 inspect_but->setVisible(NULL != pcity
1129 && city_owner(pcity) == client.conn.playing);
1130 }
1132 qlines = lines;
1133 qlines.replace("\n", " ");
1134 setText(qlines);
1135 connect(goto_but, &QAbstractButton::pressed, this, &notify_goto::goto_tile);
1136 connect(inspect_but, &QAbstractButton::pressed, this, &notify_goto::inspect_city);
1137 connect(close_but, &QAbstractButton::pressed, this, &QWidget::close);
1138 show();
1139}
1140
1141/***********************************************************************/
1145{
1147 close();
1148}
1149
1150/***********************************************************************/
1154{
1155 struct city *pcity = tile_city(gtile);
1156 if (pcity) {
1158 }
1159 close();
1160}
1161
1162/***********************************************************************/
1166{
1167 QString rule_name;
1169 const char *rn;
1170 struct option *poption = optset_option_by_name(server_optset, "nationset");
1171
1172 rule_name = qnation_set->currentData().toString();
1173 rn_bytes = rule_name.toUtf8(); /* Hold QByteArray in a variable to
1174 * extend its, and data() buffer's,
1175 * lifetime */
1176 rn = rn_bytes.data();
1180 }
1181}
1182
1183/***********************************************************************/
1188void popup_notify_goto_dialog(const char *headline, const char *lines,
1189 const struct text_tag_list *tags,
1190 struct tile *ptile)
1191{
1192 notify_goto *ask = new notify_goto(headline, lines, tags, ptile,
1193 gui()->central_wdg);
1194 ask->show();
1195}
1196
1197/***********************************************************************/
1200void popup_connect_msg(const char *headline, const char *message)
1201{
1202 QMessageBox *msg = new QMessageBox(gui()->central_wdg);
1203
1204 msg->setText(message);
1205 msg->setStandardButtons(QMessageBox::Ok);
1206 msg->setWindowTitle(headline);
1207 msg->setAttribute(Qt::WA_DeleteOnClose);
1208 msg->show();
1209}
1210
1211/***********************************************************************/
1214void popup_notify_dialog(const char *caption, const char *headline,
1215 const char *lines)
1216{
1218 gui()->mapview_wdg);
1219 nd->show();
1220}
1221
1222/***********************************************************************/
1225void popup_races_dialog(struct player *pplayer)
1226{
1227 if (!is_race_dialog_open) {
1228 race_dialog = new races_dialog(pplayer, gui()->central_wdg);
1229 is_race_dialog_open = true;
1230 race_dialog->show();
1231 }
1232 race_dialog->showNormal();
1233}
1234
1235/***********************************************************************/
1240{
1241 if (is_race_dialog_open) {
1242 race_dialog->close();
1243 is_race_dialog_open = false;
1244 }
1245}
1246
1247/***********************************************************************/
1251{
1252 if (ptile != NULL
1253 && (unit_list_size(ptile->units) > 1
1254 || (unit_list_size(ptile->units) == 1 && tile_city(ptile)))) {
1255 gui()->toggle_unit_sel_widget(ptile);
1256 }
1257}
1258
1259/***********************************************************************/
1263{
1264 gui()->update_unit_sel();
1265}
1266
1267/***********************************************************************/
1276
1277/***********************************************************************/
1280void races_update_pickable(bool nationset_change)
1281{
1282 if (is_race_dialog_open) {
1284 }
1285}
1286
1287/***********************************************************************/
1292{
1293 if (is_race_dialog_open) {
1295 }
1296}
1297
1298/***********************************************************************/
1302{
1305 = (gov != nullptr ? government_number(gov) : G_LAST);
1306
1308 ask = new hud_message_box(gui()->central_wdg);
1309 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
1310 ask->setDefaultButton(QMessageBox::Cancel);
1311 ask->set_text_title(_("You say you wanna revolution?"),
1312 _("Revolution!"));
1313 ask->setAttribute(Qt::WA_DeleteOnClose);
1314 QObject::connect(ask, &hud_message_box::accepted, [=]() {
1315 if (government_id == G_LAST) {
1316 revolution_response(nullptr);
1317 } else {
1319
1320 if (government) {
1322 }
1323 }
1324 });
1325 ask->show();
1326 } else {
1328 }
1329}
1330
1331/***********************************************************************/
1344
1345/***********************************************************************/
1352
1353/***********************************************************************/
1361
1362/***********************************************************************/
1370
1371/***********************************************************************/
1378
1379/***********************************************************************/
1386
1387/***********************************************************************/
1391 QWidget *parent,
1392 void (*run_on_close_in)(int)): QWidget(parent)
1393{
1394 QLabel *l = new QLabel(text);
1395
1396 setProperty("themed_choice", true);
1397 layout = new QVBoxLayout(this);
1399
1400 layout->addWidget(l);
1401 setWindowFlags(Qt::Dialog);
1403 setAttribute(Qt::WA_DeleteOnClose);
1404 gui()->set_diplo_dialog(this);
1405
1417
1418 targeted_unit = nullptr;
1419 // No buttons are added yet.
1420 for (int i = 0; i < BUTTON_COUNT; i++) {
1422 }
1423}
1424
1425/***********************************************************************/
1429{
1430 buttons_list.clear();
1431 action_button_map.clear();
1432 gui()->set_diplo_dialog(NULL);
1433
1434 if (run_on_close) {
1437 }
1438}
1439
1440/***********************************************************************/
1444{
1446
1449 struct canvas *pix;
1450 QPushButton *next, *prev;
1451 unit_skip = new QHBoxLayout;
1452 next = new QPushButton();
1453 next->setIcon(fc_icons::instance()->get_icon("city-right"));
1454 next->setIconSize(QSize(32, 32));
1455 next->setFixedSize(QSize(36, 36));
1456 prev = new QPushButton();
1457 prev->setIcon(fc_icons::instance()->get_icon("city-left"));
1458 prev->setIconSize(QSize(32, 32));
1459 prev->setFixedSize(QSize(36, 36));
1460 target_unit_button = new QPushButton;
1463 pix->map_pixmap.fill(Qt::transparent);
1464 put_unit(targeted_unit, pix, 1.0, 0, 0);
1465 target_unit_button->setIcon(QIcon(pix->map_pixmap));
1466 qtg_canvas_free(pix);
1467 target_unit_button->setIconSize(QSize(96, 96));
1468 target_unit_button->setFixedSize(QSize(100, 100));
1469 unit_skip->addStretch(100);
1470 unit_skip->addWidget(prev, Qt::AlignCenter);
1471 unit_skip->addWidget(target_unit_button, Qt::AlignCenter);
1472 unit_skip->addWidget(next, Qt::AlignCenter);
1473 layout->addLayout(unit_skip);
1474 unit_skip->addStretch(100);
1475 connect(prev, &QAbstractButton::clicked, this, &choice_dialog::prev_unit);
1476 connect(next, &QAbstractButton::clicked, this, &choice_dialog::next_unit);
1477 }
1478
1480}
1481
1482/***********************************************************************/
1486 QVariant data2, QString tool_tip = "",
1487 const int button_id = -1)
1488{
1490 data1, data2);
1491 int action = buttons_list.count();
1492
1493 QObject::connect(button, &QPushButton::clicked,
1496 });
1497
1498 buttons_list.append(button);
1499
1500 if (!tool_tip.isEmpty()) {
1501 button->setToolTip(tool_tip);
1502 }
1503
1504 if (0 <= button_id) {
1505 // The id is valid.
1506 action_button_map[button_id] = button;
1507 }
1508
1509 layout->addWidget(button);
1510}
1511
1512/***********************************************************************/
1516{
1517 QPoint p;
1518
1519 p = mapFromGlobal(QCursor::pos());
1520 p.setY(p.y()-this->height());
1521 p.setX(p.x()-this->width());
1522 move(p);
1523 show();
1524}
1525
1526/***********************************************************************/
1533
1534/***********************************************************************/
1538{
1539 if (id < 0) {
1540 fc_assert_msg(0 <= id, "Invalid button ID.");
1541 return NULL;
1542 }
1543
1544 return action_button_map[id];
1545}
1546
1547/***********************************************************************/
1551{
1554
1556 if (action == -1) {
1557 return false;
1558 }
1559 func = af_map[action];
1560
1561 func(q1, q2);
1562 return true;
1563}
1564
1565/***********************************************************************/
1569{
1572
1574 if (action == -1) {
1575 return false;
1576 }
1577 func = af_map[action];
1578 func(q1, q2);
1579 return true;
1580}
1581
1582/***********************************************************************/
1586{
1587 struct tile *ptile;
1588 struct unit *new_target = nullptr;
1589 bool break_next = false;
1590 bool first = true;
1591 struct canvas *pix;
1592
1593 if (targeted_unit == nullptr) {
1594 return;
1595 }
1596
1597 ptile = targeted_unit->tile;
1598
1599 unit_list_iterate(ptile->units, ptgt) {
1600 if (first) {
1601 new_target = ptgt;
1602 first = false;
1603 }
1604 if (break_next) {
1605 new_target = ptgt;
1606 break;
1607 }
1608 if (ptgt == targeted_unit) {
1609 break_next = true;
1610 }
1615 pix->map_pixmap.fill(Qt::transparent);
1616 put_unit(targeted_unit, pix, 1.0, 0, 0);
1617 target_unit_button->setIcon(QIcon(pix->map_pixmap));
1618 qtg_canvas_free(pix);
1619 switch_target();
1620}
1621
1622/***********************************************************************/
1626{
1627 struct tile *ptile;
1628 struct unit *new_target = nullptr;
1629 struct canvas *pix;
1630 if (targeted_unit == nullptr) {
1631 return;
1632 }
1633
1634 ptile = targeted_unit->tile;
1635 unit_list_iterate(ptile->units, ptgt) {
1636 if ((ptgt == targeted_unit) && new_target != nullptr) {
1637 break;
1638 }
1639 new_target = ptgt;
1644 pix->map_pixmap.fill(Qt::transparent);
1645 put_unit(targeted_unit, pix, 1.0, 0, 0);
1646 target_unit_button->setIcon(QIcon(pix->map_pixmap));
1647 qtg_canvas_free(pix);
1648 switch_target();
1649}
1650
1651/***********************************************************************/
1655{
1656 if (targeted_unit == nullptr) {
1657 return;
1658 }
1659 unit_skip->setParent(nullptr);
1664 : NULL),
1665 act_probs);
1666 layout->addLayout(unit_skip);
1667}
1668
1669/***********************************************************************/
1673{
1674 if (targeted_unit == nullptr) {
1675 return;
1676 }
1677
1678 unit_skip->setParent(nullptr);
1680 unit_id,
1685 layout->addLayout(unit_skip);
1686}
1687
1688/***********************************************************************/
1692{
1694 pfcn_void func = button->getFunc();
1695
1696 func(button->getData1(), button->getData2());
1697 close();
1698}
1699
1700/***********************************************************************/
1709{
1710 // Store the data in the stack.
1711 last_buttons_stack.append(button);
1712
1713 /* Temporary remove the button so it will end up below buttons added
1714 * before unstack_all_buttons() is called. */
1715 layout->removeWidget(button);
1716
1717 // Synchronize the list with the layout.
1718 buttons_list.removeAll(button);
1719}
1720
1721/***********************************************************************/
1726{
1727 while (!last_buttons_stack.isEmpty()) {
1728 Choice_dialog_button *button = last_buttons_stack.takeLast();
1729
1730 // Reinsert the button below the other buttons.
1731 buttons_list.append(button);
1732 layout->addWidget(button);
1733 }
1734}
1735
1736/***********************************************************************/
1739static void caravan_marketplace(QVariant data1, QVariant data2)
1740{
1741 int actor_unit_id = data1.toInt();
1742 int target_city_id = data2.toInt();
1743
1745 && NULL != game_city_by_number(target_city_id)) {
1747 target_city_id, 0, "");
1748 }
1749}
1750
1751/***********************************************************************/
1755{
1756 int actor_unit_id = data1.toInt();
1757 int target_city_id = data2.toInt();
1758
1760 && NULL != game_city_by_number(target_city_id)) {
1762 target_city_id, 0, "");
1763 }
1764}
1765
1766/***********************************************************************/
1769static void caravan_help_build(QVariant data1, QVariant data2)
1770{
1771 int caravan_id = data1.toInt();
1772 int caravan_target_id = data2.toInt();
1773
1778 }
1779}
1780
1781/***********************************************************************/
1784static void unit_disband_recover(QVariant data1, QVariant data2)
1785{
1786 int actor_id = data1.toInt();
1787 int tgt_city_id = data2.toInt();
1788
1789 if (NULL != game_unit_by_number(actor_id)
1792 actor_id, tgt_city_id, 0, "");
1793 }
1794}
1795
1796/***********************************************************************/
1799static void unit_home_city(QVariant data1, QVariant data2)
1800{
1801 int actor_id = data1.toInt();
1802 int tgt_city_id = data2.toInt();
1803
1804 if (NULL != game_unit_by_number(actor_id)
1807 actor_id, tgt_city_id, 0, "");
1808 }
1809}
1810
1811/***********************************************************************/
1814static void unit_upgrade(QVariant data1, QVariant data2)
1815{
1816 struct unit *punit;
1817
1818 int actor_id = data1.toInt();
1819 int tgt_city_id = data2.toInt();
1820
1821 if ((punit = game_unit_by_number(actor_id))
1823 struct unit_list *as_list;
1824
1829 }
1830}
1831
1832/***********************************************************************/
1835static void airlift(QVariant data1, QVariant data2)
1836{
1837 int actor_id = data1.toInt();
1838 int tgt_city_id = data2.toInt();
1839
1840 if (NULL != game_unit_by_number(actor_id)
1843 actor_id, tgt_city_id, 0, "");
1844 }
1845}
1846
1847/***********************************************************************/
1850static void conquer_city(QVariant data1, QVariant data2)
1851{
1852 int actor_id = data1.toInt();
1853 int tgt_city_id = data2.toInt();
1854
1855 if (NULL != game_unit_by_number(actor_id)
1858 actor_id, tgt_city_id, 0, "");
1859 }
1860}
1861
1862/***********************************************************************/
1865static void conquer_city2(QVariant data1, QVariant data2)
1866{
1867 int actor_id = data1.toInt();
1868 int tgt_city_id = data2.toInt();
1869
1870 if (NULL != game_unit_by_number(actor_id)
1873 actor_id, tgt_city_id, 0, "");
1874 }
1875}
1876
1877/***********************************************************************/
1880static void conquer_extras(QVariant data1, QVariant data2)
1881{
1882 int actor_id = data1.toInt();
1883 int target_id = data2.toInt();
1884
1885 if (NULL != game_unit_by_number(actor_id)) {
1887 actor_id, target_id, 0, "");
1888 }
1889}
1890
1891/***********************************************************************/
1894static void conquer_extras2(QVariant data1, QVariant data2)
1895{
1896 int actor_id = data1.toInt();
1897 int target_id = data2.toInt();
1898
1899 if (NULL != game_unit_by_number(actor_id)) {
1901 actor_id, target_id, 0, "");
1902 }
1903}
1904
1905/***********************************************************************/
1908static void act_sel_wait(QVariant data1, QVariant data2)
1909{
1910 key_unit_wait();
1911}
1912
1913/***********************************************************************/
1916static void keep_moving(QVariant data1, QVariant data2)
1917{
1918}
1919
1920/***********************************************************************/
1924{
1925 if (!gov) {
1927 } else {
1929 }
1930}
1931
1932/***********************************************************************/
1937{
1939 /* The client isn't waiting for information for any unanswered follow
1940 * up questions. */
1941
1942 struct unit *actor_unit;
1943
1945 /* The action selection dialog wasn't closed because the actor unit
1946 * was lost. */
1947
1948 // The probabilities didn't just disappear, right?
1951
1953 }
1954
1955 // The action selection process is over, at least for now.
1957
1958 if (did_not_decide) {
1959 /* The action selection dialog was closed but the player didn't
1960 * decide what the unit should do. */
1961
1962 // Reset so the next action selection dialog does the right thing.
1963 did_not_decide = false;
1964 } else {
1965 // An action, or no action at all, was selected.
1968 }
1969 }
1970}
1971
1972/***********************************************************************/
1976static void diplomat_queue_handle_secondary(int actor_id)
1977{
1978 // Stop waiting. Move on to the next queued unit.
1981}
1982
1983/**********************************************************************/
1990{
1991 // Stop assuming the answer to a follow up question will arrive.
1993}
1994
1995/***********************************************************************/
2000 struct city *target_city,
2001 struct unit *target_unit,
2002 struct tile *target_tile,
2003 struct extra_type *target_extra,
2004 const struct act_prob *act_probs)
2005{
2006 struct astring title = ASTRING_INIT, text = ASTRING_INIT;
2008 qtiles caras;
2009 QVariant qv1, qv2;
2011 struct city *actor_homecity;
2014
2017
2018 foreach (caras, gui()->trade_gen.lines) {
2019 if (caras.autocaravan == actor_unit) {
2020 int i;
2021 if (nullptr != game_unit_by_number(actor_unit->id)
2022 && nullptr != game_city_by_number(target_city->id)) {
2024 target_city->id, 0, "");
2027 i = gui()->trade_gen.lines.indexOf(caras);
2028 gui()->trade_gen.lines.takeAt(i);
2029 return;
2030 }
2031 }
2032 }
2033 if (target_city
2037 return;
2038 }
2039
2040 if (target_unit
2044 return;
2045 }
2046 /* Could be caused by the server failing to reply to a request for more
2047 * information or a bug in the client code. */
2049 "Diplomat queue problem. Is another diplomat window open?");
2050
2051 // No extra input is required as no action has been chosen yet.
2053
2055
2056 astr_set(&title,
2057 // TRANS: %s is a unit name, e.g., Spy
2058 _("Choose Your %s's Strategy"),
2060
2061 if (target_city && actor_homecity) {
2062 astr_set(&text,
2063 _("Your %s from %s reaches the city of %s.\nWhat now?"),
2067 } else if (target_city) {
2068 astr_set(&text,
2069 _("Your %s has arrived at %s.\nWhat is your command?"),
2072 } else if (target_unit) {
2073 astr_set(&text,
2074 // TRANS: Your Spy is ready to act against Roman Freight.
2075 _("Your %s is ready to act against %s %s."),
2079 } else {
2081 "No target specified.");
2082
2083 astr_set(&text,
2084 // TRANS: %s is a unit name, e.g., Diplomat, Spy
2085 _("Your %s is waiting for your command."),
2087 }
2088
2089 cd = gui()->get_diplo_dialog();
2090 if ((cd != nullptr) && cd->targeted_unit != nullptr) {
2091 cd->update_dialog(act_probs);
2092 return;
2093 }
2094 cd = new choice_dialog(astr_str(&title), astr_str(&text),
2095 gui()->game_tab_widget,
2097 qv1 = actor_unit->id;
2098
2099 cd->unit_id = actor_unit->id;
2100
2101 cd->target_id[ATK_SELF] = cd->unit_id;
2102
2103 if (target_city) {
2104 cd->target_id[ATK_CITY] = target_city->id;
2105 } else {
2106 cd->target_id[ATK_CITY] = IDENTITY_NUMBER_ZERO;
2107 }
2108
2109 if (target_unit) {
2110 cd->target_id[ATK_UNIT] = target_unit->id;
2111 } else {
2112 cd->target_id[ATK_UNIT] = IDENTITY_NUMBER_ZERO;
2113 }
2114
2115 if (target_tile) {
2116 cd->target_id[ATK_UNITS] = tile_index(target_tile);
2117 } else {
2118 cd->target_id[ATK_UNITS] = TILE_INDEX_NONE;
2119 }
2120
2121 if (target_tile) {
2122 cd->target_id[ATK_TILE] = tile_index(target_tile);
2123 } else {
2124 cd->target_id[ATK_TILE] = TILE_INDEX_NONE;
2125 }
2126
2127 if (target_tile) {
2128 cd->target_id[ATK_EXTRAS] = tile_index(target_tile);
2129 } else {
2130 cd->target_id[ATK_EXTRAS] = TILE_INDEX_NONE;
2131 }
2132
2133 // No target building or target tech supplied. (Feb 2020)
2134 cd->sub_target_id[ASTK_BUILDING] = B_LAST;
2135 cd->sub_target_id[ASTK_TECH] = A_UNSET;
2136
2137 if (target_extra) {
2138 cd->sub_target_id[ASTK_EXTRA] = extra_number(target_extra);
2140 } else {
2141 cd->sub_target_id[ASTK_EXTRA] = EXTRA_NONE;
2142 cd->sub_target_id[ASTK_EXTRA_NOT_THERE] = EXTRA_NONE;
2143 }
2144
2145 // Unit acting against a city
2146
2147 // Set the correct target for the following actions.
2148 qv2 = cd->target_id[ATK_CITY];
2149
2150 action_iterate(act) {
2155 act_probs[act],
2156 actor_unit,
2157 target_city),
2158 qv1, qv2);
2159 }
2161
2162 // Unit acting against another unit
2163
2164 // Set the correct target for the following actions.
2165 qv2 = cd->target_id[ATK_UNIT];
2166
2167 action_iterate(act) {
2172 act_probs[act],
2173 actor_unit,
2174 target_city),
2175 qv1, qv2);
2176 }
2178
2179 // Unit acting against all units at a tile
2180
2181 // Set the correct target for the following actions.
2182 qv2 = cd->target_id[ATK_UNITS];
2183
2184 action_iterate(act) {
2189 act_probs[act],
2190 actor_unit,
2191 target_city),
2192 qv1, qv2);
2193 }
2195
2196 // Unit acting against a tile.
2197
2198 // Set the correct target for the following actions.
2199 qv2 = cd->target_id[ATK_TILE];
2200
2201 action_iterate(act) {
2206 act_probs[act],
2207 actor_unit,
2208 target_city),
2209 qv1, qv2);
2210 }
2212
2213 // Unit acting against a tile's extras.
2214
2215 // Set the correct target for the following actions.
2216 qv2 = cd->target_id[ATK_EXTRAS];
2217
2218 action_iterate(act) {
2223 act_probs[act],
2224 actor_unit,
2225 target_city),
2226 qv1, qv2);
2227 }
2229
2230 // Unit acting against itself
2231
2232 // Set the correct target for the following actions.
2233 qv2 = cd->target_id[ATK_SELF];
2234
2235 action_iterate(act) {
2240 act_probs[act],
2241 actor_unit,
2242 target_city),
2243 qv1, qv2);
2244 }
2246
2248 cd->add_item(QString(_("&Wait")), func, qv1, qv2,
2249 "", BUTTON_WAIT);
2250
2251 func = keep_moving;
2252 cd->add_item(QString(_("Do nothing")), func, qv1, qv2,
2253 "", BUTTON_CANCEL);
2254
2255 cd->set_layout();
2256 cd->show_me();
2257
2258 // Give follow up questions access to action probabilities.
2260 action_iterate(act) {
2263
2264 astr_free(&title);
2265 astr_free(&text);
2266}
2267
2268/***********************************************************************/
2273{
2274 /* Don't add an action mapping here unless the non targeted version is
2275 * selectable in the targeted version's target selection dialog. */
2276 switch ((enum gen_action)tgt_action_id) {
2282 return ACTION_SPY_STEAL_TECH;
2285 default:
2286 // No non targeted version found.
2287 return ACTION_NONE;
2288 }
2289}
2290
2291/**********************************************************************/
2296{
2297 /* Don't add an action mapping here unless the non targeted version is
2298 * selectable in the targeted version's target selection dialog. */
2299 switch ((enum gen_action)tgt_action_id) {
2306 default:
2307 // No non targeted version found.
2308 return ACTION_NONE;
2309 }
2310}
2311
2312/***********************************************************************/
2316 action_id act,
2317 const struct act_prob *act_probs,
2318 const char *custom,
2319 QVariant data1, QVariant data2)
2320{
2321 QString title;
2323
2324 if (!af_map.contains(act)) {
2325 /* The Qt client doesn't support ordering this action from the
2326 * action selection dialog. */
2327 return;
2328 }
2329
2330 // Don't show disabled actions.
2331 if (!action_prob_possible(act_probs[act])) {
2332 return;
2333 }
2334
2336 act_probs[act],
2337 custom));
2338
2340 act_probs[act]));
2341
2342 cd->add_item(title, af_map[act], data1, data2, tool_tip, act);
2343}
2344
2345/***********************************************************************/
2349 action_id act,
2350 const struct act_prob *act_probs,
2351 const char *custom,
2352 QVariant data1, QVariant data2)
2353{
2354 QString title;
2356
2357 /* An action that just became impossible has its button disabled.
2358 * An action that became possible again must be re-enabled. */
2359 button->setEnabled(action_prob_possible(act_probs[act]));
2360 button->setData1(data1);
2361 button->setData2(data2);
2362 // The probability may have changed.
2364 act_probs[act],
2365 custom));
2366
2368 act_probs[act]));
2369
2370 button->setText(title);
2371 button->setToolTip(tool_tip);
2372}
2373
2374/***********************************************************************/
2377static void disband_unit(QVariant data1, QVariant data2)
2378{
2379 int actor_id = data1.toInt();
2380 int target_id = data2.toInt();
2381
2383 target_id, 0, "");
2384}
2385
2386/***********************************************************************/
2389static void fortify(QVariant data1, QVariant data2)
2390{
2391 int actor_id = data1.toInt();
2392 int target_id = data2.toInt();
2393
2394 if (NULL != game_unit_by_number(actor_id)) {
2396 target_id, 0, "");
2397 }
2398}
2399
2400/***********************************************************************/
2403static void convert_unit(QVariant data1, QVariant data2)
2404{
2405 int actor_id = data1.toInt();
2406 int target_id = data2.toInt();
2407
2409 target_id, 0, "");
2410}
2411
2412/***********************************************************************/
2415static void homeless(QVariant data1, QVariant data2)
2416{
2417 int actor_id = data1.toInt();
2418 int target_id = data2.toInt();
2419
2420 if (NULL != game_unit_by_number(actor_id)) {
2422 target_id, 0, "");
2423 }
2424}
2425
2426/***********************************************************************/
2429static void diplomat_bribe(QVariant data1, QVariant data2)
2430{
2431 int diplomat_id = data1.toInt();
2432 int diplomat_target_id = data2.toInt();
2433
2436 // Wait for the server's reply before moving on to the next queued diplomat.
2438
2441 }
2442}
2443
2444/***********************************************************************/
2447static void spy_sabotage_unit(QVariant data1, QVariant data2)
2448{
2449 int diplomat_id = data1.toInt();
2450 int diplomat_target_id = data2.toInt();
2451
2453 diplomat_target_id, 0, "");
2454}
2455
2456/***********************************************************************/
2459static void spy_sabotage_unit_esc(QVariant data1, QVariant data2)
2460{
2461 int diplomat_id = data1.toInt();
2462 int diplomat_target_id = data2.toInt();
2463
2465 diplomat_target_id, 0, "");
2466}
2467
2468/***********************************************************************/
2471static void heal_unit(QVariant data1, QVariant data2)
2472{
2473 int actor_id = data1.toInt();
2474 int target_id = data2.toInt();
2475
2476 request_do_action(ACTION_HEAL_UNIT, actor_id, target_id, 0, "");
2477}
2478
2479/***********************************************************************/
2482static void heal_unit2(QVariant data1, QVariant data2)
2483{
2484 int actor_id = data1.toInt();
2485 int target_id = data2.toInt();
2486
2487 request_do_action(ACTION_HEAL_UNIT2, actor_id, target_id, 0, "");
2488}
2489
2490/***********************************************************************/
2493static void transport_board(QVariant data1, QVariant data2)
2494{
2495 int actor_id = data1.toInt();
2496 int target_id = data2.toInt();
2497
2498 request_do_action(ACTION_TRANSPORT_BOARD, actor_id, target_id, 0, "");
2499}
2500
2501/***********************************************************************/
2504static void transport_board2(QVariant data1, QVariant data2)
2505{
2506 int actor_id = data1.toInt();
2507 int target_id = data2.toInt();
2508
2509 request_do_action(ACTION_TRANSPORT_BOARD2, actor_id, target_id, 0, "");
2510}
2511
2512/***********************************************************************/
2515static void transport_board3(QVariant data1, QVariant data2)
2516{
2517 int actor_id = data1.toInt();
2518 int target_id = data2.toInt();
2519
2520 request_do_action(ACTION_TRANSPORT_BOARD3, actor_id, target_id, 0, "");
2521}
2522
2523/***********************************************************************/
2526static void transport_embark(QVariant data1, QVariant data2)
2527{
2528 int actor_id = data1.toInt();
2529 int target_id = data2.toInt();
2530
2531 request_do_action(ACTION_TRANSPORT_EMBARK, actor_id, target_id, 0, "");
2532}
2533
2534/***********************************************************************/
2537static void transport_embark2(QVariant data1, QVariant data2)
2538{
2539 int actor_id = data1.toInt();
2540 int target_id = data2.toInt();
2541
2542 request_do_action(ACTION_TRANSPORT_EMBARK2, actor_id, target_id, 0, "");
2543}
2544
2545/***********************************************************************/
2548static void transport_embark3(QVariant data1, QVariant data2)
2549{
2550 int actor_id = data1.toInt();
2551 int target_id = data2.toInt();
2552
2553 request_do_action(ACTION_TRANSPORT_EMBARK3, actor_id, target_id, 0, "");
2554}
2555
2556/***********************************************************************/
2559static void transport_embark4(QVariant data1, QVariant data2)
2560{
2561 int actor_id = data1.toInt();
2562 int target_id = data2.toInt();
2563
2564 request_do_action(ACTION_TRANSPORT_EMBARK4, actor_id, target_id, 0, "");
2565}
2566
2567/***********************************************************************/
2570static void transport_unload(QVariant data1, QVariant data2)
2571{
2572 int actor_id = data1.toInt();
2573 int target_id = data2.toInt();
2574
2575 request_do_action(ACTION_TRANSPORT_UNLOAD, actor_id, target_id, 0, "");
2576}
2577
2578/***********************************************************************/
2581static void transport_load(QVariant data1, QVariant data2)
2582{
2583 int actor_id = data1.toInt();
2584 int target_id = data2.toInt();
2585
2586 request_do_action(ACTION_TRANSPORT_LOAD, actor_id, target_id, 0, "");
2587}
2588
2589/***********************************************************************/
2592static void transport_load2(QVariant data1, QVariant data2)
2593{
2594 int actor_id = data1.toInt();
2595 int target_id = data2.toInt();
2596
2597 request_do_action(ACTION_TRANSPORT_LOAD2, actor_id, target_id, 0, "");
2598}
2599
2600/***********************************************************************/
2603static void transport_load3(QVariant data1, QVariant data2)
2604{
2605 int actor_id = data1.toInt();
2606 int target_id = data2.toInt();
2607
2608 request_do_action(ACTION_TRANSPORT_LOAD3, actor_id, target_id, 0, "");
2609}
2610
2611/***********************************************************************/
2614static void transport_deboard(QVariant data1, QVariant data2)
2615{
2616 int actor_id = data1.toInt();
2617 int target_id = data2.toInt();
2618
2619 request_do_action(ACTION_TRANSPORT_DEBOARD, actor_id, target_id, 0, "");
2620}
2621
2622/***********************************************************************/
2625static void disembark1(QVariant data1, QVariant data2)
2626{
2627 int actor_id = data1.toInt();
2628 int target_id = data2.toInt();
2629
2630 if (NULL != game_unit_by_number(actor_id)
2631 && NULL != index_to_tile(&(wld.map), target_id)) {
2633 actor_id, target_id, 0, "");
2634 }
2635}
2636
2637/***********************************************************************/
2640static void disembark2(QVariant data1, QVariant data2)
2641{
2642 int actor_id = data1.toInt();
2643 int target_id = data2.toInt();
2644
2645 if (NULL != game_unit_by_number(actor_id)
2646 && NULL != index_to_tile(&(wld.map), target_id)) {
2648 actor_id, target_id, 0, "");
2649 }
2650}
2651
2652/***********************************************************************/
2655static void enter_hut(QVariant data1, QVariant data2)
2656{
2657 int actor_id = data1.toInt();
2658 int target_id = data2.toInt();
2659
2660 if (NULL != game_unit_by_number(actor_id)
2661 && NULL != index_to_tile(&(wld.map), target_id)) {
2663 actor_id, target_id, 0, "");
2664 }
2665}
2666
2667/***********************************************************************/
2670static void enter_hut2(QVariant data1, QVariant data2)
2671{
2672 int actor_id = data1.toInt();
2673 int target_id = data2.toInt();
2674
2675 if (NULL != game_unit_by_number(actor_id)
2676 && NULL != index_to_tile(&(wld.map), target_id)) {
2678 actor_id, target_id, 0, "");
2679 }
2680}
2681
2682/***********************************************************************/
2685static void frighten_hut(QVariant data1, QVariant data2)
2686{
2687 int actor_id = data1.toInt();
2688 int target_id = data2.toInt();
2689
2690 if (NULL != game_unit_by_number(actor_id)
2691 && NULL != index_to_tile(&(wld.map), target_id)) {
2693 actor_id, target_id, 0, "");
2694 }
2695}
2696
2697/***********************************************************************/
2700static void frighten_hut2(QVariant data1, QVariant data2)
2701{
2702 int actor_id = data1.toInt();
2703 int target_id = data2.toInt();
2704
2705 if (NULL != game_unit_by_number(actor_id)
2706 && NULL != index_to_tile(&(wld.map), target_id)) {
2708 actor_id, target_id, 0, "");
2709 }
2710}
2711
2712/**********************************************************************/
2715static void nuke_units(QVariant data1, QVariant data2)
2716{
2717 int actor_id = data1.toInt();
2718 int target_id = data2.toInt();
2719
2721 target_id, 0, "");
2722}
2723
2724/**********************************************************************/
2727static void collect_ransom(QVariant data1, QVariant data2)
2728{
2729 int actor_id = data1.toInt();
2730 int target_id = data2.toInt();
2731
2733 target_id, 0, "");
2734}
2735
2736/**********************************************************************/
2739static void wipe_units(QVariant data1, QVariant data2)
2740{
2741 int actor_id = data1.toInt();
2742 int target_id = data2.toInt();
2743
2745 target_id, 0, "");
2746}
2747
2748/**********************************************************************/
2751static void capture_units(QVariant data1, QVariant data2)
2752{
2753 int actor_id = data1.toInt();
2754 int target_id = data2.toInt();
2755
2757 target_id, 0, "");
2758}
2759
2760/***********************************************************************/
2763static void expel_unit(QVariant data1, QVariant data2)
2764{
2765 int actor_id = data1.toInt();
2766 int target_id = data2.toInt();
2767
2769 target_id, 0, "");
2770}
2771
2772/***********************************************************************/
2775static void bombard(QVariant data1, QVariant data2)
2776{
2777 int actor_id = data1.toInt();
2778 int target_id = data2.toInt();
2779
2781 target_id, 0, "");
2782}
2783
2784/***********************************************************************/
2787static void bombard2(QVariant data1, QVariant data2)
2788{
2789 int actor_id = data1.toInt();
2790 int target_id = data2.toInt();
2791
2793 target_id, 0, "");
2794}
2795
2796/***********************************************************************/
2799static void bombard3(QVariant data1, QVariant data2)
2800{
2801 int actor_id = data1.toInt();
2802 int target_id = data2.toInt();
2803
2805 target_id, 0, "");
2806}
2807
2808/***********************************************************************/
2811static void bombard_lethal(QVariant data1, QVariant data2)
2812{
2813 int actor_id = data1.toInt();
2814 int target_id = data2.toInt();
2815
2817 target_id, 0, "");
2818}
2819
2820/***********************************************************************/
2823static void found_city(QVariant data1, QVariant data2)
2824{
2825 int actor_id = data1.toInt();
2826
2828 actor_id);
2829}
2830
2831/***********************************************************************/
2834static void transform_terrain(QVariant data1, QVariant data2)
2835{
2836 int actor_id = data1.toInt();
2837 int target_id = data2.toInt();
2838
2839 if (NULL != game_unit_by_number(actor_id)
2840 && NULL != index_to_tile(&(wld.map), target_id)) {
2842 actor_id, target_id, 0, "");
2843 }
2844}
2845
2846/***********************************************************************/
2849static void cultivate(QVariant data1, QVariant data2)
2850{
2851 int actor_id = data1.toInt();
2852 int target_id = data2.toInt();
2853
2854 if (NULL != game_unit_by_number(actor_id)
2855 && NULL != index_to_tile(&(wld.map), target_id)) {
2857 actor_id, target_id, 0, "");
2858 }
2859}
2860
2861/***********************************************************************/
2864static void plant(QVariant data1, QVariant data2)
2865{
2866 int actor_id = data1.toInt();
2867 int target_id = data2.toInt();
2868
2869 if (NULL != game_unit_by_number(actor_id)
2870 && NULL != index_to_tile(&(wld.map), target_id)) {
2872 actor_id, target_id, 0, "");
2873 }
2874}
2875
2876/***********************************************************************/
2879static void pillage(QVariant data1, QVariant data2)
2880{
2881 int actor_id = data1.toInt();
2882 int target_id = data2.toInt();
2883
2884 if (NULL != game_unit_by_number(actor_id)
2885 && NULL != index_to_tile(&(wld.map), target_id)) {
2887 actor_id, target_id,
2888 /* FIXME: will cause problems if more than
2889 * one action selection dialog at a time
2890 * becomes supported. */
2892 "");
2893 }
2894}
2895
2896/***********************************************************************/
2899static void clean(QVariant data1, QVariant data2)
2900{
2901 int actor_id = data1.toInt();
2902 int target_id = data2.toInt();
2903
2904 if (NULL != game_unit_by_number(actor_id)
2905 && NULL != index_to_tile(&(wld.map), target_id)) {
2907 actor_id, target_id,
2908 /* FIXME: will cause problems if more than
2909 * one action selection dialog at a time
2910 * becomes supported. */
2912 "");
2913 }
2914}
2915
2916/***********************************************************************/
2919static void road(QVariant data1, QVariant data2)
2920{
2921 int actor_id = data1.toInt();
2922 int target_id = data2.toInt();
2923
2924 if (NULL != game_unit_by_number(actor_id)
2925 && NULL != index_to_tile(&(wld.map), target_id)
2928 actor_id, target_id,
2929 /* FIXME: will cause problems if more than
2930 * one action selection dialog at a time
2931 * becomes supported. */
2933 "");
2934 }
2935}
2936
2937/***********************************************************************/
2940static void base(QVariant data1, QVariant data2)
2941{
2942 int actor_id = data1.toInt();
2943 int target_id = data2.toInt();
2944
2945 if (NULL != game_unit_by_number(actor_id)
2946 && NULL != index_to_tile(&(wld.map), target_id)
2949 actor_id, target_id,
2950 /* FIXME: will cause problems if more than
2951 * one action selection dialog at a time
2952 * becomes supported. */
2954 "");
2955 }
2956}
2957
2958/***********************************************************************/
2961static void mine(QVariant data1, QVariant data2)
2962{
2963 int actor_id = data1.toInt();
2964 int target_id = data2.toInt();
2965
2966 if (NULL != game_unit_by_number(actor_id)
2967 && NULL != index_to_tile(&(wld.map), target_id)
2970 actor_id, target_id,
2971 /* FIXME: will cause problems if more than
2972 * one action selection dialog at a time
2973 * becomes supported. */
2975 "");
2976 }
2977}
2978
2979/***********************************************************************/
2982static void irrigate(QVariant data1, QVariant data2)
2983{
2984 int actor_id = data1.toInt();
2985 int target_id = data2.toInt();
2986
2987 if (NULL != game_unit_by_number(actor_id)
2988 && NULL != index_to_tile(&(wld.map), target_id)
2991 actor_id, target_id,
2992 /* FIXME: will cause problems if more than
2993 * one action selection dialog at a time
2994 * becomes supported. */
2996 "");
2997 }
2998}
2999
3000/***********************************************************************/
3003static void nuke(QVariant data1, QVariant data2)
3004{
3005 int diplomat_id = data1.toInt();
3006 int diplomat_target_id = data2.toInt();
3007
3012 }
3013}
3014
3015/***********************************************************************/
3018static void attack(QVariant data1, QVariant data2)
3019{
3020 int diplomat_id = data1.toInt();
3021 int diplomat_target_id = data2.toInt();
3022
3027 }
3028}
3029
3030/***********************************************************************/
3033static void suicide_attack(QVariant data1, QVariant data2)
3034{
3035 int diplomat_id = data1.toInt();
3036 int diplomat_target_id = data2.toInt();
3037
3042 }
3043}
3044
3045/***********************************************************************/
3048static void paradrop(QVariant data1, QVariant data2)
3049{
3050 int actor_id = data1.toInt();
3051 int target_id = data2.toInt();
3052
3053 if (NULL != game_unit_by_number(actor_id)
3054 && NULL != index_to_tile(&(wld.map), target_id)) {
3056 actor_id, target_id, 0, "");
3057 }
3058}
3059
3060/***********************************************************************/
3063static void paradrop_conquer(QVariant data1, QVariant data2)
3064{
3065 int actor_id = data1.toInt();
3066 int target_id = data2.toInt();
3067
3068 if (NULL != game_unit_by_number(actor_id)
3069 && NULL != index_to_tile(&(wld.map), target_id)) {
3071 actor_id, target_id, 0, "");
3072 }
3073}
3074
3075/***********************************************************************/
3078static void paradrop_frighten(QVariant data1, QVariant data2)
3079{
3080 int actor_id = data1.toInt();
3081 int target_id = data2.toInt();
3082
3083 if (NULL != game_unit_by_number(actor_id)
3084 && NULL != index_to_tile(&(wld.map), target_id)) {
3086 actor_id, target_id, 0, "");
3087 }
3088}
3089
3090/***********************************************************************/
3094{
3095 int actor_id = data1.toInt();
3096 int target_id = data2.toInt();
3097
3098 if (NULL != game_unit_by_number(actor_id)
3099 && NULL != index_to_tile(&(wld.map), target_id)) {
3101 actor_id, target_id, 0, "");
3102 }
3103}
3104
3105/***********************************************************************/
3108static void paradrop_enter(QVariant data1, QVariant data2)
3109{
3110 int actor_id = data1.toInt();
3111 int target_id = data2.toInt();
3112
3113 if (NULL != game_unit_by_number(actor_id)
3114 && NULL != index_to_tile(&(wld.map), target_id)) {
3116 actor_id, target_id, 0, "");
3117 }
3118}
3119
3120/***********************************************************************/
3124{
3125 int actor_id = data1.toInt();
3126 int target_id = data2.toInt();
3127
3128 if (NULL != game_unit_by_number(actor_id)
3129 && NULL != index_to_tile(&(wld.map), target_id)) {
3131 actor_id, target_id, 0, "");
3132 }
3133}
3134
3135/***********************************************************************/
3138static void join_city(QVariant data1, QVariant data2)
3139{
3140 int actor_id = data1.toInt();
3141 int target_id = data2.toInt();
3142
3143 if (NULL != game_unit_by_number(actor_id)
3144 && NULL != game_city_by_number(target_id)) {
3146 actor_id, target_id, 0, "");
3147 }
3148}
3149
3150/***********************************************************************/
3153static void spy_steal_shared(QVariant data1, QVariant data2,
3154 action_id act_id)
3155{
3156 QString str;
3157 QVariant qv1;
3159 int diplomat_id = data1.toInt();
3160 int diplomat_target_id = data2.toInt();
3163 struct player *pvictim = NULL;
3166
3167 cd = gui()->get_diplo_dialog();
3168 if (cd != NULL) {
3169 cd->close();
3170 }
3171
3172 if (pvcity == nullptr) {
3173 return;
3174 }
3175
3176 // Wait for the player's reply before moving on to the next queued diplomat.
3178
3180
3181 struct astring stra = ASTRING_INIT;
3182 cd = new choice_dialog(_("Steal"), _("Steal Technology"),
3183 gui()->game_tab_widget,
3185
3186 // Put both actor and target city in qv1 since qv2 is taken
3189 actor_and_target.append(act_id);
3190 qv1 = QVariant::fromValue(actor_and_target);
3191
3192 struct player *pplayer = client_player();
3193 const struct research *presearch = research_get(pplayer);
3194 const struct research *vresearch = research_get(pvictim);
3195
3202 // Defeat keyboard shortcut mnemonics
3204 .replace("&", "&&");
3205 cd->add_item(str, func, qv1, i);
3206 }
3208
3210 get_non_targeted_action_id(act_id)])) {
3211 astr_set(&stra, _("At %s's Discretion"),
3214 str = QString(astr_str(&stra)).replace("&", "&&");
3215 cd->add_item(str, func, qv1, A_UNSET);
3216 }
3217
3218 cd->set_layout();
3219 cd->show_me();
3220
3221 astr_free(&stra);
3222}
3223
3224/***********************************************************************/
3227static void spy_steal(QVariant data1, QVariant data2)
3228{
3230}
3231
3232/***********************************************************************/
3235static void spy_steal_esc(QVariant data1, QVariant data2)
3236{
3238}
3239
3240/***********************************************************************/
3243static void spy_steal_something(QVariant data1, QVariant data2)
3244{
3245 int diplomat_id = data1.toList().at(0).toInt();
3246 int diplomat_target_id = data1.toList().at(1).toInt();
3247 action_id act_id = data1.toList().at(2).toInt();
3248
3251 if (data2.toInt() == A_UNSET) {
3252 // This is the untargeted version.
3254 diplomat_id, diplomat_target_id, data2.toInt(), "");
3255 } else {
3256 // This is the targeted version.
3258 diplomat_target_id, data2.toInt(), "");
3259 }
3260 }
3261}
3262
3263/***********************************************************************/
3267{
3268 int actor_id = data1.toInt();
3269 int target_id = data2.toInt();
3270
3271 if (NULL != game_unit_by_number(actor_id)
3272 && NULL != game_city_by_number(target_id)) {
3273 // Wait for the server's reply before moving on to the next queued diplomat.
3275
3276 request_action_details(ACTION_STRIKE_BUILDING, actor_id, target_id);
3277 }
3278}
3279
3280/***********************************************************************/
3284{
3285 int diplomat_id = data1.toInt();
3286 int diplomat_target_id = data2.toInt();
3287
3290 // Wait for the server's reply before moving on to the next queued diplomat.
3292
3295 }
3296}
3297
3298/***********************************************************************/
3302{
3303 int diplomat_id = data1.toInt();
3304 int diplomat_target_id = data2.toInt();
3305
3308 /* Wait for the server's reply before moving on to the next queued
3309 * diplomat. */
3311
3314 }
3315}
3316
3317/***********************************************************************/
3320static void spy_poison(QVariant data1, QVariant data2)
3321{
3322 int diplomat_id = data1.toInt();
3323 int diplomat_target_id = data2.toInt();
3324
3329 }
3330}
3331
3332/***********************************************************************/
3335static void spy_poison_esc(QVariant data1, QVariant data2)
3336{
3337 int diplomat_id = data1.toInt();
3338 int diplomat_target_id = data2.toInt();
3339
3344 }
3345}
3346
3347/***********************************************************************/
3350static void spy_nuke_city(QVariant data1, QVariant data2)
3351{
3352 int diplomat_id = data1.toInt();
3353 int diplomat_target_id = data2.toInt();
3354
3359 }
3360}
3361
3362/***********************************************************************/
3365static void spy_nuke_city_esc(QVariant data1, QVariant data2)
3366{
3367 int diplomat_id = data1.toInt();
3368 int diplomat_target_id = data2.toInt();
3369
3374 }
3375}
3376
3377/***********************************************************************/
3380static void nuke_city(QVariant data1, QVariant data2)
3381{
3382 int actor_id = data1.toInt();
3383 int target_id = data2.toInt();
3384
3385 if (NULL != game_unit_by_number(actor_id)
3386 && NULL != game_city_by_number(target_id)) {
3388 actor_id, target_id, 0, "");
3389 }
3390}
3391
3392/***********************************************************************/
3395static void destroy_city(QVariant data1, QVariant data2)
3396{
3397 int diplomat_id = data1.toInt();
3398 int diplomat_target_id = data2.toInt();
3399
3404 }
3405}
3406
3407/***********************************************************************/
3410static void spy_steal_gold(QVariant data1, QVariant data2)
3411{
3412 int diplomat_id = data1.toInt();
3413 int diplomat_target_id = data2.toInt();
3414
3419 }
3420}
3421
3422/***********************************************************************/
3425static void spy_steal_gold_esc(QVariant data1, QVariant data2)
3426{
3427 int diplomat_id = data1.toInt();
3428 int diplomat_target_id = data2.toInt();
3429
3434 }
3435}
3436
3437/***********************************************************************/
3440static void spy_steal_maps(QVariant data1, QVariant data2)
3441{
3442 int diplomat_id = data1.toInt();
3443 int diplomat_target_id = data2.toInt();
3444
3449 }
3450}
3451
3452/***********************************************************************/
3455static void spy_steal_maps_esc(QVariant data1, QVariant data2)
3456{
3457 int diplomat_id = data1.toInt();
3458 int diplomat_target_id = data2.toInt();
3459
3464 }
3465}
3466
3467/***********************************************************************/
3470static void spy_escape(QVariant data1, QVariant data2)
3471{
3472 int diplomat_id = data1.toInt();
3473 int diplomat_target_id = data2.toInt();
3474
3479 }
3480}
3481
3482/***********************************************************************/
3485static void spy_embassy(QVariant data1, QVariant data2)
3486{
3487 int diplomat_id = data1.toInt();
3488 int diplomat_target_id = data2.toInt();
3489
3493 diplomat_target_id, 0, "");
3494 }
3495}
3496
3497/***********************************************************************/
3500static void diplomat_embassy(QVariant data1, QVariant data2)
3501{
3502 int diplomat_id = data1.toInt();
3503 int diplomat_target_id = data2.toInt();
3504
3508 diplomat_target_id, 0, "");
3509 }
3510}
3511
3512/***********************************************************************/
3515static void spy_investigate(QVariant data1, QVariant data2)
3516{
3517 int diplomat_id = data1.toInt();
3518 int diplomat_target_id = data2.toInt();
3519
3523 diplomat_target_id, 0, "");
3524 }
3525}
3526
3527/***********************************************************************/
3530static void diplomat_investigate(QVariant data1, QVariant data2)
3531{
3532 int diplomat_id = data1.toInt();
3533 int diplomat_target_id = data2.toInt();
3534
3538 diplomat_target_id, 0, "");
3539 }
3540}
3541
3542/***********************************************************************/
3545static void diplomat_sabotage(QVariant data1, QVariant data2)
3546{
3547 int diplomat_id = data1.toInt();
3548 int diplomat_target_id = data2.toInt();
3549
3553 diplomat_target_id, B_LAST + 1, "");
3554 }
3555}
3556
3557/***********************************************************************/
3560static void diplomat_sabotage_esc(QVariant data1, QVariant data2)
3561{
3562 int diplomat_id = data1.toInt();
3563 int diplomat_target_id = data2.toInt();
3564
3568 diplomat_target_id, B_LAST + 1, "");
3569 }
3570}
3571
3572/***********************************************************************/
3575static void diplomat_steal(QVariant data1, QVariant data2)
3576{
3577 int diplomat_id = data1.toInt();
3578 int diplomat_target_id = data2.toInt();
3579
3584 }
3585}
3586
3587/***********************************************************************/
3590static void diplomat_steal_esc(QVariant data1, QVariant data2)
3591{
3592 int diplomat_id = data1.toInt();
3593 int diplomat_target_id = data2.toInt();
3594
3599 }
3600}
3601
3602/***********************************************************************/
3605static void diplomat_incite(QVariant data1, QVariant data2)
3606{
3607 int diplomat_id = data1.toInt();
3608 int diplomat_target_id = data2.toInt();
3609
3612 // Wait for the server's reply before moving on to the next queued diplomat.
3614
3617 }
3618}
3619
3620/***********************************************************************/
3624{
3625 int diplomat_id = data1.toInt();
3626 int diplomat_target_id = data2.toInt();
3627
3630 // Wait for the server's reply before moving on to the next queued diplomat.
3632
3635 }
3636}
3637
3638/***********************************************************************/
3641static void regular_move(QVariant data1, QVariant data2)
3642{
3643 int actor_id = data1.toInt();
3644 int target_id = data2.toInt();
3645
3646 if (NULL != game_unit_by_number(actor_id)
3647 && NULL != index_to_tile(&(wld.map), target_id)) {
3649 actor_id, target_id, 0, "");
3650 }
3651}
3652
3653/***********************************************************************/
3657void popup_incite_dialog(struct unit *actor, struct city *tcity, int cost,
3658 const struct action *paction)
3659{
3660 char buf[1024];
3661 char buf2[1024];
3662 int diplomat_id = actor->id;
3663 int diplomat_target_id = tcity->id;
3664 const int act_id = paction->id;
3665
3666 // Should be set before sending request to the server.
3668
3669 fc_snprintf(buf, ARRAY_SIZE(buf), PL_("Treasury contains %d gold.",
3670 "Treasury contains %d gold.",
3671 client_player()->economic.gold),
3672 client_player()->economic.gold);
3673
3675 hud_message_box *impossible = new hud_message_box(gui()->central_wdg);
3676
3678 _("You can't incite a revolt in %s."), city_name_get(tcity));
3679 impossible->set_text_title(buf2, "!");
3680 impossible->setStandardButtons(QMessageBox::Ok);
3681 impossible->setAttribute(Qt::WA_DeleteOnClose);
3682 impossible->show();
3683 } else if (cost <= client_player()->economic.gold) {
3684 hud_message_box *ask = new hud_message_box(gui()->central_wdg);
3685
3687 PL_("Incite a revolt for %d gold?\n%s",
3688 "Incite a revolt for %d gold?\n%s", cost), cost, buf);
3689 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
3690 ask->setDefaultButton(QMessageBox::Cancel);
3691 ask->set_text_title(buf2, _("Incite a Revolt!"));
3692 ask->setAttribute(Qt::WA_DeleteOnClose);
3693 QObject::connect(ask, &hud_message_box::accepted, [=]() {
3696 });
3697 ask->show();
3698 return;
3699 } else {
3700 hud_message_box *too_much = new hud_message_box(gui()->central_wdg);
3701
3703 PL_("Inciting a revolt costs %d gold.\n%s",
3704 "Inciting a revolt costs %d gold.\n%s", cost), cost,
3705 buf);
3706 too_much->set_text_title(buf2, "!");
3707 too_much->setStandardButtons(QMessageBox::Ok);
3708 too_much->setAttribute(Qt::WA_DeleteOnClose);
3709 too_much->show();
3710 }
3711
3713}
3714
3715/***********************************************************************/
3719void popup_bribe_dialog(struct unit *actor, struct unit *tunit, int cost,
3720 const struct action *paction)
3721{
3722 hud_message_box *ask = new hud_message_box(gui()->central_wdg);
3723 char buf[1024];
3724 char buf2[1024];
3725 int diplomat_id = actor->id;
3726 int diplomat_target_id = tunit->id;
3727 const int act_id = paction->id;
3728
3729 // Should be set before sending request to the server.
3731
3732 fc_snprintf(buf, ARRAY_SIZE(buf), PL_("Treasury contains %d gold.",
3733 "Treasury contains %d gold.",
3734 client_player()->economic.gold),
3735 client_player()->economic.gold);
3736
3737 if (cost <= client_player()->economic.gold) {
3738 fc_snprintf(buf2, ARRAY_SIZE(buf2), PL_("Bribe unit for %d gold?\n%s",
3739 "Bribe unit for %d gold?\n%s",
3740 cost), cost, buf);
3741 ask->set_text_title(buf2, _("Bribe Enemy Unit"));
3742 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
3743 ask->setDefaultButton(QMessageBox::Cancel);
3744 ask->setAttribute(Qt::WA_DeleteOnClose);
3745 QObject::connect(ask, &hud_message_box::accepted, [=]() {
3748 });
3749 ask->show();
3750 return;
3751 } else {
3753 PL_("Bribing the unit costs %d gold.\n%s",
3754 "Bribing the unit costs %d gold.\n%s", cost), cost, buf);
3755 ask->set_text_title(buf2, _("Traitors Demand Too Much!"));
3756 ask->setAttribute(Qt::WA_DeleteOnClose);
3757 ask->show();
3758 }
3759
3761}
3762
3763/***********************************************************************/
3766static void pillage_something(QVariant data1, QVariant data2)
3767{
3768 int punit_id;
3769 int what;
3770 struct unit *punit;
3771 struct extra_type *target;
3772
3773 what = data1.toInt();
3774 punit_id = data2.toInt();
3776 if (punit) {
3777 target = extra_by_number(what);
3779 }
3781}
3782
3783/***********************************************************************/
3786static void spy_sabotage(QVariant data1, QVariant data2)
3787{
3788 int diplomat_id = data1.toList().at(0).toInt();
3789 int diplomat_target_id = data1.toList().at(1).toInt();
3790 action_id act_id = data1.toList().at(2).toInt();
3791
3794 if (data2.toInt() == B_LAST) {
3795 // This is the untargeted version.
3797 diplomat_id, diplomat_target_id, data2.toInt(),
3798 "");
3799 } else if (data2.toInt() == -1) {
3800 // This is the city production version.
3802 diplomat_id, diplomat_target_id, data2.toInt(),
3803 "");
3804 } else {
3805 // This is the targeted version.
3807 diplomat_target_id, data2.toInt(), "");
3808 }
3809 }
3810}
3811
3812/***********************************************************************/
3817 const struct action *paction)
3818{
3819 QString str;
3820 QVariant qv1, qv2;
3821 int diplomat_id = actor->id;
3822 int diplomat_target_id = tcity->id;
3824 choice_dialog *cd = new choice_dialog(_("Sabotage"),
3825 _("Select Improvement to Sabotage"),
3826 gui()->game_tab_widget,
3828 int nr = 0;
3829 struct astring stra = ASTRING_INIT;
3831
3832 // Should be set before sending request to the server.
3834
3835 // Put both actor, target city and action in qv1 since qv2 is taken
3838 actor_and_target.append(paction->id);
3839 qv1 = QVariant::fromValue(actor_and_target);
3840
3843 paction->id)])) {
3845 cd->add_item(QString(_("City Production")), func, qv1, -1);
3846 }
3847
3848 city_built_iterate(tcity, pimprove) {
3849 if (pimprove->sabotage > 0) {
3851 // Defeat keyboard shortcut mnemonics
3853 .replace("&", "&&");
3854 qv2 = nr;
3855 cd->add_item(str, func, qv1, improvement_number(pimprove));
3856 nr++;
3857 }
3859
3862 astr_set(&stra, _("At %s's Discretion"),
3865 str = QString(astr_str(&stra)).replace("&", "&&");
3866 cd->add_item(str, func, qv1, B_LAST);
3867 }
3868
3869 cd->set_layout();
3870 cd->show_me();
3871 astr_free(&stra);
3872}
3873
3874/***********************************************************************/
3879{
3880 QString str;
3881 QVariant qv1, qv2;
3884 struct extra_type *tgt;
3885
3887 return;
3888 }
3889 cd = new choice_dialog(_("What To Pillage"), _("Select what to pillage:"),
3890 gui()->game_tab_widget);
3891 qv2 = punit->id;
3892 while ((tgt = get_preferred_pillage(extras))) {
3893 int what;
3894
3895 what = extra_index(tgt);
3896 BV_CLR(extras, what);
3897
3899 // Defeat keyboard shortcut mnemonics
3900 str = QString(extra_name_translation(tgt)).replace("&", "&&");
3901 qv1 = what;
3902 cd->add_item(str, func, qv1, qv2);
3903 }
3904 cd->set_layout();
3905 cd->show_me();
3906}
3907
3908/***********************************************************************/
3912 QWidget *parent) : hud_message_box(parent)
3913{
3914 QString str;
3915 QPushButton *pb;
3916
3917 setAttribute(Qt::WA_DeleteOnClose);
3918 setModal(false);
3923
3924 str = QString(PL_("Are you sure you want to disband that %1 unit?",
3925 "Are you sure you want to disband those %1 units?",
3927 pb = addButton(_("Yes"), QMessageBox::AcceptRole);
3928 addButton(_("No"), QMessageBox::RejectRole);
3929 set_text_title(str, _("Disband units"));
3931 connect(pb, &QAbstractButton::clicked, this, &disband_box::disband_clicked);
3932}
3933
3934/***********************************************************************/
3945
3946/***********************************************************************/
3953
3954/***********************************************************************/
3957void popup_disband_dialog(struct unit_list *punits)
3958{
3959 disband_box *ask = new disband_box(punits, gui()->central_wdg);
3960 ask->show();
3961}
3962
3963/***********************************************************************/
3968{
3969 hud_message_box *ask = new hud_message_box(gui()->central_wdg);
3970 QString text;
3971 QString title;
3972
3973 title = QString(_("Modpack suggests using %1 tileset."))
3975 text = QString("It might not work with other tilesets.\n"
3976 "You are currently using tileset %1.")
3978 ask->addButton(_("Keep current tileset"), QMessageBox::RejectRole);
3979 ask->addButton(_("Load tileset"), QMessageBox::AcceptRole);
3980 ask->set_text_title(text, title);
3981 ask->setAttribute(Qt::WA_DeleteOnClose);
3982
3983 QObject::connect(ask, &hud_message_box::accepted, [=]() {
3986 gui()->map_scale)) {
3988 _("Can't load requested tileset."));
3989 }
3990 });
3991 ask->show();
3992}
3993
3994/***********************************************************************/
3999{
4000 hud_message_box *ask = new hud_message_box(gui()->central_wdg);
4001 QString text;
4002 QString title;
4003
4004 title = QString(_("Modpack suggests using %1 soundset."))
4006 text = QString("It might not work with other tilesets.\n"
4007 "You are currently using soundset %1.")
4008 .arg(sound_set_name);
4009 ask->addButton(_("Keep current soundset"), QMessageBox::RejectRole);
4010 ask->addButton(_("Load soundset"), QMessageBox::AcceptRole);
4011 ask->set_text_title(text, title);
4012 ask->setAttribute(Qt::WA_DeleteOnClose);
4013 QObject::connect(ask, &hud_message_box::accepted, [=]() {
4015 });
4016 ask->show();
4017}
4018
4019/***********************************************************************/
4024{
4025 hud_message_box *ask = new hud_message_box(gui()->central_wdg);
4026 QString text;
4027 QString title;
4028
4029 title = QString(_("Modpack suggests using %1 musicset."))
4031 text = QString("It might not work with other tilesets.\n"
4032 "You are currently using musicset %1.")
4033 .arg(music_set_name);
4034 ask->addButton(_("Keep current musicset"), QMessageBox::RejectRole);
4035 ask->addButton(_("Load musicset"), QMessageBox::AcceptRole);
4036 ask->set_text_title(text, title);
4037 ask->setAttribute(Qt::WA_DeleteOnClose);
4038 QObject::connect(ask, &hud_message_box::accepted, [=]() {
4040 });
4041 ask->show();
4042}
4043
4044/***********************************************************************/
4049{
4050 // PORTME
4051 return false;
4052}
4053
4054/***********************************************************************/
4058{
4060 int i;
4061
4062 nd_list = gui()->mapview_wdg->findChildren<notify_dialog *>();
4063 for (i = 0; i < nd_list.count(); i++) {
4064 nd_list[i]->restart();
4065 delete nd_list[i];
4066 }
4067}
4068
4069/***********************************************************************/
4074{
4075 int i;
4078 goto_dialog *gtd;
4079
4080 QApplication::alert(gui()->central_wdg);
4081 cd_list = gui()->game_tab_widget->findChildren <choice_dialog *>();
4082 for (i = 0; i < cd_list.count(); i++) {
4083 cd_list[i]->close();
4084 }
4085 nd_list = gui()->game_tab_widget->findChildren <notify_dialog *>();
4086 for (i = 0; i < nd_list.count(); i++) {
4087 nd_list[i]->close();
4088 }
4089
4098 gui()->popdown_unit_sel();
4099
4100 gtd = gui()->gtd;
4101
4102 if (gtd != nullptr) {
4103 gtd->close_dlg();
4104 }
4105}
4106
4107/***********************************************************************/
4113{
4114 choice_dialog *cd = gui()->get_diplo_dialog();
4115
4116 if (cd != NULL) {
4117 return cd->unit_id;
4118 } else {
4119 return IDENTITY_NUMBER_ZERO;
4120 }
4121}
4122
4123/***********************************************************************/
4130{
4131 choice_dialog *cd = gui()->get_diplo_dialog();
4132
4133 if (cd != NULL) {
4134 return cd->target_id[ATK_CITY];
4135 } else {
4136 return IDENTITY_NUMBER_ZERO;
4137 }
4138}
4139
4140/***********************************************************************/
4147{
4148 choice_dialog *cd = gui()->get_diplo_dialog();
4149
4150 if (cd != NULL) {
4151 return cd->target_id[ATK_TILE];
4152 } else {
4153 return TILE_INDEX_NONE;
4154 }
4155}
4156
4157/**********************************************************************/
4164{
4165 choice_dialog *cd = gui()->get_diplo_dialog();
4166
4167 if (cd != NULL) {
4168 return cd->sub_target_id[ASTK_EXTRA];
4169 } else {
4170 return EXTRA_NONE;
4171 }
4172}
4173
4174/***********************************************************************/
4181{
4182 choice_dialog *cd = gui()->get_diplo_dialog();
4183
4184 if (cd != NULL) {
4185 return cd->target_id[ATK_UNIT];
4186 } else {
4187 return IDENTITY_NUMBER_ZERO;
4188 }
4189}
4190
4191/***********************************************************************/
4195 struct city *target_city,
4196 struct unit *target_unit,
4197 struct tile *target_tile,
4198 struct extra_type *target_extra,
4199 const struct act_prob *act_probs)
4200{
4203 Choice_dialog_button *cancel_button;
4204 QVariant qv1, qv2;
4205
4206 asd = gui()->get_diplo_dialog();
4207 if (asd == NULL) {
4209 "The action selection dialog should have been open");
4210 return;
4211 }
4212
4215 "The action selection dialog is for another actor unit.");
4216 }
4217
4218 // Put the actor id in qv1.
4219 qv1 = actor_unit->id;
4220
4221 cancel_button = asd->get_identified_button(BUTTON_CANCEL);
4222 if (cancel_button != NULL) {
4223 /* Temporary remove the Cancel button so it won't end up above
4224 * any added buttons. */
4225 asd->stack_button(cancel_button);
4226 }
4227
4228 wait_button = asd->get_identified_button(BUTTON_WAIT);
4229 if (wait_button != NULL) {
4230 /* Temporary remove the Wait button so it won't end up above
4231 * any added buttons. */
4232 asd->stack_button(wait_button);
4233 }
4234
4235 action_iterate(act) {
4236 const char *custom;
4237
4238 if (action_id_get_actor_kind(act) != AAK_UNIT) {
4239 // Not relevant.
4240 continue;
4241 }
4242
4244 act_probs[act],
4245 actor_unit,
4246 target_city);
4247
4248 // Put the target id in qv2.
4249 switch (action_id_get_target_kind(act)) {
4250 case ATK_UNIT:
4251 if (target_unit != NULL) {
4252 qv2 = target_unit->id;
4253 } else {
4255 || target_unit != NULL,
4256 "Action enabled against non existing unit!");
4257
4259 }
4260 break;
4261 case ATK_CITY:
4262 if (target_city != NULL) {
4263 qv2 = target_city->id;
4264 } else {
4266 || target_city != NULL,
4267 "Action enabled against non existing city!");
4268
4270 }
4271 break;
4272 case ATK_TILE:
4273 case ATK_EXTRAS:
4274 case ATK_UNITS:
4275 if (target_tile != NULL) {
4277 } else {
4279 || target_tile != NULL,
4280 "Action enabled against all units on "
4281 "non existing tile!");
4282
4284 }
4285 break;
4286 case ATK_SELF:
4287 qv2 = actor_unit->id;
4288 break;
4289 case ATK_COUNT:
4291 "Bad target kind");
4292 continue;
4293 }
4294
4295 if (asd->get_identified_button(act)) {
4296 // Update the existing button.
4297 action_entry_update(asd->get_identified_button(act),
4298 act, act_probs, custom,
4299 qv1, qv2);
4300 } else {
4301 // Add the button (unless its probability is 0).
4303 qv1, qv2);
4304 }
4306
4307 if (wait_button != NULL || cancel_button != NULL) {
4308 /* Reinsert the non action buttons below any potential
4309 * buttons recently added. */
4310 asd->unstack_all_buttons();
4311 }
4312}
4313
4314/***********************************************************************/
4318{
4320
4321 cd = gui()->get_diplo_dialog();
4322 if (cd != NULL) {
4323 did_not_decide = true;
4324 cd->close();
4325 }
4326}
4327
4328/***********************************************************************/
4334
4335/***********************************************************************/
4338void show_tileset_error(bool fatal, const char *tset_name, const char *msg)
4339{
4340 QWidget *parent;
4341 fc_client *std_gui = gui();
4342
4343 if (std_gui != nullptr) {
4344 parent = std_gui->central_wdg;
4345 } else {
4346 parent = nullptr;
4347 }
4348
4349 if (std_gui != nullptr || fatal) {
4350 char buf[1024];
4351 QMessageBox *ask = new QMessageBox(parent);
4352
4353 if (tset_name != NULL) {
4354 fc_snprintf(buf, sizeof(buf),
4355 _("Tileset \"%s\" problem, it's probably incompatible with "
4356 "the ruleset:\n%s"), tset_name, msg);
4357 } else {
4358 fc_snprintf(buf, sizeof(buf),
4359 _("Tileset problem, it's probably incompatible with "
4360 "the ruleset:\n%s"), msg);
4361 }
4362
4363 ask->setText(buf);
4364 ask->setStandardButtons(QMessageBox::Ok);
4365 ask->setWindowTitle(_("Tileset error"));
4366
4367 if (std_gui != nullptr && !fatal) {
4368 ask->setAttribute(Qt::WA_DeleteOnClose);
4369 ask->show();
4370 } else {
4371 ask->exec();
4372 }
4373 }
4374}
4375
4376/***********************************************************************/
4379void popup_upgrade_dialog(struct unit_list *punits)
4380{
4381 char buf[512];
4383 QString title;
4385
4386 if (!punits || unit_list_size(punits) == 0) {
4387 return;
4388 }
4389
4390 ask = new hud_message_box(gui()->central_wdg);
4391
4392 punit_ids = new QVector<int>();
4394 punit_ids->push_back(punit->id);
4396
4397 if (!get_units_upgrade_info(buf, sizeof(buf), punits)) {
4398 title = _("Upgrade Unit!");
4399 ask->setStandardButtons(QMessageBox::Ok);
4400 } else {
4401 title = _("Upgrade Obsolete Units");
4402 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
4403 ask->setDefaultButton(QMessageBox::Cancel);
4404 }
4405 ask->set_text_title(buf, title);
4406 ask->setAttribute(Qt::WA_DeleteOnClose);
4407 QObject::connect(ask, &hud_message_box::accepted, [=]() {
4408 std::unique_ptr<QVector<int>> uptr(punit_ids);
4409 struct unit *punit;
4410
4411 for (int id : *uptr) {
4413 if (punit) {
4415 }
4416 }
4417 });
4418 ask->show();
4419}
4420
4421/***********************************************************************/
4425{
4426 QPoint p, final_p;
4427
4429 utile = ptile;
4430 pix = NULL;
4431 show_line = 0;
4432 highligh_num = -1;
4433 ufont.setItalic(true);
4435 update_units();
4436 h_pix = NULL;
4437 create_pixmap();
4438 p = mapFromGlobal(QCursor::pos());
4439 cw = new close_widget(this);
4440 setMouseTracking(true);
4441 final_p.setX(p.x());
4442 final_p.setY(p.y());
4443 if (p.x() + width() > parentWidget()->width()) {
4444 final_p.setX(parentWidget()->width() - width());
4445 }
4446 if (p.y() - height() < 0) {
4447 final_p.setY(height());
4448 }
4449 move(final_p.x(), final_p.y() - height());
4450 setFocus();
4451 /* Build fails with qt5 connect style for static functions
4452 * Qt5.2 so dont update */
4453 QTimer::singleShot(10, this, SLOT(update_img()));
4454}
4455
4456/***********************************************************************/
4460{
4461 delete h_pix;
4462 delete pix;
4463 delete cw;
4464}
4465
4466/***********************************************************************/
4470{
4471 int a;
4472 int x, y, i;
4475 QImage img;
4477 QPainter p;
4478 QPen pen;
4479 QPixmap pixc;
4480 QPixmap *pixp;
4482 QRect crop;
4483 struct canvas *unit_pixmap;
4484 struct unit *punit;
4485 float isosize;
4486
4487 if (pix != NULL) {
4488 delete pix;
4489 pix = NULL;
4490 };
4491 isosize = 0.7;
4493 isosize = 0.5;
4494 }
4495
4496 update_units();
4497 if (unit_list.count() > 0) {
4501 } else {
4504 }
4505 more = false;
4506 if (h_pix != nullptr) {
4507 delete h_pix;
4508 }
4509 h_pix = new QPixmap(item_size.width(), item_size.height());
4510 h_pix->fill(palette().color(QPalette::HighlightedText));
4511 if (unit_count < 5) {
4512 row_count = 1;
4513 pix = new QPixmap((unit_list.size()) * item_size.width(),
4514 item_size.height());
4515 } else if (unit_count < 9) {
4516 row_count = 2;
4517 pix = new QPixmap(4 * item_size.width(), 2 * item_size.height());
4518 } else {
4519 row_count = 3;
4520 if (unit_count > 12) {
4521 more = true;
4522 }
4523 pix = new QPixmap(4 * item_size.width(), 3 * item_size.height());
4524 }
4525 pix->fill(Qt::transparent);
4526 foreach(punit, unit_list) {
4529 unit_pixmap->map_pixmap.fill(Qt::transparent);
4530 put_unit(punit, unit_pixmap, 1.0, 0, 0);
4531 img = unit_pixmap->map_pixmap.toImage();
4533 cropped_img = img.copy(crop);
4537 Qt::KeepAspectRatio,
4538 Qt::SmoothTransformation);
4539 } else {
4542 Qt::KeepAspectRatio,
4543 Qt::SmoothTransformation);
4544 }
4545 pixc = QPixmap::fromImage(img);
4546 pixp = new QPixmap(pixc);
4547 pix_list.push_back(pixp);
4549 }
4550 a = qMin(item_size.width() / 4, 12);
4551 x = 0, y = -item_size.height(), i = -1;
4552 p.begin(pix);
4553 ufont.setPixelSize(a);
4554 p.setFont(ufont);
4555 pen.setColor(palette().color(QPalette::Text));
4556 p.setPen(pen);
4557
4558 while (!pix_list.isEmpty()) {
4559 tmp_pix = pix_list.takeFirst();
4560 i++;
4561 if (i % 4 == 0) {
4562 x = 0;
4563 y = y + item_size.height();
4564 }
4565 punit = unit_list.at(i);
4566 Q_ASSERT(punit != NULL);
4567
4568 if (i == highligh_num) {
4569 p.drawPixmap(x, y, *h_pix);
4570 p.drawPixmap(x, y, *tmp_pix);
4571 } else {
4572 p.drawPixmap(x, y, *tmp_pix);
4573 }
4574
4576 int rate, f;
4577 QString str;
4578
4580 f = ((punit->fuel) - 1);
4583 str = str + "(" + QString(move_points_text((rate * f)
4584 + punit->moves_left, false)) + ")";
4585 }
4586 // TRANS: MP = Movement points
4587 str = QString(_("MP:")) + str;
4588 p.drawText(x, y + item_size.height() - 4, str);
4589 }
4590
4591 x = x + item_size.width();
4592 delete tmp_pix;
4593 }
4594 p.end();
4595 setFixedWidth(pix->width() + 20);
4596 setFixedHeight(pix->height() + 2 * (fm.height() + 6));
4597 qDeleteAll(pix_list.begin(), pix_list.end());
4598 }
4599}
4600
4601/***********************************************************************/
4605{
4606 int a, b;
4607 int old_h;
4609 QPoint pos = event->pos();
4610 int x = pos.x();
4611 int y = pos.y();
4612
4614 highligh_num = -1;
4615 if (x > width() - 11
4616 || y > height() - fm.height() - 5
4617 || y < fm.height() + 3 || x < 11) {
4618 // Do nothing if mouse is on border, just skip next if
4619 } else if (row_count > 0) {
4620 a = (x - 10) / item_size.width();
4621 b = (y - fm.height() - 3) / item_size.height();
4622 highligh_num = b * 4 + a;
4623 }
4624 if (old_h != highligh_num) {
4625 create_pixmap();
4626 update();
4627 }
4628}
4629
4630/***********************************************************************/
4636{
4637 struct unit *punit;
4638 if (event->button() == Qt::RightButton) {
4639 was_destroyed = true;
4640 close();
4641 destroy();
4642 }
4643 if (event->button() == Qt::LeftButton && highligh_num != -1) {
4644 update_units();
4645 if (highligh_num >= unit_list.count()) {
4646 return;
4647 }
4650 was_destroyed = true;
4651 close();
4652 destroy();
4653 }
4654}
4655
4656/***********************************************************************/
4661{
4662 create_pixmap();
4663 update();
4664}
4665
4666/***********************************************************************/
4670{
4672 int h, i;
4673 int *f_size;
4674 QPen pen;
4675 QString str, str2;
4676 struct unit *punit;
4677 int point_size = info_font.pointSize();
4678 int pixel_size = info_font.pixelSize();
4679
4680 if (point_size < 0) {
4681 f_size = &pixel_size;
4682 } else {
4683 f_size = &point_size;
4684 }
4685 if (highligh_num != -1 && highligh_num < unit_list.count()) {
4686 struct astring addition = ASTRING_INIT;
4687
4690
4691 // TRANS: HP - hit points
4692 str2 = QString(_("%1 HP:%2/%3")).arg(QString(astr_str(&addition)),
4693 QString::number(punit->hp),
4694 QString::number(unit_type_get(punit)->hp));
4696 }
4697 str = QString(PL_("%1 unit", "%1 units",
4699 .arg(unit_list_size(utile->units));
4700 for (i = *f_size; i > 4; i--) {
4701 if (point_size < 0) {
4702 info_font.setPixelSize(i);
4703 } else {
4704 info_font.setPointSize(i);
4705 }
4707 if (10 + qfm.horizontalAdvance(str2) < width()) {
4708 break;
4709 }
4710 }
4711 h = fm.height();
4712 if (pix != NULL) {
4713 painter->drawPixmap(10, h + 3, *pix);
4714 pen.setColor(palette().color(QPalette::Text));
4715 painter->setPen(pen);
4716 painter->setFont(info_font);
4717 painter->drawText(10, h, str);
4718 if (highligh_num != -1 && highligh_num < unit_list.count()) {
4719 painter->drawText(10, height() - 5, str2);
4720 }
4721 // Draw scroll
4722 if (more) {
4723 int maxl = ((unit_count - 1) / 4) + 1;
4724 float page_height = 3.0f / maxl;
4725 float page_start = (static_cast<float>(show_line)) / maxl;
4726 pen.setColor(palette().color(QPalette::HighlightedText));
4727 painter->setBrush(palette().color(QPalette::HighlightedText).darker());
4728 painter->setPen(palette().color(QPalette::HighlightedText).darker());
4729 painter->drawRect(pix->width() + 10, h, 8, h + pix->height());
4730 painter->setPen(pen);
4731 painter->drawRoundedRect(pix->width() + 10,
4732 h + page_start * pix->height(),
4733 8, h + page_height * pix->height(), 2, 2);
4734 }
4735 }
4736 if (point_size < 0) {
4737 info_font.setPixelSize(*f_size);
4738 } else {
4739 info_font.setPointSize(*f_size);
4740 }
4741 cw->put_to_corner();
4742}
4743
4744/***********************************************************************/
4748{
4750
4751 painter.begin(this);
4752 paint(&painter, event);
4753 painter.end();
4754}
4755
4756/***********************************************************************/
4761{
4762 was_destroyed = true;
4763 close();
4764 destroy();
4765}
4766
4767/***********************************************************************/
4771{
4772 int i = 1;
4773 struct unit_list *punit_list;
4774
4775 unit_count = 0;
4776 if (utile == NULL) {
4777 struct unit *punit = head_of_units_in_focus();
4778 if (punit) {
4780 }
4781 }
4782 unit_list.clear();
4783 if (utile != nullptr) {
4785 if (punit_list != nullptr) {
4787 unit_count++;
4788 if (i > show_line * 4)
4789 unit_list.push_back(punit);
4790 i++;
4792 }
4793 }
4794 if (unit_list.count() == 0) {
4795 close();
4796 }
4797}
4798
4799/***********************************************************************/
4803{
4804 gui()->mapview_wdg->setFocus();
4805 QWidget::closeEvent(event);
4806}
4807
4808/***********************************************************************/
4812{
4813 int nr;
4814
4815 if (!more && utile == NULL) {
4816 return;
4817 }
4818 nr = qCeil(static_cast<qreal>(unit_list_size(utile->units)) / 4) - 3;
4819 if (event->angleDelta().y() < 0) {
4820 show_line++;
4822 } else {
4823 show_line--;
4824 show_line = qMax(0, show_line);
4825 }
4826 update_units();
4827 create_pixmap();
4828 update();
4829 event->accept();
4830}
4831
4832/***********************************************************************/
4836{
4837 if (event->key() == Qt::Key_Escape) {
4838 was_destroyed = true;
4839 close();
4840 destroy();
4841 }
4842 QWidget::keyPressEvent(event);
4843}
4844
4845/***********************************************************************/
4852
4853/***********************************************************************/
4860
4861/***********************************************************************/
4866{
4867 // Just tell the client common code to handle this.
4868 return false;
4869}
4870
4871/***********************************************************************/
4874bool qtg_request_transport(struct unit *pcargo, struct tile *ptile)
4875{
4876 int tcount;
4878 struct unit_list *potential_transports = unit_list_new();
4879#ifndef FREECIV_NDEBUG
4881#endif
4882
4886 }
4888
4890
4891 if (tcount == 0) {
4894
4895 return false; // Unit was not handled here.
4896 } else if (tcount == 1) {
4897 // There's exactly one potential transport - use it automatically
4900
4902
4903 return true;
4904 }
4905
4906 hul = new hud_unit_loader(pcargo, ptile);
4907 hul->show_me();
4908 return true;
4909}
4910
4911/***********************************************************************/
4915void qtg_popup_combat_info(int attacker_unit_id, int defender_unit_id,
4916 int attacker_hp, int defender_hp,
4917 bool make_att_veteran, bool make_def_veteran)
4918{
4919 if (gui()->qt_settings.show_battle_log) {
4920 hud_unit_combat *huc = new hud_unit_combat(attacker_unit_id,
4921 defender_unit_id,
4922 attacker_hp, defender_hp,
4923 make_att_veteran,
4924 make_def_veteran,
4925 gui()->battlelog_wdg->scale,
4926 gui()->battlelog_wdg);
4927
4928 gui()->battlelog_wdg->add_combat_info(huc);
4929 gui()->battlelog_wdg->show();
4930 }
4931}
4932
4933/**********************************************************************/
4937 struct act_confirmation_data *data)
4938{
4939 hud_message_box *ask = new hud_message_box(gui()->central_wdg);
4940
4941 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
4942 ask->setDefaultButton(QMessageBox::Cancel);
4943 ask->set_text_title(body, hdr);
4944 ask->setAttribute(Qt::WA_DeleteOnClose);
4945 QObject::connect(ask, &hud_message_box::accepted, [=]() {
4947 });
4948 QObject::connect(ask, &hud_message_box::rejected, [=]() {
4950 });
4951
4952 ask->show();
4953}
4954
4955/***********************************************************************/
4959 struct act_confirmation_data *data)
4960{
4962
4963 hdr = QString(_("Are you sure you want to do %1?")).
4965
4966 if (expl != NULL) {
4967 body_text += QString(expl);
4968 }
4969
4971}
4972
4973/**********************************************************************/
4976void qtg_popup_image(const char *tag)
4977{
4978 struct sprite *spr = load_popup_sprite(tag);
4979
4980 if (spr != nullptr) {
4981 QDialog *win = new QDialog(gui());
4982 QVBoxLayout *layout = new QVBoxLayout(win);
4983 QPixmap *pm = new QPixmap(*spr->pm);
4984 QLabel *lbl = new QLabel;
4985 int width, height;
4986
4988 win->setFixedSize(width, height);
4989 lbl->setPixmap(*pm);
4990 layout->addWidget(lbl);
4991 win->setLayout(layout);
4992
4993 win->show();
4994
4996 } else {
4997 log_error(_("No image for tag \"%s\", requested by the server."), tag);
4998 }
4999}
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:3820
Choice_dialog_button(const QString title, pfcn_void func_in, QVariant data1_in, QVariant data2_in)
Definition dialogs.cpp:1334
void setData2(QVariant wariat)
Definition dialogs.cpp:1382
void setData1(QVariant wariat)
Definition dialogs.cpp:1374
pfcn_void getFunc()
Definition dialogs.cpp:1348
void stack_button(Choice_dialog_button *button)
Definition dialogs.cpp:1708
void prev_unit()
Definition dialogs.cpp:1625
QVBoxLayout * layout
Definition dialogs.h:263
struct unit * targeted_unit
Definition dialogs.h:286
void unstack_all_buttons()
Definition dialogs.cpp:1725
Choice_dialog_button * get_identified_button(const int id)
Definition dialogs.cpp:1537
QPushButton * target_unit_button
Definition dialogs.h:262
void set_layout()
Definition dialogs.cpp:1443
void update_dialog(const struct act_prob *act_probs)
Definition dialogs.cpp:1654
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:1390
void next_unit()
Definition dialogs.cpp:1585
QVBoxLayout * get_layout()
Definition dialogs.cpp:1529
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:1672
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:1691
void add_item(QString title, pfcn_void func, QVariant data1, QVariant data2, QString tool_tip, const int button_id)
Definition dialogs.cpp:1485
void put_to_corner()
Definition mapview.cpp:502
void disband_clicked()
Definition dialogs.cpp:3937
disband_box(struct unit_list *punits, QWidget *parent=0)
Definition dialogs.cpp:3911
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:4856
void set_diplo_dialog(choice_dialog *widget)
Definition dialogs.cpp:4848
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:460
int set_text_title(QString s1, QString s2, bool return_exec=false)
QString qheadline
Definition dialogs.h:193
void restart()
Definition dialogs.cpp:908
close_widget * cw
Definition dialogs.h:189
void mouseReleaseEvent(QMouseEvent *event)
Definition dialogs.cpp:1001
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:875
void calc_size(int &x, int &y)
Definition dialogs.cpp:936
void paintEvent(QPaintEvent *paint_event)
Definition dialogs.cpp:955
QPoint cursor
Definition dialogs.h:196
void mouseMoveEvent(QMouseEvent *event)
Definition dialogs.cpp:991
virtual void update_menu()
Definition dialogs.cpp:1009
void mousePressEvent(QMouseEvent *event)
Definition dialogs.cpp:978
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:1110
QPushButton * goto_but
Definition dialogs.h:111
void inspect_city()
Definition dialogs.cpp:1153
struct tile * gtile
Definition dialogs.h:114
QPushButton * inspect_but
Definition dialogs.h:112
void goto_tile()
Definition dialogs.cpp:1144
action_id vs_unit
Definition dialogs.h:60
static qdef_act * action()
Definition dialogs.cpp:1038
action_id vs_city_get()
Definition dialogs.cpp:1076
static qdef_act * m_instance
Definition dialogs.h:58
static void drop()
Definition dialogs.cpp:1049
action_id vs_city
Definition dialogs.h:59
void vs_city_set(int i)
Definition dialogs.cpp:1060
void vs_unit_set(int i)
Definition dialogs.cpp:1068
action_id vs_unit_get()
Definition dialogs.cpp:1084
QPoint point
Definition dialogs.h:81
void paintEvent(QPaintEvent *event)
Definition dialogs.cpp:351
QPixmap close_pix
Definition dialogs.h:83
void reactivate()
Definition dialogs.cpp:343
void mouseMoveEvent(QMouseEvent *event)
Definition dialogs.cpp:392
int titlebar_height
Definition dialogs.h:80
void mousePressEvent(QMouseEvent *event)
Definition dialogs.cpp:402
void mouseReleaseEvent(QMouseEvent *event)
Definition dialogs.cpp:422
qfc_dialog(QWidget *parent)
Definition dialogs.cpp:331
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:1100
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:611
void style_selected(const QItemSelection &selected)
Definition dialogs.cpp:804
void nationset_changed(int index)
Definition dialogs.cpp:1165
int selected_nation
Definition dialogs.h:163
void ok_pressed()
Definition dialogs.cpp:837
void leader_selected(int index)
Definition dialogs.cpp:822
QPushButton * ok_button
Definition dialogs.h:142
QTextEdit * description
Definition dialogs.h:141
void set_index(int index)
Definition dialogs.cpp:694
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:661
QTableWidget * styles
Definition dialogs.h:140
void group_selected(const QItemSelection &selected)
Definition dialogs.cpp:677
struct player * tplayer
Definition dialogs.h:165
races_dialog(struct player *pplayer, QWidget *parent=0)
Definition dialogs.cpp:431
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:754
void cancel_pressed()
Definition dialogs.cpp:1092
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:4802
void update_img()
Definition dialogs.cpp:4660
int show_line
Definition dialogs.h:233
void mouseMoveEvent(QMouseEvent *event)
Definition dialogs.cpp:4604
int highligh_num
Definition dialogs.h:234
void paint(QPainter *painter, QPaintEvent *event)
Definition dialogs.cpp:4669
void update_menu()
Definition dialogs.cpp:4760
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:4424
void update_units()
Definition dialogs.cpp:4770
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:4747
void create_pixmap()
Definition dialogs.cpp:4469
void wheelEvent(QWheelEvent *event)
Definition dialogs.cpp:4811
void keyPressEvent(QKeyEvent *event)
Definition dialogs.cpp:4835
void mousePressEvent(QMouseEvent *event)
Definition dialogs.cpp:4635
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:1051
void request_unit_load(struct unit *pcargo, struct unit *ptrans, struct tile *ptile)
Definition control.c:2156
void unit_focus_set(struct unit *punit)
Definition control.c:506
void request_do_action(action_id action, int actor_id, int target_id, int sub_tgt, const char *name)
Definition control.c:1730
void request_unit_disband(struct unit *punit)
Definition control.c:2075
void request_action_details(action_id action, int actor_id, int target_id)
Definition control.c:1798
void request_new_unit_activity_targeted(struct unit *punit, enum unit_activity act, struct extra_type *tgt)
Definition control.c:1938
void action_confirmation(struct act_confirmation_data *data, bool confirm)
Definition control.c:1766
void action_decision_clear_want(const int old_actor_id)
Definition control.c:1080
void key_unit_wait(void)
Definition control.c:3542
struct unit * head_of_units_in_focus(void)
Definition control.c:410
void request_unit_upgrade(struct unit *punit)
Definition control.c:2106
void action_selection_next_in_focus(const int old_actor_id)
Definition control.c:1092
bool qtg_handmade_scenario_warning()
Definition dialogs.cpp:4865
static void attack(QVariant data1, QVariant data2)
Definition dialogs.cpp:3018
static void wipe_units(QVariant data1, QVariant data2)
Definition dialogs.cpp:2739
char forced_tileset_name[512]
int action_selection_target_extra(void)
Definition dialogs.cpp:4163
static void destroy_city(QVariant data1, QVariant data2)
Definition dialogs.cpp:3395
static void spy_sabotage_unit(QVariant data1, QVariant data2)
Definition dialogs.cpp:2447
static void pillage(QVariant data1, QVariant data2)
Definition dialogs.cpp:2879
static void caravan_marketplace(QVariant data1, QVariant data2)
Definition dialogs.cpp:1739
static void clean(QVariant data1, QVariant data2)
Definition dialogs.cpp:2899
static void spy_steal_shared(QVariant data1, QVariant data2, action_id act_id)
Definition dialogs.cpp:3153
static void spy_sabotage(QVariant data1, QVariant data2)
Definition dialogs.cpp:3786
int action_selection_target_tile(void)
Definition dialogs.cpp:4146
static void spy_investigate(QVariant data1, QVariant data2)
Definition dialogs.cpp:3515
static void act_sel_wait(QVariant data1, QVariant data2)
Definition dialogs.cpp:1908
static void nuke_units(QVariant data1, QVariant data2)
Definition dialogs.cpp:2715
int action_selection_actor_unit(void)
Definition dialogs.cpp:4112
static void capture_units(QVariant data1, QVariant data2)
Definition dialogs.cpp:2751
static void road(QVariant data1, QVariant data2)
Definition dialogs.cpp:2919
static bool is_race_dialog_open
Definition dialogs.cpp:190
static void transport_embark4(QVariant data1, QVariant data2)
Definition dialogs.cpp:2559
bool try_default_unit_action(QVariant q1, QVariant q2)
Definition dialogs.cpp:1550
static void fortify(QVariant data1, QVariant data2)
Definition dialogs.cpp:2389
static void transport_board(QVariant data1, QVariant data2)
Definition dialogs.cpp:2493
static void spy_sabotage_unit_esc(QVariant data1, QVariant data2)
Definition dialogs.cpp:2459
static void disband_unit(QVariant data1, QVariant data2)
Definition dialogs.cpp:2377
static void spy_steal_gold(QVariant data1, QVariant data2)
Definition dialogs.cpp:3410
void popdown_players_report()
Definition plrdlg.cpp:1193
static void spy_escape(QVariant data1, QVariant data2)
Definition dialogs.cpp:3470
static void mine(QVariant data1, QVariant data2)
Definition dialogs.cpp:2961
void popup_musicset_suggestion_dialog(void)
Definition dialogs.cpp:4023
static void spy_steal_gold_esc(QVariant data1, QVariant data2)
Definition dialogs.cpp:3425
static void diplomat_embassy(QVariant data1, QVariant data2)
Definition dialogs.cpp:3500
void unit_select_dialog_popup(struct tile *ptile)
Definition dialogs.cpp:1250
void popup_upgrade_dialog(struct unit_list *punits)
Definition dialogs.cpp:4379
void update_nationset_combo()
Definition dialogs.cpp:1270
void action_selection_close(void)
Definition dialogs.cpp:4317
static void cultivate(QVariant data1, QVariant data2)
Definition dialogs.cpp:2849
static void paradrop_enter(QVariant data1, QVariant data2)
Definition dialogs.cpp:3108
void races_update_pickable(bool nationset_change)
Definition dialogs.cpp:1280
int action_selection_target_city(void)
Definition dialogs.cpp:4129
static void spy_steal_something(QVariant data1, QVariant data2)
Definition dialogs.cpp:3243
#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:1188
static void spy_poison(QVariant data1, QVariant data2)
Definition dialogs.cpp:3320
static void transport_board2(QVariant data1, QVariant data2)
Definition dialogs.cpp:2504
void show_tech_gained_dialog(Tech_type_id tech)
Definition dialogs.cpp:4331
static void base(QVariant data1, QVariant data2)
Definition dialogs.cpp:2940
static void spy_nuke_city_esc(QVariant data1, QVariant data2)
Definition dialogs.cpp:3365
void popup_soundset_suggestion_dialog(void)
Definition dialogs.cpp:3998
static void enter_hut2(QVariant data1, QVariant data2)
Definition dialogs.cpp:2670
void popup_races_dialog(struct player *pplayer)
Definition dialogs.cpp:1225
static void expel_unit(QVariant data1, QVariant data2)
Definition dialogs.cpp:2763
static void paradrop_frighten(QVariant data1, QVariant data2)
Definition dialogs.cpp:3078
static void diplomat_sabotage(QVariant data1, QVariant data2)
Definition dialogs.cpp:3545
void popup_disband_dialog(struct unit_list *punits)
Definition dialogs.cpp:3957
static action_id get_non_targeted_action_id(action_id tgt_action_id)
Definition dialogs.cpp:2272
static void homeless(QVariant data1, QVariant data2)
Definition dialogs.cpp:2415
static void caravan_help_build(QVariant data1, QVariant data2)
Definition dialogs.cpp:1769
void qtg_popup_image(const char *tag)
Definition dialogs.cpp:4976
static void bombard(QVariant data1, QVariant data2)
Definition dialogs.cpp:2775
void popdown_races_dialog(void)
Definition dialogs.cpp:1239
void popup_tileset_suggestion_dialog(void)
Definition dialogs.cpp:3967
static void conquer_city(QVariant data1, QVariant data2)
Definition dialogs.cpp:1850
void revolution_response(struct government *gov)
Definition dialogs.cpp:1923
void popdown_economy_report()
static void join_city(QVariant data1, QVariant data2)
Definition dialogs.cpp:3138
static void spy_request_sabotage_list(QVariant data1, QVariant data2)
Definition dialogs.cpp:3283
static void diplomat_bribe(QVariant data1, QVariant data2)
Definition dialogs.cpp:2429
static void popup_act_confirmation_dialog(QString hdr, QString body, struct act_confirmation_data *data)
Definition dialogs.cpp:4936
static void unit_disband_recover(QVariant data1, QVariant data2)
Definition dialogs.cpp:1784
static void spy_steal(QVariant data1, QVariant data2)
Definition dialogs.cpp:3227
static void airlift(QVariant data1, QVariant data2)
Definition dialogs.cpp:1835
void popup_pillage_dialog(struct unit *punit, bv_extras extras)
Definition dialogs.cpp:3878
void popup_sabotage_dialog(struct unit *actor, struct city *tcity, const struct action *paction)
Definition dialogs.cpp:3816
static void transport_load3(QVariant data1, QVariant data2)
Definition dialogs.cpp:2603
static void bombard_lethal(QVariant data1, QVariant data2)
Definition dialogs.cpp:2811
static void plant(QVariant data1, QVariant data2)
Definition dialogs.cpp:2864
static void nuke(QVariant data1, QVariant data2)
Definition dialogs.cpp:3003
static void disembark2(QVariant data1, QVariant data2)
Definition dialogs.cpp:2640
static void transport_unload(QVariant data1, QVariant data2)
Definition dialogs.cpp:2570
void qtg_request_action_confirmation(const char *expl, struct act_confirmation_data *data)
Definition dialogs.cpp:4958
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:4194
void popdown_science_report()
static void transport_load2(QVariant data1, QVariant data2)
Definition dialogs.cpp:2592
static void diplomat_steal(QVariant data1, QVariant data2)
Definition dialogs.cpp:3575
static void unit_upgrade(QVariant data1, QVariant data2)
Definition dialogs.cpp:1814
bool popup_theme_suggestion_dialog(const char *theme_name)
Definition dialogs.cpp:4048
static void enter_hut(QVariant data1, QVariant data2)
Definition dialogs.cpp:2655
static void spy_request_strike_bld_list(QVariant data1, QVariant data2)
Definition dialogs.cpp:3266
static void diplomat_incite_escape(QVariant data1, QVariant data2)
Definition dialogs.cpp:3623
static void found_city(QVariant data1, QVariant data2)
Definition dialogs.cpp:2823
static void diplomat_investigate(QVariant data1, QVariant data2)
Definition dialogs.cpp:3530
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:4915
static void bombard3(QVariant data1, QVariant data2)
Definition dialogs.cpp:2799
static void transport_deboard(QVariant data1, QVariant data2)
Definition dialogs.cpp:2614
static void diplomat_incite(QVariant data1, QVariant data2)
Definition dialogs.cpp:3605
static void paradrop_conquer(QVariant data1, QVariant data2)
Definition dialogs.cpp:3063
void popdown_endgame_report()
static void diplomat_steal_esc(QVariant data1, QVariant data2)
Definition dialogs.cpp:3590
static bool is_more_user_input_needed
Definition dialogs.cpp:195
static void bombard2(QVariant data1, QVariant data2)
Definition dialogs.cpp:2787
void popup_incite_dialog(struct unit *actor, struct city *tcity, int cost, const struct action *paction)
Definition dialogs.cpp:3657
static const QHash< action_id, pfcn_void > af_map_init(void)
Definition dialogs.cpp:208
void popdown_all_spaceships_dialogs()
static void nuke_city(QVariant data1, QVariant data2)
Definition dialogs.cpp:3380
void popup_connect_msg(const char *headline, const char *message)
Definition dialogs.cpp:1200
static void diplomat_sabotage_esc(QVariant data1, QVariant data2)
Definition dialogs.cpp:3560
void popdown_units_report()
static void transport_embark2(QVariant data1, QVariant data2)
Definition dialogs.cpp:2537
static void spy_nuke_city(QVariant data1, QVariant data2)
Definition dialogs.cpp:3350
void unit_select_dialog_update_real(void *unused)
Definition dialogs.cpp:1262
static void spy_steal_esc(QVariant data1, QVariant data2)
Definition dialogs.cpp:3235
static void paradrop(QVariant data1, QVariant data2)
Definition dialogs.cpp:3048
static void suicide_attack(QVariant data1, QVariant data2)
Definition dialogs.cpp:3033
void races_toggles_set_sensitive(void)
Definition dialogs.cpp:1291
static void transport_load(QVariant data1, QVariant data2)
Definition dialogs.cpp:2581
static action_id get_production_targeted_action_id(action_id tgt_action_id)
Definition dialogs.cpp:2295
static void paradrop_frighten_conquer(QVariant data1, QVariant data2)
Definition dialogs.cpp:3093
static void convert_unit(QVariant data1, QVariant data2)
Definition dialogs.cpp:2403
static bool did_not_decide
Definition dialogs.cpp:199
static void spy_poison_esc(QVariant data1, QVariant data2)
Definition dialogs.cpp:3335
static void pillage_something(QVariant data1, QVariant data2)
Definition dialogs.cpp:3766
static void spy_request_sabotage_esc_list(QVariant data1, QVariant data2)
Definition dialogs.cpp:3301
static void transform_terrain(QVariant data1, QVariant data2)
Definition dialogs.cpp:2834
#define BUTTON_CANCEL
Definition dialogs.cpp:72
static void conquer_extras(QVariant data1, QVariant data2)
Definition dialogs.cpp:1880
static void regular_move(QVariant data1, QVariant data2)
Definition dialogs.cpp:3641
static void heal_unit2(QVariant data1, QVariant data2)
Definition dialogs.cpp:2482
static void transport_board3(QVariant data1, QVariant data2)
Definition dialogs.cpp:2515
static void spy_embassy(QVariant data1, QVariant data2)
Definition dialogs.cpp:3485
static races_dialog * race_dialog
Definition dialogs.cpp:189
static void frighten_hut2(QVariant data1, QVariant data2)
Definition dialogs.cpp:2700
static void conquer_city2(QVariant data1, QVariant data2)
Definition dialogs.cpp:1865
static void conquer_extras2(QVariant data1, QVariant data2)
Definition dialogs.cpp:1894
static void frighten_hut(QVariant data1, QVariant data2)
Definition dialogs.cpp:2685
bool qtg_request_transport(struct unit *pcargo, struct tile *ptile)
Definition dialogs.cpp:4874
int action_selection_target_unit(void)
Definition dialogs.cpp:4180
static void irrigate(QVariant data1, QVariant data2)
Definition dialogs.cpp:2982
static void transport_embark3(QVariant data1, QVariant data2)
Definition dialogs.cpp:2548
static void collect_ransom(QVariant data1, QVariant data2)
Definition dialogs.cpp:2727
static void heal_unit(QVariant data1, QVariant data2)
Definition dialogs.cpp:2471
void popdown_city_report()
Definition cityrep.cpp:1338
static void paradrop_enter_conquer(QVariant data1, QVariant data2)
Definition dialogs.cpp:3123
static void unit_home_city(QVariant data1, QVariant data2)
Definition dialogs.cpp:1799
static void transport_embark(QVariant data1, QVariant data2)
Definition dialogs.cpp:2526
bool try_default_city_action(QVariant q1, QVariant q2)
Definition dialogs.cpp:1568
static void keep_moving(QVariant data1, QVariant data2)
Definition dialogs.cpp:1916
static void spy_steal_maps_esc(QVariant data1, QVariant data2)
Definition dialogs.cpp:3455
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:2348
static void disembark1(QVariant data1, QVariant data2)
Definition dialogs.cpp:2625
void restart_notify_dialogs()
Definition dialogs.cpp:4057
static bool is_showing_pillage_dialog
Definition dialogs.cpp:188
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:2315
static const QHash< action_id, pfcn_void > af_map
Definition dialogs.cpp:326
static void caravan_establish_trade(QVariant data1, QVariant data2)
Definition dialogs.cpp:1754
void popdown_all_game_dialogs(void)
Definition dialogs.cpp:4073
static void spy_steal_maps(QVariant data1, QVariant data2)
Definition dialogs.cpp:3440
struct unit struct city struct unit * target_unit
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 show_tileset_error
Definition dialogs_g.h:85
popup_action_selection
Definition dialogs_g.h:55
struct unit * actor_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 popup_bribe_dialog
Definition dialogs_g.h:73
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:73
const char * caption
Definition dialogs_g.h:37
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:69
const char const char * headline
Definition dialogs_g.h:38
popup_notify_dialog
Definition dialogs_g.h:37
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:86
struct unit struct city struct unit struct tile * target_tile
Definition dialogs_g.h:57
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:74
struct unit struct city * target_city
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 cost
Definition dialogs_g.h:74
struct unit struct city struct unit struct tile struct extra_type * target_extra
Definition dialogs_g.h:57
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:86
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:5099
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:2377
void set_government_choice(struct government *government)
Definition packhand.c:2364
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:160
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:138
int moves_left
Definition unit.h:150
struct unit::@81::@83 client
int id
Definition unit.h:145
int hp
Definition unit.h:151
int fuel
Definition unit.h:153
struct tile * tile
Definition unit.h:140
struct act_prob * act_prob_cache
Definition unit.h:228
int homecity
Definition unit.h:146
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:1795
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:7579
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:6852
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:7587
struct sprite * get_nation_flag_sprite(const struct tileset *t, const struct nation_type *pnation)
Definition tilespec.c:6757
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:397
#define unit_owner(_pu)
Definition unit.h:396
#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