Freeciv-3.3
Loading...
Searching...
No Matches
helpdlg.c
Go to the documentation of this file.
1/***********************************************************************
2 Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2, or (at your option)
6 any later version.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12***********************************************************************/
13
14#ifdef HAVE_CONFIG_H
15#include <fc_config.h>
16#endif
17
18#include <stdio.h>
19#include <stdlib.h>
20#include <string.h>
21#include <math.h> /* sqrt */
22
23#include <gtk/gtk.h>
24
25/* utility */
26#include "fcintl.h"
27#include "mem.h"
28#include "shared.h"
29#include "support.h"
30
31/* common */
32#include "city.h"
33#include "game.h"
34#include "government.h"
35#include "movement.h"
36#include "nation.h"
37#include "specialist.h"
38#include "tech.h"
39#include "unit.h"
40#include "map.h"
41#include "research.h"
42#include "version.h"
43
44/* client */
45#include "client_main.h"
46#include "climisc.h"
47#include "helpdata.h"
48#include "options.h"
49#include "tilespec.h"
50
51/* client/gui-gtk-4.0 */
52#include "colors.h"
53#include "graphics.h"
54#include "gui_main.h"
55#include "gui_stuff.h"
56
57#include "helpdlg.h"
58
59#define TECH_TREE_DEPTH 20
60
61/*
62 * Globals.
63 */
66
68
82
89static GtkWidget *help_ulabel[5][5];
90static GtkWidget *help_tlabel[2][5];
92
93static bool help_advances[A_LAST];
94
97
99{
101 union {
102 enum help_page_type page;
103 const struct requirement *req;
104 } u;
105};
106
107static const char *help_ilabel_name[6] =
108{ N_("Base Cost:"), NULL, N_("Upkeep:"), NULL, N_("Requirement:"), NULL };
110
111static const char *help_wlabel_name[6] =
112{ N_("Base Cost:"), NULL, N_("Requirement:"), NULL, N_("Obsolete by:"), NULL };
114
116
117static const char *help_ulabel_name[5][5] =
118{
119 { N_("Cost:"), NULL, NULL, N_("Attack:"), NULL },
120 { N_("Defense:"), NULL, NULL, N_("Move:"), NULL },
121 { N_("Firepower:"), NULL, NULL, N_("Hitpoints:"), NULL },
122 { N_("Basic Upkeep:"), NULL, NULL, N_("Vision:"), NULL },
123 { N_("Requirement:"), NULL, NULL, N_("Obsolete by:"), NULL }
124};
125
126static const char *help_tlabel_name[2][5] =
127{
128 { N_("Move/Defense:"), NULL, NULL, N_("Food/Res/Trade:"), NULL },
129 { N_("Resources:"), NULL, NULL, NULL, NULL }
130};
131
132static const char *help_elabel_name[6] =
133/* TRANS: Label for build cost for extras in help. Will be followed by
134 * something like "3 MP" (where MP = Movement Points) */
135{ N_("Build:"), NULL,
136/* TRANS: Extra conflicts in help. Will be followed by a list of extras
137 * that can't be built on the same tile as this one. */
138 N_("Conflicts with:"), NULL,
139/* TRANS: Extra bonus in help. Will be followed by food/production/trade
140 * stats like "0/0/+1", "0/+50%/0" */
141 N_("Bonus (F/P/T):"), NULL };
142
143#define REQ_LABEL_NONE _("?tech:None")
144#define REQ_LABEL_NEVER _("(Never)")
145
146static void create_help_dialog(void);
147static void help_update_dialog(const struct help_item *pitem);
148
149static void select_help_item_string(const char *item,
150 enum help_page_type htype);
151static void help_command_update(void);
153
154/**********************************************************************/
169
170/**********************************************************************/
173static void set_title_topic(char *topic)
174{
175 if (strcmp(topic, _(HELP_ABOUT_ITEM)) == 0) {
177 } else {
179 }
180}
181
182/**********************************************************************/
191
192/**********************************************************************/
204
205/**********************************************************************/
213
214/**********************************************************************/
223static void create_tech_tree(int tech, int levels, GtkTreeIter *parent)
224{
225 const struct research *presearch;
226 int bg;
227 int turns_to_tech;
228 bool original;
230 GValue value = { 0, };
231 enum tech_state state;
232
233 if (advance_required(tech, AR_ONE) == A_LAST
234 && advance_required(tech, AR_TWO) == A_LAST) {
236
238 help_advances[tech] = TRUE;
239
241 g_value_set_static_string(&value, _("Removed"));
242 gtk_tree_store_set_value(tstore, &l, 0, &value);
243 g_value_unset(&value);
244
246 1, -1,
247 2, tech,
248 3, &get_color(tileset, bg)->color
249 -1);
250 return;
251 }
252
254
255 state = research_invention_state(presearch, tech);
256 if (tech_state_is_valid(state)) {
257 switch (state) {
258 case TECH_UNKNOWN:
260 break;
261 case TECH_KNOWN:
263 break;
266 break;
267 }
268 } else {
270 }
272
273 /* l is the original in the tree. */
274 original = !help_advances[tech];
275
277 help_advances[tech] = TRUE;
278
282 tech));
283 gtk_tree_store_set_value(tstore, &l, 0, &value);
284 g_value_unset(&value);
285
287 1, turns_to_tech,
288 2, tech,
289 3, &get_color(tileset, bg)->color,
290 -1);
291
292 if (--levels <= 0) {
293 return;
294 }
295
296 if (original) {
297 /* Only add children to originals */
298 if (advance_required(tech, AR_ONE) != A_NONE) {
299 create_tech_tree(advance_required(tech, AR_ONE), levels, &l);
300 }
301 if (advance_required(tech, AR_TWO) != A_NONE) {
302 create_tech_tree(advance_required(tech, AR_TWO), levels, &l);
303 }
304 }
305}
306
307/**********************************************************************/
323
324/**********************************************************************/
331
332/**********************************************************************/
339
340/**********************************************************************/
344{
345 const char *s;
346 struct help_page_selection *select;
348
350 select = (struct help_page_selection *)(g_object_get_data(G_OBJECT(w),
351 "page_type"));
352
353 switch (select->type) {
354 case HPAGE_SRC_ENUM:
355 type = select->u.page;
356 break;
357 case HPAGE_SRC_REQ:
359 break;
360 }
361
362 if (type == HELP_LAST) {
363 return;
364 }
365
366 /* FIXME: May be able to skip, or may need to modify, advances[A_NONE]
367 below, depending on which i18n is done elsewhere.
368 */
369 if (strcmp(s, REQ_LABEL_NEVER) != 0
373 }
374}
375
376/**********************************************************************/
380 struct help_page_selection *select)
381{
382 GtkWidget *button;
383
384 button = gtk_button_new();
388 gtk_widget_set_name(label, "help_link");
389 gtk_button_set_child(GTK_BUTTON(button), label);
391 g_signal_connect_swapped(button, "clicked",
393 g_object_set_data(G_OBJECT(label), "page_type", select);
394
395 return button;
396}
397
398/**********************************************************************/
402 enum help_page_type page)
403{
404 return help_hyperlink_new(label, &(page_selections[page]));
405}
406
407/**********************************************************************/
411 struct help_page_selection *select)
412{
413 GtkWidget *button, *label;
414
415 label = gtk_label_new(txt);
418 button = help_hyperlink_new(label, select);
419
420 return button;
421}
422
423/**********************************************************************/
427 enum help_page_type page)
428{
430}
431
432/**********************************************************************/
453
454/**********************************************************************/
461
462/**********************************************************************/
465static void help_box_clear(void)
466{
468
469 while (child != NULL) {
472 }
473}
474
475/**********************************************************************/
483
484/**********************************************************************/
488{
489 GtkTreePath *path;
491 GtkTreeModel *model;
492 GtkTreeIter it;
493 struct help_item *pitem;
494
496
497 if (model == NULL) {
498 return;
499 }
500
502 gtk_tree_model_get_iter(model, &it, path);
503 gtk_tree_path_free(path);
504
505 if (path == NULL) {
506 return;
507 }
508
509 gtk_tree_model_get(model, &it, 1, &pitem, -1);
510
511 if (help_history_pos >= 0
513 return;
514 }
515
517
518 /* Add to history. */
521 }
523
526}
527
528/**********************************************************************/
531static void create_help_dialog(void)
532{
534 GtkWidget *button;
536 int i, j;
539 GArray *array;
540 GtkTreeStore *store;
541 GtkTreeSelection *selection;
543
545 help_history_pos = -1;
546
547 help_dialog_shell = gtk_dialog_new_with_buttons(_("Freeciv Help Browser"),
548 NULL,
549 0,
550 _("_Back"),
551 1,
552 _("_Forward"),
553 2,
554 _("_Close"),
556 NULL);
561
569
572 hbox);
574
575 /* Build tree store. */
577
578 array = g_array_new(FALSE, FALSE, sizeof(GtkTreeIter));
580 GtkTreeIter *it, *parent;
581 const char *s;
582 int depth;
583
584 for (s = pitem->topic; *s == ' '; s++) {
585 /* Nothing */
586 }
587 depth = s - pitem->topic;
588
589 array = g_array_set_size(array, depth+1);
590
591 if (depth > 0) {
592 parent = &g_array_index(array, GtkTreeIter, depth-1);
593 } else {
594 parent = NULL;
595 }
596
597 it = &g_array_index(array, GtkTreeIter, depth);
598 gtk_tree_store_append(store, it, parent);
599
600 gtk_tree_store_set(store, it, 0, pitem->topic, 1, pitem, -1);
602
603 /* Create tree view. */
605 g_object_unref(store);
608
609 g_signal_connect(help_view, "cursor-changed",
611
614
618
627
632
635
646
649
650 for (i = 0; i < 6; i++) {
651 help_ilabel[i] =
654
655 if (i == 5) {
657 gtk_grid_attach(GTK_GRID(help_itable), button, i, 0, 1, 1);
658 } else {
660 gtk_widget_set_name(help_ilabel[i], "help_label");
661 }
662
664 }
665
668
669 for (i = 0; i < 6; i++) {
670 help_wlabel[i] =
673
674 if (i == 3 || i == 5) {
676 gtk_grid_attach(GTK_GRID(help_wtable), button, i, 0, 1, 1);
677 } else {
679 gtk_widget_set_name(help_wlabel[i], "help_label");
680 }
681
683 }
684
687
688 for (i = 0; i < 5; i++) {
689 for (j = 0; j < 5; j++) {
690 help_ulabel[j][i] =
693
694 if (j == 4 && (i == 1 || i == 4)) {
695 if (i == 1) {
697 } else {
699 }
700
701 gtk_grid_attach(GTK_GRID(help_utable), button, i, j, 1, 1);
702 } else {
704 i, j, 1, 1);
705 gtk_widget_set_name(help_ulabel[j][i], "help_label");
706 }
707
709 }
710 }
711
714
715 for (j = 0; j < 2; j++) {
716 for (i = 0; i < 5; i++) {
717 help_tlabel[j][i] =
720 gtk_widget_set_name(help_tlabel[j][i], "help_label");
721
722 /* Ugly (but these numbers are hardcoded in help_update_terrain() too) */
723 if (j == 1 && i == 1) {
724 /* Extra wide cell for terrain specials */
726 i, j, 4, 1);
728 break; /* Skip rest of row */
729 } else {
731 i, j, 1, 1);
733 }
734 }
735 }
736
739
740 for (i = 0; i < 6; i++) {
744 gtk_grid_attach(GTK_GRID(help_etable), help_elabel[i], i % 4, i / 4, 1, 1);
745 gtk_widget_set_name(help_elabel[i], "help_label");
747 }
748
755
766 gtk_widget_set_name(text, "help_text");
769
775
776 /* Build tech store. */
778 G_TYPE_STRING, /* Tech name */
779 G_TYPE_INT, /* Turns to tech */
780 G_TYPE_INT, /* Tech id */
781 GDK_TYPE_RGBA); /* Color */
787
788 g_signal_connect(help_tree, "row_activated",
790
791
793
798 "text", 0,
799 "background-rgba", 3,
800 NULL);
802 g_object_set(rend, "weight", PANGO_WEIGHT_BOLD, "xalign", 1.0, NULL);
805 "text", 1,
806 "background-rgba", 3,
807 NULL);
808
810
818
821
826
832}
833
834/**********************************************************************/
838{
839 if (spr == nullptr) {
840 return;
841 }
842
845}
846
847/**********************************************************************/
877
878/**********************************************************************/
905
906/**********************************************************************/
909static void help_update_improvement(const struct help_item *pitem,
910 char *title)
911{
912 char buf[8192];
914
915 if (imp != NULL && !is_great_wonder(imp)) {
917 char req_buf[512];
918
921 sprintf(buf, "%d", imp->upkeep);
923
924 /* FIXME: this should show ranges, negated reqs, and all the reqs.
925 * Currently it's limited to 1 req but this code is partially prepared
926 * to be extended. */
929 if (!preq->present) {
930 continue;
931 }
932 req = universal_name_translation(&preq->source, req_buf, sizeof(req_buf));
934 break;
937/* create_tech_tree(help_improvement_tree, 0, imp->tech_req, 3); */
938 } else {
942/* create_tech_tree(help_improvement_tree, 0, advance_count(), 3); */
943 }
944
946
948
949 helptext_building(buf, sizeof(buf), client_player(), pitem->text, imp);
952}
953
954/**********************************************************************/
957static void help_update_wonder(const struct help_item *pitem,
958 char *title)
959{
960 char buf[8192];
962
963 if (imp != NULL && is_great_wonder(imp)) {
964 int i;
965 char req_buf[512];
966
969
970 /* FIXME: this should show ranges, negated reqs, and all the reqs.
971 * Currently it's limited to 1 req but this code is partially prepared
972 * to be extended. */
973 i = 0;
976 if (!preq->present) {
977 continue;
978 }
981 req_buf, sizeof(req_buf)));
983 i++;
984 break;
986
988 requirement_vector_iterate(&imp->obsolete_by, pobs) {
989 if (pobs->source.kind == VUT_ADVANCE && pobs->present) {
992 (pobs->source.value.advance));
993
994 break;
995 }
997
998/* create_tech_tree(help_improvement_tree, 0, imp->tech_req, 3); */
999 } else {
1000 /* Can't find wonder */
1004/* create_tech_tree(help_improvement_tree, 0, advance_count(), 3); */
1005 }
1006
1008
1010
1011 helptext_building(buf, sizeof(buf), client_player(), pitem->text, imp);
1014}
1015
1016/**********************************************************************/
1019static void help_update_unit_type(const struct help_item *pitem,
1020 char *title)
1021{
1022 char buf[8192];
1024
1025 if (utype != NULL) {
1028 sprintf(buf, "%d", utype->attack_strength);
1030 sprintf(buf, "%d", utype->defense_strength);
1032 sprintf(buf, "%s", move_points_text(utype->move_rate, TRUE));
1034 sprintf(buf, "%d", utype->firepower);
1036 sprintf(buf, "%d", utype->hp);
1040 sprintf(buf, "%d", (int)sqrt((double)utype->vision_radius_sq));
1044
1045#if 0
1047 advance_number(utype->require_advance), 3);
1048#endif
1049
1050 if (U_NOT_OBSOLETED == utype->obsoleted_by) {
1053 } else {
1056 }
1057
1058 helptext_unit(buf, sizeof(buf), client_player(), pitem->text, utype,
1059 TRUE);
1060
1063
1067 } else {
1076
1078/* create_tech_tree(help_improvement_tree, 0, A_LAST, 3); */
1081
1084 }
1085
1087}
1088
1089/**********************************************************************/
1092static char *fc_chomp(char *str, size_t len)
1093{
1094 gchar *i;
1095
1096 if (str == NULL || !*str) {
1097 return str;
1098 }
1099
1100 i = str + len;
1101 for (i = g_utf8_find_prev_char(str, i);
1104 *i = '\0';
1105 }
1106
1107 return str;
1108}
1109
1110/**********************************************************************/
1113static void help_update_tech(const struct help_item *pitem, char *title)
1114{
1115 int j;
1116 GtkWidget *w, *hbox;
1117 char buf[8192];
1119
1122 size_t len;
1124
1126
1127 for (j = 0; j < ARRAY_SIZE(help_advances); j++) {
1128 help_advances[j] = FALSE;
1129 }
1130
1135
1136 helptext_advance(buf, sizeof(buf), client.conn.playing, pitem->text, i);
1137 len = strlen(buf);
1138 fc_chomp(buf, len);
1139
1141
1142 w = gtk_text_view_new();
1147 gtk_widget_set_name(w, "help_text");
1153 help_box_add(w);
1155
1157 if (txt != nullptr) {
1159 }
1160
1168 help_box_add(w);
1170
1172 /* FIXME: need a more general mechanism for this, since this
1173 * helptext needs to be shown in all possible req source types. */
1175 if (VUT_ADVANCE == preq->source.kind
1176 && preq->source.value.advance == padvance) {
1179 w = gtk_label_new(_("Allows"));
1185 }
1188
1189 improvement_iterate(pimprove) {
1190 if (valid_improvement(pimprove)) {
1191 requirement_vector_iterate(&pimprove->reqs, preq) {
1192 if (VUT_ADVANCE == preq->source.kind
1193 && preq->source.value.advance == padvance) {
1196 w = gtk_label_new(_("Allows"));
1199 is_great_wonder(pimprove)
1200 ? HELP_WONDER
1204 }
1206 requirement_vector_iterate(&pimprove->obsolete_by, pobs) {
1207 if (pobs->source.kind == VUT_ADVANCE
1208 && pobs->source.value.advance == padvance
1209 && pobs->present) {
1212 w = gtk_label_new(_("Obsoletes"));
1215 is_great_wonder(pimprove)
1216 ? HELP_WONDER
1220 }
1222 }
1224
1227 continue;
1228 }
1229
1232 w = gtk_label_new(_("Allows"));
1238
1244 w = gtk_label_new(_("Allows"));
1249 } else {
1252 w = gtk_label_new(_("Allows"));
1256 w = gtk_label_new(_("with"));
1259 AR_TWO)),
1260 HELP_TECH);
1262 w = gtk_label_new(Q_("?techhelp:"));
1265 }
1266 }
1270 w = gtk_label_new(_("Allows"));
1274 w = gtk_label_new(_("with"));
1277 AR_ONE)),
1278 HELP_TECH);
1280 w = gtk_label_new(Q_("?techhelp:"));
1283 }
1285
1287 }
1288}
1289
1290/**********************************************************************/
1312
1313/**********************************************************************/
1317 enum unit_activity act,
1318 char *label)
1319{
1320 enum extra_cause cause = activity_to_extra_cause(act);
1321
1322 extra_type_by_cause_iterate(cause, pextra) {
1323 if (pextra->buildable
1324 && requirement_fulfilled_by_terrain(pterr, &(pextra->reqs))) {
1328 act));
1329 }
1331}
1332
1333/**********************************************************************/
1336static void help_update_terrain(const struct help_item *pitem,
1337 char *title)
1338{
1339 char buf[8192];
1340 struct terrain *pterrain = terrain_by_translated_name(title);
1341
1342 if (pterrain != NULL) {
1343 struct universal for_terr = { .kind = VUT_TERRAIN, .value = { .terrain = pterrain }};
1344
1346
1347 {
1348 /* 25 => "1.25"; 50 => "1.5"; 100 => "2.0" */
1349 int defbonus = pterrain->defense_bonus + 100;
1350 int frac = defbonus % 100;
1351
1352 if ((frac % 10) == 0) {
1353 frac /= 10;
1354 }
1355 sprintf(buf, "%d/%d.%d",
1356 pterrain->movement_cost, defbonus / 100, frac);
1357 }
1359
1360 sprintf(buf, "%d/%d/%d",
1361 pterrain->output[O_FOOD],
1362 pterrain->output[O_SHIELD],
1363 pterrain->output[O_TRADE]);
1365
1366 buf[0] = '\0';
1367 if (*(pterrain->resources)) {
1368 struct extra_type **r;
1369
1370 /* TODO: include resource frequency information */
1371 for (r = pterrain->resources; *r; r++) {
1372 /* TRANS: " Whales (2/1/2)," */
1373 sprintf (buf + strlen (buf), " %s (%d/%d/%d),",
1375 pterrain->output[O_FOOD] + (*r)->data.resource->output[O_FOOD],
1376 pterrain->output[O_SHIELD] + (*r)->data.resource->output[O_SHIELD],
1377 pterrain->output[O_TRADE] + (*r)->data.resource->output[O_TRADE]);
1378 }
1379 buf[strlen (buf) - 1] = '.';
1380 } else {
1381 /* TRANS: "Resources: (none)" */
1382 sprintf (buf + strlen (buf), _("(none)"));
1383 }
1385
1387
1388 if (pterrain->cultivate_result != T_NONE
1390 NULL, &for_terr)) {
1391 fc_snprintf(buf, sizeof(buf),
1392 PL_("%d turn", "%d turns", pterrain->cultivate_time),
1393 pterrain->cultivate_time);
1394 add_act_help_for_terrain(_("Cultivate Rslt/Time"),
1396 HELP_TERRAIN, buf);
1397 }
1398
1399 if (pterrain->plant_result != T_NONE
1401 fc_snprintf(buf, sizeof(buf),
1402 PL_("%d turn", "%d turns", pterrain->plant_time),
1403 pterrain->plant_time);
1404 add_act_help_for_terrain(_("Plant Rslt/Time"),
1406 HELP_TERRAIN, buf);
1407 }
1408
1409 if (pterrain->transform_result != T_NONE
1411 NULL, &for_terr)) {
1412 fc_snprintf(buf, sizeof(buf),
1413 PL_("%d turn", "%d turns", pterrain->transform_time),
1414 pterrain->transform_time);
1415 add_act_help_for_terrain(_("Trans. Rslt/Time"),
1417 HELP_TERRAIN, buf);
1418 }
1419
1422 _("Build as irrigation"));
1423 }
1426 _("Build as mine"));
1427 }
1430 _("Build as road"));
1431 }
1434 _("Build as base"));
1435 }
1437 }
1438
1440 pitem->text, pterrain);
1441
1444
1446}
1447
1448/**********************************************************************/
1451static void help_update_extra(const struct help_item *pitem, char *title)
1452{
1453 char buf[8192];
1455
1456 buf[0] = '\0';
1457 if (pextra == NULL) {
1458 strcat(buf, pitem->text);
1459 } else {
1460 struct road_type *proad = extra_road_get(pextra);
1462
1464
1465 /* Cost to build */
1466 if (pextra->buildable) {
1467 if (pextra->build_time != 0) {
1468 /* TRANS: "MP" = movement points */
1469 sprintf(buf, _("%d MP"), pextra->build_time);
1470 } else {
1471 /* TRANS: Build time depends on terrain. */
1472 sprintf(buf, _("Terrain specific"));
1473 }
1474 } else {
1475 sprintf(buf, "-");
1476 }
1478 /* Conflicting extras */
1479 buf[0] = '\0';
1480 if (is_resource) {
1481 /* TRANS: (Resource extra) Conflicts with: */
1482 strcat(buf, _("Other Resources"));
1483 }
1485 if (!can_extras_coexist(pextra, pextra2)
1487 if (buf[0] != '\0') {
1488 strcat(buf, "/");
1489 }
1491 }
1493 /* TRANS: "Conflicts with: (none)" (extras) */
1494 gtk_label_set_text(GTK_LABEL(help_elabel[3]), buf[0] ? buf : _("(none)"));
1495
1496 /* Bonus */
1497 if (proad != nullptr) {
1498 const char *bonus = nullptr;
1499
1501 if (proad->tile_incr[o] > 0) {
1502 /* TRANS: Road bonus depends on terrain. */
1503 bonus = _("Terrain specific");
1504 break;
1505 }
1507 if (bonus == nullptr) {
1508 bonus = helptext_road_bonus_str(nullptr, proad);
1509
1510 if (bonus == nullptr) {
1511 /* TRANS: No output bonus from a road */
1512 bonus = Q_("?bonus:None");
1513 }
1514 }
1518 } else {
1521 }
1522
1523 helptext_extra(buf, sizeof(buf), client.conn.playing, pitem->text, pextra);
1524 }
1526
1529}
1530
1531/**********************************************************************/
1534static void help_update_goods(const struct help_item *pitem,
1535 char *title)
1536{
1537 char buf[8192];
1539
1540 if (pgood == nullptr) {
1541 strcat(buf, pitem->text);
1542 } else {
1543 helptext_goods(buf, sizeof(buf), client.conn.playing, pitem->text,
1544 pgood);
1545 }
1546
1549}
1550
1551/**********************************************************************/
1554static void help_update_specialist(const struct help_item *pitem,
1555 char *title)
1556{
1557 char buf[8192];
1559
1560 if (pspec == nullptr) {
1561 strcat(buf, pitem->text);
1562 } else {
1564 pspec);
1565 }
1566
1569}
1570
1571/**********************************************************************/
1574static void help_update_government(const struct help_item *pitem,
1575 char *title)
1576{
1577 char buf[8192];
1579
1580 if (gov == nullptr) {
1581 strcat(buf, pitem->text);
1582 } else {
1584 pitem->text, gov);
1585 }
1586
1589}
1590
1591/**********************************************************************/
1594static void help_update_nation(const struct help_item *pitem, char *title,
1595 struct nation_type *pnation)
1596{
1597 char buf[4096];
1598
1599 if (pnation == nullptr) {
1600 strcat(buf, pitem->text);
1601 } else {
1602 helptext_nation(buf, sizeof(buf), pnation, pitem->text);
1603
1605 }
1606
1609}
1610
1611/**********************************************************************/
1614static void help_update_dialog(const struct help_item *pitem)
1615{
1616 char *top;
1617
1618 /* Figure out what kind of item is required for pitem ingo */
1619
1620 for (top = pitem->topic; *top == ' '; top++) {
1621 /* Nothing */
1622 }
1623
1624 help_box_hide();
1626
1627 switch (pitem->type) {
1628 case HELP_IMPROVEMENT:
1630 break;
1631 case HELP_WONDER:
1633 break;
1634 case HELP_UNIT:
1636 break;
1637 case HELP_TECH:
1638 help_update_tech(pitem, top);
1639 break;
1640 case HELP_TERRAIN:
1642 break;
1643 case HELP_EXTRA:
1645 break;
1646 case HELP_GOODS:
1648 break;
1649 case HELP_SPECIALIST:
1651 break;
1652 case HELP_GOVERNMENT:
1654 break;
1655 case HELP_NATIONS:
1657 break;
1658 case HELP_TEXT:
1659 default:
1660 /* It was a pure text item */
1663 break;
1664 }
1665 set_title_topic(pitem->topic);
1666
1668}
1669
1670/**********************************************************************/
1673static void help_item_zoom(GtkTreePath *path)
1674{
1675 GtkTreeModel *model;
1676 GtkTreeIter it, child, item;
1677 GtkTreeSelection *selection;
1678
1680 gtk_tree_model_get_iter(model, &item, path);
1681
1682 for (child = item; gtk_tree_model_iter_parent(model, &it, &child); child = it) {
1684
1685 it_path = gtk_tree_model_get_path(model, &it);
1688 }
1689
1693 TRUE, 0.0, 0.0);
1694}
1695
1696/**********************************************************************/
1700{
1701 GtkTreePath *path;
1702 bool next;
1703
1704 path = gtk_tree_path_new_first();
1705 next = FALSE;
1707 const char *s;
1708 int depth;
1709
1710 for (s = pitem2->topic; *s == ' '; s++) {
1711 /* Nothing */
1712 }
1713 depth = s - pitem2->topic + 1;
1714
1715 while (depth < gtk_tree_path_get_depth(path)) {
1716 gtk_tree_path_up(path);
1717 gtk_tree_path_next(path);
1718 next = FALSE;
1719 }
1720 while (depth > gtk_tree_path_get_depth(path)) {
1721 gtk_tree_path_down(path);
1722 next = FALSE;
1723 }
1724
1725 if (next) {
1726 gtk_tree_path_next(path);
1727 }
1728
1729 if (pitem == pitem2) {
1730 break;
1731 }
1732
1733 next = TRUE;
1735
1736 return path;
1737}
1738
1739/**********************************************************************/
1742static void select_help_item_string(const char *item, enum help_page_type htype)
1743{
1744 const struct help_item *pitem;
1745 int idx;
1746 GtkTreePath *path;
1748
1749 if (!(pitem = get_help_item_spec(item, htype, &idx))) {
1750 return;
1751 }
1752
1753 path = help_item_path(pitem);
1754 help_item_zoom(path);
1755
1758 gtk_tree_path_free(path);
1759}
1760
1761/**********************************************************************/
1764static void help_command_update(void)
1765{
1767
1768 if (help_history_pos < 0) {
1771 } else {
1774
1775 if (help_history_pos == 0) {
1777 }
1778 if (help_history_pos >= help_history->len - 1) {
1780 }
1781 }
1782}
1783
1784/**********************************************************************/
1788{
1789 GtkTreePath *path;
1790 const struct help_item *pitem;
1791
1792 if (response_id == 1) {
1793 if (help_history_pos > 0) {
1795
1797 path = help_item_path(pitem);
1798 help_item_zoom(path);
1801 }
1802 } else if (response_id == 2) {
1805
1807 path = help_item_path(pitem);
1808 help_item_zoom(path);
1811 }
1812 } else {
1813 /* Save size of the dialog. */
1818 }
1819}
#define action_id_univs_not_blocking(act_id, act_uni, tgt_uni)
Definition actions.h:714
#define str
Definition astring.c:76
#define output_type_iterate(output)
Definition city.h:842
#define output_type_iterate_end
Definition city.h:848
struct civclient client
#define client_player()
struct color * get_color(const struct tileset *t, enum color_std stdcolor)
char * incite_cost
Definition comments.c:76
struct extra_type * extra_type_by_translated_name(const char *name)
Definition extras.c:235
enum extra_cause activity_to_extra_cause(enum unit_activity act)
Definition extras.c:1090
bool can_extras_coexist(const struct extra_type *pextra1, const struct extra_type *pextra2)
Definition extras.c:1017
const char * extra_name_translation(const struct extra_type *pextra)
Definition extras.c:194
#define extra_type_iterate(_p)
Definition extras.h:315
#define extra_type_iterate_end
Definition extras.h:321
#define is_extra_caused_by(e, c)
Definition extras.h:203
#define extra_road_get(_e_)
Definition extras.h:191
#define extra_type_by_cause_iterate_end
Definition extras.h:339
#define extra_type_by_cause_iterate(_cause, _extra)
Definition extras.h:333
int Tech_type_id
Definition fc_types.h:237
@ O_SHIELD
Definition fc_types.h:102
@ O_FOOD
Definition fc_types.h:102
@ O_TRADE
Definition fc_types.h:102
const char * skip_intl_qualifier_prefix(const char *str)
Definition fcintl.c:48
#define Q_(String)
Definition fcintl.h:70
#define PL_(String1, String2, n)
Definition fcintl.h:71
#define _(String)
Definition fcintl.h:67
#define N_(String)
Definition fcintl.h:69
const char * government_name_translation(const struct government *pgovern)
Definition government.c:143
struct government * government_by_translated_name(const char *name)
Definition government.c:40
#define governments_iterate(NAME_pgov)
Definition government.h:124
#define governments_iterate_end
Definition government.h:127
#define FC_STATIC_CANVAS_INIT
Definition canvas.h:28
GtkWidget * toplevel
Definition gui_main.c:126
#define GUI_GTK_OPTION(optname)
Definition gui_main.h:32
void setup_dialog(GtkWidget *shell, GtkWidget *parent)
Definition gui_stuff.c:287
static GtkWidget * help_tree_sw
Definition helpdlg.c:83
static void set_title_topic(char *topic)
Definition helpdlg.c:173
static void activated_topic(GtkTreeView *view, gpointer data)
Definition helpdlg.c:470
static GtkWidget * help_tree
Definition helpdlg.c:80
static GtkWidget * help_tree_expand
Definition helpdlg.c:84
static GtkWidget * help_ulabel[5][5]
Definition helpdlg.c:89
static void help_update_specialist(const struct help_item *pitem, char *title)
Definition helpdlg.c:1506
static void help_hyperlink_callback(GtkWidget *w)
Definition helpdlg.c:346
static GtkWidget * help_elabel[6]
Definition helpdlg.c:91
static GtkWidget * help_etable
Definition helpdlg.c:79
static void help_destroy_callback(GtkWidget *w, gpointer data)
Definition helpdlg.c:461
static void set_help_tile_from_extra(const struct extra_type *pextra)
Definition helpdlg.c:851
static GtkWidget * help_frame
Definition helpdlg.c:69
static void help_tech_tree_activated_callback(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data)
Definition helpdlg.c:313
static void help_update_tech(const struct help_item *pitem, char *title)
Definition helpdlg.c:1074
static void help_item_zoom(GtkTreePath *path)
Definition helpdlg.c:1624
static GtkWidget * help_slink_new_page(const gchar *txt, enum help_page_type page)
Definition helpdlg.c:428
static GtkWidget * help_tlabel[2][5]
Definition helpdlg.c:90
static GtkTreePath * help_item_path(const struct help_item *pitem)
Definition helpdlg.c:1650
static GtkWidget * help_tree_collapse
Definition helpdlg.c:85
static void help_update_nation(const struct help_item *pitem, char *title, struct nation_type *pnation)
Definition helpdlg.c:1545
static void create_help_dialog(void)
Definition helpdlg.c:510
static GtkTextBuffer * help_text
Definition helpdlg.c:70
static void help_update_wonder(const struct help_item *pitem, char *title)
Definition helpdlg.c:927
static GtkWidget * help_hyperlink_new_page(GtkWidget *label, enum help_page_type page)
Definition helpdlg.c:403
static GtkWidget * help_dialog_shell
Definition helpdlg.c:64
static GtkWidget * help_text_sw
Definition helpdlg.c:71
static GPtrArray * help_history
Definition helpdlg.c:95
static const char * help_elabel_name[6]
Definition helpdlg.c:132
static void create_tech_tree(int tech, int levels, GtkTreeIter *parent)
Definition helpdlg.c:226
static void help_update_extra(const struct help_item *pitem, char *title)
Definition helpdlg.c:1404
static GtkWidget * help_ilabel[6]
Definition helpdlg.c:87
static void set_help_tile_from_sprite(struct sprite *spr)
Definition helpdlg.c:807
static const char * help_wlabel_name[6]
Definition helpdlg.c:111
static const char * help_ulabel_name[5][5]
Definition helpdlg.c:117
static void help_tech_tree_collapse_callback(GtkWidget *w, gpointer data)
Definition helpdlg.c:338
static void set_help_tile_from_terrain(struct terrain *pterr)
Definition helpdlg.c:820
static GtkWidget * help_view
Definition helpdlg.c:67
static void help_update_goods(const struct help_item *pitem, char *title)
Definition helpdlg.c:1486
void help_system_init(void)
Definition helpdlg.c:157
static void help_box_hide(void)
Definition helpdlg.c:437
static void help_update_unit_type(const struct help_item *pitem, char *title)
Definition helpdlg.c:989
void popdown_help_dialog(void)
Definition helpdlg.c:186
static void help_update_terrain(const struct help_item *pitem, char *title)
Definition helpdlg.c:1289
static void help_update_dialog(const struct help_item *pitem)
Definition helpdlg.c:1565
static char * fc_chomp(char *str, size_t len)
Definition helpdlg.c:1054
void popup_help_dialog_string(const char *item)
Definition helpdlg.c:212
static int help_history_pos
Definition helpdlg.c:96
static struct help_page_selection help_wndr_req
Definition helpdlg.c:113
static GtkWidget * help_wlabel[6]
Definition helpdlg.c:88
static GtkWidget * help_box
Definition helpdlg.c:74
static void help_extras_of_act_for_terrain(struct terrain *pterr, enum unit_activity act, char *label)
Definition helpdlg.c:1269
void popup_help_dialog_typed(const char *item, enum help_page_type htype)
Definition helpdlg.c:196
#define REQ_LABEL_NEVER
Definition helpdlg.c:144
static void help_command_update(void)
Definition helpdlg.c:1714
static struct help_page_selection page_selections[HELP_LAST]
Definition helpdlg.c:115
#define TECH_TREE_DEPTH
Definition helpdlg.c:59
static const char * help_tlabel_name[2][5]
Definition helpdlg.c:126
static struct help_page_selection help_impr_req
Definition helpdlg.c:109
#define REQ_LABEL_NONE
Definition helpdlg.c:143
static GtkWidget * help_wtable
Definition helpdlg.c:76
static GtkWidget * help_slink_new(const gchar *txt, struct help_page_selection *select)
Definition helpdlg.c:412
static GtkWidget * help_vbox
Definition helpdlg.c:72
static void help_tech_tree_expand_callback(GtkWidget *w, gpointer data)
Definition helpdlg.c:330
static GtkWidget * help_tile
Definition helpdlg.c:73
static GtkWidget * help_hyperlink_new(GtkWidget *label, struct help_page_selection *select)
Definition helpdlg.c:381
static void help_update_government(const struct help_item *pitem, char *title)
Definition helpdlg.c:1526
static GtkWidget * help_ttable
Definition helpdlg.c:78
static void help_update_improvement(const struct help_item *pitem, char *title)
Definition helpdlg.c:879
static const char * help_ilabel_name[6]
Definition helpdlg.c:107
static GtkWidget * help_tree_buttons_hbox
Definition helpdlg.c:86
static GtkWidget * help_view_sw
Definition helpdlg.c:65
static void select_help_item_string(const char *item, enum help_page_type htype)
Definition helpdlg.c:1692
static bool help_advances[A_LAST]
Definition helpdlg.c:93
static GtkWidget * help_utable
Definition helpdlg.c:77
static GtkWidget * help_itable
Definition helpdlg.c:75
static GtkTreeStore * tstore
Definition helpdlg.c:81
static void add_act_help_for_terrain(const char *act_label, const char *result_link_label, enum help_page_type result_link_type, const char *descr_label)
Definition helpdlg.c:1246
static void help_command_callback(GtkWidget *w, gint response_id)
Definition helpdlg.c:1737
const char * title
Definition repodlgs.c:1314
GType type
Definition repodlgs.c:1313
static void help_box_add(GtkWidget *wdg)
Definition helpdlg.c:457
static void help_box_clear(void)
Definition helpdlg.c:465
void picture_set_from_surface(GtkPicture *pic, cairo_surface_t *surf)
Definition sprite.c:544
void helptext_government(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, struct government *gov)
Definition helpdata.c:4387
void helptext_advance(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, int i)
Definition helpdata.c:3346
enum help_page_type help_type_by_requirement(const struct requirement *req)
Definition helpdata.c:5252
char * helptext_unit(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, const struct unit_type *utype, bool class_help)
Definition helpdata.c:1992
void helptext_extra(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, struct extra_type *pextra)
Definition helpdata.c:3841
void helptext_goods(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, struct goods_type *pgood)
Definition helpdata.c:4306
const char * helptext_road_bonus_str(const struct terrain *pterrain, const struct road_type *proad)
Definition helpdata.c:3677
char * helptext_unit_upkeep_str(const struct unit_type *utype)
Definition helpdata.c:5049
const char * helptext_extra_for_terrain_str(struct extra_type *pextra, struct terrain *pterrain, enum unit_activity act)
Definition helpdata.c:3807
void helptext_specialist(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, struct specialist *pspec)
Definition helpdata.c:4352
const struct help_item * get_help_item_spec(const char *name, enum help_page_type htype, int *pos)
Definition helpdata.c:1346
char * helptext_building(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, const struct impr_type *pimprove)
Definition helpdata.c:1439
void helptext_terrain(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, struct terrain *pterrain)
Definition helpdata.c:3567
void helptext_nation(char *buf, size_t bufsz, struct nation_type *pnation, const char *user_text)
Definition helpdata.c:5086
#define help_items_iterate(pitem)
Definition helpdata.h:72
#define help_items_iterate_end
Definition helpdata.h:76
#define HELP_ABOUT_ITEM
help_page_type
Definition helpdlg_g.h:20
@ HELP_ANY
Definition helpdlg_g.h:20
@ HELP_TERRAIN
Definition helpdlg_g.h:21
@ HELP_EXTRA
Definition helpdlg_g.h:21
@ HELP_NATIONS
Definition helpdlg_g.h:24
@ HELP_LAST
Definition helpdlg_g.h:25
@ HELP_IMPROVEMENT
Definition helpdlg_g.h:20
@ HELP_UNIT
Definition helpdlg_g.h:20
@ HELP_SPECIALIST
Definition helpdlg_g.h:22
@ HELP_GOVERNMENT
Definition helpdlg_g.h:22
@ HELP_GOODS
Definition helpdlg_g.h:22
@ HELP_WONDER
Definition helpdlg_g.h:21
@ HELP_TECH
Definition helpdlg_g.h:21
@ HELP_TEXT
Definition helpdlg_g.h:20
const struct impr_type * valid_improvement(const struct impr_type *pimprove)
int impr_base_build_shield_cost(const struct impr_type *pimprove)
bool is_great_wonder(const struct impr_type *pimprove)
struct impr_type * improvement_by_translated_name(const char *name)
const char * improvement_name_translation(const struct impr_type *pimprove)
#define improvement_iterate_end
#define improvement_iterate(_p)
void put_drawn_sprites(struct canvas *pcanvas, float zoom, int canvas_x, int canvas_y, int count, struct drawn_sprite *pdrawn, bool fog)
const char * move_points_text(int mp, bool reduce)
Definition movement.c:1066
struct nation_type * nation_by_translated_plural(const char *name)
Definition nation.c:106
int len
Definition packhand.c:127
const char * universal_name_translation(const struct universal *psource, char *buf, size_t bufsz)
#define requirement_fulfilled_by_terrain(_ter_, _rqs_)
#define requirement_vector_iterate_end
#define requirement_vector_iterate(req_vec, preq)
int research_goal_unknown_techs(const struct research *presearch, Tech_type_id goal)
Definition research.c:750
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
#define ARRAY_SIZE(x)
Definition shared.h:85
struct specialist * specialist_by_translated_name(const char *name)
Definition specialist.c:130
cairo_surface_t * surface
Definition canvas.h:23
struct connection conn
Definition client_main.h:96
Definition colors.h:21
struct player * playing
Definition connection.h:151
bool buildable
Definition extras.h:116
int build_time
Definition extras.h:118
char * text
Definition helpdata.h:26
enum help_page_type page
Definition helpdlg.c:102
enum help_page_selection::@159 type
union help_page_selection::@160 u
const struct requirement * req
Definition helpdlg.c:103
Definition climisc.h:82
struct terrain * cultivate_result
Definition terrain.h:108
struct extra_type ** resources
Definition terrain.h:97
int plant_time
Definition terrain.h:112
struct terrain * plant_result
Definition terrain.h:111
int defense_bonus
Definition terrain.h:93
int cultivate_time
Definition terrain.h:109
int movement_cost
Definition terrain.h:92
int output[O_LAST]
Definition terrain.h:95
int transform_time
Definition terrain.h:124
struct terrain * transform_result
Definition terrain.h:122
int defense_strength
Definition unittype.h:521
int firepower
Definition unittype.h:530
const struct unit_type * obsoleted_by
Definition unittype.h:534
int vision_radius_sq
Definition unittype.h:527
int move_rate
Definition unittype.h:522
int attack_strength
Definition unittype.h:520
enum universals_n kind
Definition fc_types.h:609
int fc_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:960
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
struct advance * advance_by_number(const Tech_type_id atype)
Definition tech.c:107
struct advance * advance_by_translated_name(const char *name)
Definition tech.c:185
struct advance * advance_requires(const struct advance *padvance, enum tech_req require)
Definition tech.c:136
const char * advance_name_translation(const struct advance *padvance)
Definition tech.c:300
Tech_type_id advance_required(const Tech_type_id tech, enum tech_req require)
Definition tech.c:121
bool is_regular_advance(struct advance *padvance)
Definition tech.c:290
Tech_type_id advance_number(const struct advance *padvance)
Definition tech.c:98
#define advance_iterate_all_end
Definition tech.h:275
@ AR_TWO
Definition tech.h:107
@ AR_ONE
Definition tech.h:106
#define advance_iterate_all(_p)
Definition tech.h:274
#define A_NONE
Definition tech.h:43
#define A_LAST
Definition tech.h:45
struct terrain * terrain_by_translated_name(const char *name)
Definition terrain.c:201
const char * terrain_name_translation(const struct terrain *pterrain)
Definition terrain.c:237
#define T_NONE
Definition terrain.h:61
struct sprite * get_building_sprite(const struct tileset *t, const struct impr_type *pimprove)
Definition tilespec.c:7030
int fill_basic_extra_sprite_array(const struct tileset *t, struct drawn_sprite *sprs, const struct extra_type *pextra)
Definition tilespec.c:7455
int fill_basic_terrain_layer_sprite_array(struct tileset *t, struct drawn_sprite *sprs, int layer, struct terrain *pterrain)
Definition tilespec.c:7422
int tileset_tile_height(const struct tileset *t)
Definition tilespec.c:791
struct sprite * get_unittype_sprite(const struct tileset *t, const struct unit_type *punittype, enum unit_activity activity, enum direction8 facing)
Definition tilespec.c:7052
struct sprite * get_nation_flag_sprite(const struct tileset *t, const struct nation_type *pnation)
Definition tilespec.c:7003
int tileset_tile_width(const struct tileset *t)
Definition tilespec.c:779
struct sprite * get_tech_sprite(const struct tileset *t, Tech_type_id tech)
Definition tilespec.c:7021
struct goods_type * goods_by_translated_name(const char *name)
bool is_tech_req_for_utype(const struct unit_type *ptype, struct advance *padv)
Definition unittype.c:2728
int utype_build_shield_cost_base(const struct unit_type *punittype)
Definition unittype.c:1472
struct advance * utype_primary_tech_req(const struct unit_type *ptype)
Definition unittype.c:2714
struct unit_type * unit_type_by_translated_name(const char *name)
Definition unittype.c:1756
const char * utype_name_translation(const struct unit_type *punittype)
Definition unittype.c:1564
#define unit_type_iterate(_p)
Definition unittype.h:860
#define unit_type_iterate_end
Definition unittype.h:867
#define U_NOT_OBSOLETED
Definition unittype.h:533
const char * freeciv_name_version(void)
Definition version.c:35