Freeciv-3.2
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-3.22 */
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
70static int help_frame_width = 520, help_frame_height = 350;
83
90static GtkWidget *help_ulabel[5][5];
91static GtkWidget *help_tlabel[2][5];
93
94static bool help_advances[A_LAST];
95
98
100{
102 union {
104 const struct requirement *req;
105 } u;
106};
107
108static const char *help_ilabel_name[6] =
109{ N_("Base Cost:"), NULL, N_("Upkeep:"), NULL, N_("Requirement:"), NULL };
111
112static const char *help_wlabel_name[6] =
113{ N_("Base Cost:"), NULL, N_("Requirement:"), NULL, N_("Obsolete by:"), NULL };
115
117
118static const char *help_ulabel_name[5][5] =
119{
120 { N_("Cost:"), NULL, NULL, N_("Attack:"), NULL },
121 { N_("Defense:"), NULL, NULL, N_("Move:"), NULL },
122 { N_("Firepower:"), NULL, NULL, N_("Hitpoints:"), NULL },
123 { N_("Basic Upkeep:"), NULL, NULL, N_("Vision:"), NULL },
124 { N_("Requirement:"), NULL, NULL, N_("Obsolete by:"), NULL }
125};
126
127static const char *help_tlabel_name[2][5] =
128{
129 { N_("Move/Defense:"), NULL, NULL, N_("Food/Res/Trade:"), NULL },
130 { N_("Resources:"), NULL, NULL, NULL, NULL }
131};
132
133static const char *help_elabel_name[6] =
134/* TRANS: Label for build cost for extras in help. Will be followed by
135 * something like "3 MP" (where MP = Movement Points) */
136{ N_("Build:"), NULL,
137/* TRANS: Extra conflicts in help. Will be followed by a list of extras
138 * that can't be built on the same tile as this one. */
139 N_("Conflicts with:"), NULL,
140/* TRANS: Extra bonus in help. Will be followed by food/production/trade
141 * stats like "0/0/+1", "0/+50%/0" */
142 N_("Bonus (F/P/T):"), NULL };
143
144#define REQ_LABEL_NONE _("?tech:None")
145#define REQ_LABEL_NEVER _("(Never)")
146
147static void create_help_dialog(void);
148static void help_update_dialog(const struct help_item *pitem);
149
150static void select_help_item_string(const char *item,
151 enum help_page_type htype);
152static void help_command_update(void);
154
155/**********************************************************************/
170
171/**********************************************************************/
174static void set_title_topic(char *topic)
175{
176 if (strcmp(topic, _(HELP_ABOUT_ITEM)) == 0) {
178 } else {
180 }
181 return;
182}
183
184/**********************************************************************/
193
194/**********************************************************************/
208
209/**********************************************************************/
217
218/**********************************************************************/
227static void create_tech_tree(int tech, int levels, GtkTreeIter *parent)
228{
229 const struct research *presearch;
230 int bg;
231 int turns_to_tech;
232 bool original;
234 GValue value = { 0, };
235 enum tech_state state;
236
237 if (advance_required(tech, AR_ONE) == A_LAST
238 && advance_required(tech, AR_TWO) == A_LAST) {
240
242 help_advances[tech] = TRUE;
243
245 g_value_set_static_string(&value, _("Removed"));
246 gtk_tree_store_set_value(tstore, &l, 0, &value);
247 g_value_unset(&value);
248
250 1, -1,
251 2, tech,
252 3, &get_color(tileset, bg)->color
253 -1);
254 return;
255 }
256
258
259 state = research_invention_state(presearch, tech);
260 if (tech_state_is_valid(state)) {
261 switch (state) {
262 case TECH_UNKNOWN:
264 break;
265 case TECH_KNOWN:
267 break;
270 break;
271 }
272 } else {
274 }
276
277 /* l is the original in the tree. */
278 original = !help_advances[tech];
279
281 help_advances[tech] = TRUE;
282
286 tech));
287 gtk_tree_store_set_value(tstore, &l, 0, &value);
288 g_value_unset(&value);
289
291 1, turns_to_tech,
292 2, tech,
293 3, &get_color(tileset, bg)->color,
294 -1);
295
296 if (--levels <= 0) {
297 return;
298 }
299
300 if (original) {
301 /* Only add children to originals */
302 if (advance_required(tech, AR_ONE) != A_NONE) {
303 create_tech_tree(advance_required(tech, AR_ONE), levels, &l);
304 }
305 if (advance_required(tech, AR_TWO) != A_NONE) {
306 create_tech_tree(advance_required(tech, AR_TWO), levels, &l);
307 }
308 }
309}
310
311/**********************************************************************/
327
328/**********************************************************************/
335
336/**********************************************************************/
343
344/**********************************************************************/
348{
349 const char *s;
350 struct help_page_selection *select;
352
354 select = (struct help_page_selection *)(g_object_get_data(G_OBJECT(w), "page_type"));
355
356 switch (select->type) {
357 case HPAGE_SRC_ENUM:
358 type = select->u.page;
359 break;
360 case HPAGE_SRC_REQ:
362 break;
363 }
364
365 if (type == HELP_LAST) {
366 return;
367 }
368
369 /* FIXME: May be able to skip, or may need to modify, advances[A_NONE]
370 below, depending on which i18n is done elsewhere.
371 */
372 if (strcmp(s, REQ_LABEL_NEVER) != 0
376 }
377}
378
379/**********************************************************************/
383 struct help_page_selection *select)
384{
385 GtkWidget *button;
386
387 button = gtk_button_new();
391 gtk_widget_set_name(label, "help_link");
392 gtk_container_add(GTK_CONTAINER(button), label);
393 gtk_widget_show(button);
394 g_signal_connect_swapped(button, "clicked",
396 g_object_set_data(G_OBJECT(label), "page_type", select);
397
398 return button;
399}
400
401/**********************************************************************/
405 enum help_page_type page)
406{
407 return help_hyperlink_new(label, &(page_selections[page]));
408}
409
410/**********************************************************************/
414 struct help_page_selection *select)
415{
416 GtkWidget *button, *label;
417
418 label = gtk_label_new(txt);
421 button = help_hyperlink_new(label, select);
422
423 return button;
424}
425
426/**********************************************************************/
430 enum help_page_type page)
431{
433}
434
435/**********************************************************************/
458
459/**********************************************************************/
467
468/**********************************************************************/
472{
473 GtkTreePath *path;
475 GtkTreeModel *model;
476 GtkTreeIter it;
477 struct help_item *pitem;
478
480
482 gtk_tree_model_get_iter(model, &it, path);
483 gtk_tree_path_free(path);
484
485 if (!path) {
486 return;
487 }
488
489 gtk_tree_model_get(model, &it, 1, &pitem, -1);
490
491 if (help_history_pos >= 0
493 return;
494 }
495
497
498 /* add to history. */
501 }
503
506}
507
508/**********************************************************************/
511static void create_help_dialog(void)
512{
514 GtkWidget *button;
516 int i, j;
519 GArray *array;
520 GtkTreeStore *store;
521 GtkTreeSelection *selection;
522
524 help_history_pos = -1;
525
526 help_dialog_shell = gtk_dialog_new_with_buttons(_("Freeciv Help Browser"),
527 NULL,
528 0,
529 _("_Back"),
530 1,
531 _("_Forward"),
532 2,
533 _("_Close"),
535 NULL);
540
545
546 hbox = gtk_grid_new();
550
551 /* build tree store. */
553
554 array = g_array_new(FALSE, FALSE, sizeof(GtkTreeIter));
556 GtkTreeIter *it, *parent;
557 const char *s;
558 int depth;
559
560 for (s = pitem->topic; *s == ' '; s++) {
561 /* nothing */
562 }
563 depth = s - pitem->topic;
564
565 array = g_array_set_size(array, depth+1);
566
567 if (depth > 0) {
568 parent = &g_array_index(array, GtkTreeIter, depth-1);
569 } else {
570 parent = NULL;
571 }
572
573 it = &g_array_index(array, GtkTreeIter, depth);
574 gtk_tree_store_append(store, it, parent);
575
576 gtk_tree_store_set(store, it, 0, pitem->topic, 1, pitem, -1);
578
579
580 /* create tree view. */
582 g_object_unref(store);
585
586 g_signal_connect(help_view, "cursor-changed",
588
591
595
604
609
615
618
621
622 for (i = 0; i < 6; i++) {
623 help_ilabel[i] =
626
627 if (i == 5) {
629 gtk_grid_attach(GTK_GRID(help_itable), button, i, 0, 1, 1);
630 } else {
632 gtk_widget_set_name(help_ilabel[i], "help_label");
633 }
634
636 }
637
640
641 for (i = 0; i < 6; i++) {
642 help_wlabel[i] =
645
646 if (i == 3 || i == 5) {
648 gtk_grid_attach(GTK_GRID(help_wtable), button, i, 0, 1, 1);
649 } else {
651 gtk_widget_set_name(help_wlabel[i], "help_label");
652 }
653
655 }
656
659
660 for (i = 0; i < 5; i++) {
661 for (j = 0; j < 5; j++) {
662 help_ulabel[j][i] =
665
666 if (j == 4 && (i == 1 || i == 4)) {
667 if (i == 1) {
669 } else {
671 }
672
673 gtk_grid_attach(GTK_GRID(help_utable), button, i, j, 1, 1);
674 } else {
676 i, j, 1, 1);
677 gtk_widget_set_name(help_ulabel[j][i], "help_label");
678 }
680 }
681 }
682
685
686 for (j = 0; j < 2; j++) {
687 for (i = 0; i < 5; i++) {
688 help_tlabel[j][i] =
691 gtk_widget_set_name(help_tlabel[j][i], "help_label");
692
693 /* Ugly (but these numbers are hardcoded in help_update_terrain() too) */
694 if (j == 1 && i == 1) {
695 /* Extra wide cell for terrain specials */
697 i, j, 4, 1);
699 break; /* skip rest of row */
700 } else {
702 i, j, 1, 1);
704 }
705 }
706 }
707
710
711 for (i = 0; i < 6; i++) {
712 help_elabel[i] =
715 gtk_grid_attach(GTK_GRID(help_etable), help_elabel[i], i % 4, i / 4, 1, 1);
716 gtk_widget_set_name(help_elabel[i], "help_label");
718 }
719
726
734 gtk_widget_set_name(text, "help_text");
737
743
744 /* build tech store. */
746 G_TYPE_STRING, /* tech name */
747 G_TYPE_INT, /* turns to tech */
748 G_TYPE_INT, /* tech id */
749 GDK_TYPE_RGBA); /* color */
755
756 g_signal_connect(help_tree, "row_activated",
758
759
761
766 "text", 0,
767 "background-rgba", 3,
768 NULL);
770 g_object_set(rend, "weight", PANGO_WEIGHT_BOLD, "xalign", 1.0, NULL);
773 "text", 1,
774 "background-rgba", 3,
775 NULL);
776
778
779
786
788 = gtk_button_new_with_label(_("Expand All"));
790
795
801}
802
803/**********************************************************************/
807{
808 if (spr == NULL) {
809 return;
810 }
811
814}
815
816/**********************************************************************/
846
847/**********************************************************************/
874
875/**********************************************************************/
878static void help_update_improvement(const struct help_item *pitem,
879 char *title)
880{
881 char buf[8192];
883
884 if (imp && !is_great_wonder(imp)) {
886 char req_buf[512];
887
890 sprintf(buf, "%d", imp->upkeep);
892
893 /* FIXME: this should show ranges, negated reqs, and all the
894 * MAX_NUM_REQS reqs.
895 * Currently it's limited to 1 req but this code is partially prepared
896 * to be extended. Remember MAX_NUM_REQS is a compile-time
897 * definition. */
900 if (!preq->present) {
901 continue;
902 }
903 req = universal_name_translation(&preq->source, req_buf, sizeof(req_buf));
905 break;
908/* create_tech_tree(help_improvement_tree, 0, imp->tech_req, 3);*/
909 } else {
913/* create_tech_tree(help_improvement_tree, 0, advance_count(), 3);*/
914 }
915
917
919
920 helptext_building(buf, sizeof(buf), client.conn.playing, pitem->text, imp);
923}
924
925/**********************************************************************/
928static void help_update_wonder(const struct help_item *pitem,
929 char *title)
930{
931 char buf[8192];
933
934 if (imp && is_great_wonder(imp)) {
935 int i;
936 char req_buf[512];
937
940
941 /* FIXME: this should show ranges, negated reqs, and all the
942 * MAX_NUM_REQS reqs.
943 * Currently it's limited to 1 req but this code is partially prepared
944 * to be extended. Remember MAX_NUM_REQS is a compile-time
945 * definition. */
946 i = 0;
949 if (!preq->present) {
950 continue;
951 }
954 req_buf, sizeof(req_buf)));
956 i++;
957 break;
959
961 requirement_vector_iterate(&imp->obsolete_by, pobs) {
962 if (pobs->source.kind == VUT_ADVANCE && pobs->present) {
965 (pobs->source.value.advance));
966
967 break;
968 }
970
971/* create_tech_tree(help_improvement_tree, 0, imp->tech_req, 3);*/
972 } else {
973 /* can't find wonder */
977/* create_tech_tree(help_improvement_tree, 0, advance_count(), 3); */
978 }
979
981
983
984 helptext_building(buf, sizeof(buf), client.conn.playing, pitem->text, imp);
987}
988
989/**********************************************************************/
992static void help_update_unit_type(const struct help_item *pitem,
993 char *title)
994{
995 char buf[8192];
997
998 if (utype) {
1001 sprintf(buf, "%d", utype->attack_strength);
1003 sprintf(buf, "%d", utype->defense_strength);
1005 sprintf(buf, "%s", move_points_text(utype->move_rate, TRUE));
1007 sprintf(buf, "%d", utype->firepower);
1009 sprintf(buf, "%d", utype->hp);
1013 sprintf(buf, "%d", (int)sqrt((double)utype->vision_radius_sq));
1017/* create_tech_tree(help_improvement_tree, 0, advance_number(utype->require_advance), 3);*/
1018 if (U_NOT_OBSOLETED == utype->obsoleted_by) {
1020 } else {
1023 }
1024
1025 helptext_unit(buf, sizeof(buf), client.conn.playing, pitem->text, utype,
1026 TRUE);
1027
1030
1034 } else {
1043
1045/* create_tech_tree(help_improvement_tree, 0, A_LAST, 3);*/
1047
1050 }
1052}
1053
1054/**********************************************************************/
1057static char *fc_chomp(char *str, size_t len)
1058{
1059 gchar *i;
1060
1061 if (!str || !*str) {
1062 return str;
1063 }
1064
1065 i = str + len;
1066 for (i = g_utf8_find_prev_char(str, i);
1069 *i = '\0';
1070 }
1071 return str;
1072}
1073
1074/**********************************************************************/
1077static void help_update_tech(const struct help_item *pitem, char *title)
1078{
1079 int i, j;
1080 GtkWidget *w, *hbox;
1081 char buf[8192];
1083
1086 size_t len;
1087
1089
1090 for (j = 0; j < ARRAY_SIZE(help_advances); j++) {
1091 help_advances[j] = FALSE;
1092 }
1097
1098 helptext_advance(buf, sizeof(buf), client.conn.playing, pitem->text, i);
1099 len = strlen(buf);
1100 fc_chomp(buf, len);
1101
1103
1104 w = gtk_text_view_new();
1109 gtk_widget_set_name(w, "help_text");
1113 gtk_widget_show(w);
1114
1116 if (txt) {
1118 }
1119
1121 g_object_set(w, "margin", 5, NULL);
1125 gtk_widget_show(w);
1126
1128 /* FIXME: need a more general mechanism for this, since this
1129 * helptext needs to be shown in all possible req source types. */
1131 if (VUT_ADVANCE == preq->source.kind
1132 && preq->source.value.advance == padvance) {
1133 hbox = gtk_grid_new();
1135 w = gtk_label_new(_("Allows"));
1141 }
1144
1145 improvement_iterate(pimprove) {
1146 if (valid_improvement(pimprove)) {
1147 requirement_vector_iterate(&pimprove->reqs, preq) {
1148 if (VUT_ADVANCE == preq->source.kind
1149 && preq->source.value.advance == padvance) {
1150 hbox = gtk_grid_new();
1152 w = gtk_label_new(_("Allows"));
1155 is_great_wonder(pimprove)
1156 ? HELP_WONDER
1160 }
1162 requirement_vector_iterate(&pimprove->obsolete_by, pobs) {
1163 if (pobs->source.kind == VUT_ADVANCE
1164 && pobs->source.value.advance == padvance
1165 && pobs->present) {
1166 hbox = gtk_grid_new();
1168 w = gtk_label_new(_("Obsoletes"));
1171 is_great_wonder(pimprove)
1172 ? HELP_WONDER
1176 }
1178 }
1180
1182
1184 continue;
1185 }
1186
1187 hbox = gtk_grid_new();
1189 w = gtk_label_new(_("Allows"));
1195
1199 hbox = gtk_grid_new();
1201 w = gtk_label_new(_("Allows"));
1206 } else {
1207 hbox = gtk_grid_new();
1209 w = gtk_label_new(_("Allows"));
1213 w = gtk_label_new(_("with"));
1216 AR_TWO)),
1217 HELP_TECH);
1219 w = gtk_label_new(Q_("?techhelp:"));
1222 }
1223 }
1225 hbox = gtk_grid_new();
1227 w = gtk_label_new(_("Allows"));
1231 w = gtk_label_new(_("with"));
1234 HELP_TECH);
1236 w = gtk_label_new(Q_("?techhelp:"));
1239 }
1242 }
1243}
1244
1245/**********************************************************************/
1267
1268/**********************************************************************/
1272 enum unit_activity act,
1273 char *label)
1274{
1275 enum extra_cause cause = activity_to_extra_cause(act);
1276
1277 extra_type_by_cause_iterate(cause, pextra) {
1278 if (pextra->buildable
1279 && requirement_fulfilled_by_terrain(pterr, &(pextra->reqs))) {
1283 act));
1284 }
1286}
1287
1288/**********************************************************************/
1291static void help_update_terrain(const struct help_item *pitem,
1292 char *title)
1293{
1294 char buf[8192];
1295 struct terrain *pterrain = terrain_by_translated_name(title);
1296
1297 if (pterrain) {
1298 struct universal for_terr = { .kind = VUT_TERRAIN, .value = { .terrain = pterrain }};
1299
1301
1302 {
1303 /* 25 => "1.25"; 50 => "1.5"; 100 => "2.0" */
1304 int defbonus = pterrain->defense_bonus + 100;
1305 int frac = defbonus % 100;
1306
1307 if ((frac % 10) == 0) {
1308 frac /= 10;
1309 }
1310 sprintf(buf, "%d/%d.%d",
1311 pterrain->movement_cost, defbonus / 100, frac);
1312 }
1314
1315 sprintf(buf, "%d/%d/%d",
1316 pterrain->output[O_FOOD],
1317 pterrain->output[O_SHIELD],
1318 pterrain->output[O_TRADE]);
1320
1321 buf[0] = '\0';
1322 if (*(pterrain->resources)) {
1323 struct extra_type **r;
1324
1325 /* TODO: include resource frequency information */
1326 for (r = pterrain->resources; *r; r++) {
1327 /* TRANS: " Whales (2/1/2)," */
1328 sprintf (buf + strlen (buf), " %s (%d/%d/%d),",
1330 pterrain->output[O_FOOD] + (*r)->data.resource->output[O_FOOD],
1331 pterrain->output[O_SHIELD] + (*r)->data.resource->output[O_SHIELD],
1332 pterrain->output[O_TRADE] + (*r)->data.resource->output[O_TRADE]);
1333 }
1334 buf[strlen (buf) - 1] = '.';
1335 } else {
1336 /* TRANS: "Resources: (none)" */
1337 sprintf (buf + strlen (buf), _("(none)"));
1338 }
1340
1342
1343 if (pterrain->cultivate_result != T_NONE
1345 NULL, &for_terr)) {
1346 fc_snprintf(buf, sizeof(buf),
1347 PL_("%d turn", "%d turns", pterrain->cultivate_time),
1348 pterrain->cultivate_time);
1349 add_act_help_for_terrain(_("Cultivate Rslt/Time"),
1351 HELP_TERRAIN, buf);
1352 }
1353
1354 if (pterrain->plant_result != T_NONE
1356 fc_snprintf(buf, sizeof(buf),
1357 PL_("%d turn", "%d turns", pterrain->plant_time),
1358 pterrain->plant_time);
1359 add_act_help_for_terrain(_("Plant Rslt/Time"),
1361 HELP_TERRAIN, buf);
1362 }
1363
1364 if (pterrain->transform_result != T_NONE
1366 NULL, &for_terr)) {
1367 fc_snprintf(buf, sizeof(buf),
1368 PL_("%d turn", "%d turns", pterrain->transform_time),
1369 pterrain->transform_time);
1370 add_act_help_for_terrain(_("Trans. Rslt/Time"),
1372 HELP_TERRAIN, buf);
1373 }
1374
1377 _("Build as irrigation"));
1378 }
1381 _("Build as mine"));
1382 }
1385 _("Build as road"));
1386 }
1389 _("Build as base"));
1390 }
1391
1393 }
1394
1395 helptext_terrain(buf, sizeof(buf), client.conn.playing, pitem->text, pterrain);
1396
1399
1401}
1402
1403/**********************************************************************/
1406static void help_update_extra(const struct help_item *pitem, char *title)
1407{
1408 char buf[8192];
1410
1411 buf[0] = '\0';
1412 if (pextra == NULL) {
1413 strcat(buf, pitem->text);
1414 } else {
1415 struct road_type *proad = extra_road_get(pextra);
1417
1419
1420 /* Cost to build */
1421 if (pextra->buildable) {
1422 if (pextra->build_time != 0) {
1423 /* TRANS: "MP" = movement points */
1424 sprintf(buf, _("%d MP"), pextra->build_time);
1425 } else {
1426 /* TRANS: Build time depends on terrain. */
1427 sprintf(buf, _("Terrain specific"));
1428 }
1429 } else {
1430 sprintf(buf, "-");
1431 }
1433 /* Conflicting extras */
1434 buf[0] = '\0';
1435 if (is_resource) {
1436 /* TRANS: (Resource extra) Conflicts with: */
1437 strcat(buf, _("Other Resources"));
1438 }
1440 if (!can_extras_coexist(pextra, pextra2)
1442 if (buf[0] != '\0') {
1443 strcat(buf, "/");
1444 }
1446 }
1448 /* TRANS: "Conflicts with: (none)" (extras) */
1449 gtk_label_set_text(GTK_LABEL(help_elabel[3]), buf[0] ? buf : _("(none)"));
1450
1451 /* Bonus */
1452 if (proad != NULL) {
1453 const char *bonus = NULL;
1454
1456 if (proad->tile_incr[o] > 0) {
1457 /* TRANS: Road bonus depends on terrain. */
1458 bonus = _("Terrain specific");
1459 break;
1460 }
1462 if (!bonus) {
1464 }
1465 if (!bonus) {
1466 /* TRANS: No output bonus from a road */
1467 bonus = Q_("?bonus:None");
1468 }
1472 } else {
1475 }
1476
1477 helptext_extra(buf, sizeof(buf), client.conn.playing, pitem->text, pextra);
1478 }
1480
1483}
1484
1485/**********************************************************************/
1488static void help_update_goods(const struct help_item *pitem,
1489 char *title)
1490{
1491 char buf[8192];
1493
1494 if (!pgood) {
1495 strcat(buf, pitem->text);
1496 } else {
1497 helptext_goods(buf, sizeof(buf), client.conn.playing, pitem->text,
1498 pgood);
1499 }
1500
1503}
1504
1505/**********************************************************************/
1508static void help_update_specialist(const struct help_item *pitem,
1509 char *title)
1510{
1511 char buf[8192];
1513
1514 if (!pspec) {
1515 strcat(buf, pitem->text);
1516 } else {
1518 pspec);
1519 }
1520
1523}
1524
1525/**********************************************************************/
1528static void help_update_government(const struct help_item *pitem,
1529 char *title)
1530{
1531 char buf[8192];
1533
1534 if (!gov) {
1535 strcat(buf, pitem->text);
1536 } else {
1537 helptext_government(buf, sizeof(buf), client.conn.playing, pitem->text, gov);
1538 }
1539
1542}
1543
1544/**********************************************************************/
1547static void help_update_nation(const struct help_item *pitem, char *title,
1548 struct nation_type *pnation)
1549{
1550 char buf[4096];
1551
1552 if (!pnation) {
1553 strcat(buf, pitem->text);
1554 } else {
1555 helptext_nation(buf, sizeof(buf), pnation, pitem->text);
1556
1558 }
1559
1562}
1563
1564/**********************************************************************/
1567static void help_update_dialog(const struct help_item *pitem)
1568{
1569 char *top;
1570
1571 /* figure out what kind of item is required for pitem ingo */
1572
1573 for (top = pitem->topic; *top == ' '; top++) {
1574 /* nothing */
1575 }
1576
1577 help_box_hide();
1579
1580 switch (pitem->type) {
1581 case HELP_IMPROVEMENT:
1583 break;
1584 case HELP_WONDER:
1586 break;
1587 case HELP_UNIT:
1589 break;
1590 case HELP_TECH:
1591 help_update_tech(pitem, top);
1592 break;
1593 case HELP_TERRAIN:
1595 break;
1596 case HELP_EXTRA:
1598 break;
1599 case HELP_GOODS:
1601 break;
1602 case HELP_SPECIALIST:
1604 break;
1605 case HELP_GOVERNMENT:
1607 break;
1608 case HELP_NATIONS:
1610 break;
1611 case HELP_TEXT:
1612 default:
1613 /* it was a pure text item */
1616 break;
1617 }
1618 set_title_topic(pitem->topic);
1619
1621}
1622
1623/**********************************************************************/
1626static void help_item_zoom(GtkTreePath *path)
1627{
1628 GtkTreeModel *model;
1629 GtkTreeIter it, child, item;
1630 GtkTreeSelection *selection;
1631
1633 gtk_tree_model_get_iter(model, &item, path);
1634
1635 for (child = item; gtk_tree_model_iter_parent(model, &it, &child); child=it) {
1637
1638 it_path = gtk_tree_model_get_path(model, &it);
1641 }
1642
1646 TRUE, 0.0, 0.0);
1647}
1648
1649/**********************************************************************/
1653{
1654 GtkTreePath *path;
1655 bool next;
1656
1657 path = gtk_tree_path_new_first();
1658 next = FALSE;
1660 const char *s;
1661 int depth;
1662
1663 for (s = pitem2->topic; *s == ' '; s++) {
1664 /* nothing */
1665 }
1666 depth = s - pitem2->topic + 1;
1667
1668 while (depth < gtk_tree_path_get_depth(path)) {
1669 gtk_tree_path_up(path);
1670 gtk_tree_path_next(path);
1671 next = FALSE;
1672 }
1673 while (depth > gtk_tree_path_get_depth(path)) {
1674 gtk_tree_path_down(path);
1675 next = FALSE;
1676 }
1677
1678 if (next) {
1679 gtk_tree_path_next(path);
1680 }
1681
1682 if (pitem == pitem2)
1683 break;
1684
1685 next = TRUE;
1687
1688 return path;
1689}
1690
1691/**********************************************************************/
1694static void select_help_item_string(const char *item, enum help_page_type htype)
1695{
1696 const struct help_item *pitem;
1697 int idx;
1698 GtkTreePath *path;
1700
1701 if (!(pitem = get_help_item_spec(item, htype, &idx))) {
1702 return;
1703 }
1704
1705 path = help_item_path(pitem);
1706 help_item_zoom(path);
1707
1710 gtk_tree_path_free(path);
1711}
1712
1713/**********************************************************************/
1716static void help_command_update(void)
1717{
1719
1720 if (help_history_pos < 0) {
1723 } else {
1726
1727 if (help_history_pos == 0) {
1729 }
1730 if (help_history_pos >= help_history->len - 1) {
1732 }
1733 }
1734}
1735
1736/**********************************************************************/
1740{
1741 GtkTreePath *path;
1742 const struct help_item *pitem;
1743
1744 if (response_id == 1) {
1745 if (help_history_pos > 0) {
1747
1749 path = help_item_path(pitem);
1750 help_item_zoom(path);
1753 }
1754 } else if (response_id == 2) {
1757
1759 path = help_item_path(pitem);
1760 help_item_zoom(path);
1763 }
1764 } else {
1765 /* Save size of the dialog. */
1769 }
1770}
#define action_id_univs_not_blocking(act_id, act_uni, tgt_uni)
Definition actions.h:945
#define str
Definition astring.c:76
#define output_type_iterate(output)
Definition city.h:845
#define output_type_iterate_end
Definition city.h:851
struct civclient client
#define client_player()
struct color * get_color(const struct tileset *t, enum color_std stdcolor)
char * incite_cost
Definition comments.c:75
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:1076
bool can_extras_coexist(const struct extra_type *pextra1, const struct extra_type *pextra2)
Definition extras.c:1003
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
@ O_SHIELD
Definition fc_types.h:101
@ O_FOOD
Definition fc_types.h:101
@ O_TRADE
Definition fc_types.h:101
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:125
void set_relative_window_position(GtkWindow *ref, GtkWindow *w, int px, int py)
Definition gui_stuff.c:60
void setup_dialog(GtkWidget *shell, GtkWidget *parent)
Definition gui_stuff.c:287
static GtkWidget * help_tree_sw
Definition helpdlg.c:84
static void set_title_topic(char *topic)
Definition helpdlg.c:174
static void activated_topic(GtkTreeView *view, gpointer data)
Definition helpdlg.c:471
static GtkWidget * help_tree
Definition helpdlg.c:81
static GtkWidget * help_tree_expand
Definition helpdlg.c:85
static GtkWidget * help_ulabel[5][5]
Definition helpdlg.c:90
static void help_update_specialist(const struct help_item *pitem, char *title)
Definition helpdlg.c:1508
static void help_hyperlink_callback(GtkWidget *w)
Definition helpdlg.c:347
static GtkWidget * help_elabel[6]
Definition helpdlg.c:92
static GtkWidget * help_etable
Definition helpdlg.c:80
static void help_destroy_callback(GtkWidget *w, gpointer data)
Definition helpdlg.c:462
static void set_help_tile_from_extra(const struct extra_type *pextra)
Definition helpdlg.c:850
static GtkWidget * help_frame
Definition helpdlg.c:69
static int help_frame_width
Definition helpdlg.c:70
static void help_tech_tree_activated_callback(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data)
Definition helpdlg.c:314
static void help_update_tech(const struct help_item *pitem, char *title)
Definition helpdlg.c:1077
static void help_item_zoom(GtkTreePath *path)
Definition helpdlg.c:1626
static GtkWidget * help_slink_new_page(const gchar *txt, enum help_page_type page)
Definition helpdlg.c:429
static GtkWidget * help_tlabel[2][5]
Definition helpdlg.c:91
static GtkTreePath * help_item_path(const struct help_item *pitem)
Definition helpdlg.c:1652
static GtkWidget * help_tree_collapse
Definition helpdlg.c:86
static void help_update_nation(const struct help_item *pitem, char *title, struct nation_type *pnation)
Definition helpdlg.c:1547
static void create_help_dialog(void)
Definition helpdlg.c:511
static GtkTextBuffer * help_text
Definition helpdlg.c:71
static void help_update_wonder(const struct help_item *pitem, char *title)
Definition helpdlg.c:928
static GtkWidget * help_hyperlink_new_page(GtkWidget *label, enum help_page_type page)
Definition helpdlg.c:404
static GtkWidget * help_dialog_shell
Definition helpdlg.c:64
static GtkWidget * help_text_sw
Definition helpdlg.c:72
static GPtrArray * help_history
Definition helpdlg.c:96
static const char * help_elabel_name[6]
Definition helpdlg.c:133
static void create_tech_tree(int tech, int levels, GtkTreeIter *parent)
Definition helpdlg.c:227
static void help_update_extra(const struct help_item *pitem, char *title)
Definition helpdlg.c:1406
static GtkWidget * help_ilabel[6]
Definition helpdlg.c:88
static void set_help_tile_from_sprite(struct sprite *spr)
Definition helpdlg.c:806
static const char * help_wlabel_name[6]
Definition helpdlg.c:112
static const char * help_ulabel_name[5][5]
Definition helpdlg.c:118
static void help_tech_tree_collapse_callback(GtkWidget *w, gpointer data)
Definition helpdlg.c:339
static void set_help_tile_from_terrain(struct terrain *pterr)
Definition helpdlg.c:819
static GtkWidget * help_view
Definition helpdlg.c:67
static void help_update_goods(const struct help_item *pitem, char *title)
Definition helpdlg.c:1488
void help_system_init(void)
Definition helpdlg.c:158
static void help_box_hide(void)
Definition helpdlg.c:438
static void help_update_unit_type(const struct help_item *pitem, char *title)
Definition helpdlg.c:992
void popdown_help_dialog(void)
Definition helpdlg.c:187
static void help_update_terrain(const struct help_item *pitem, char *title)
Definition helpdlg.c:1291
static int help_frame_height
Definition helpdlg.c:70
static void help_update_dialog(const struct help_item *pitem)
Definition helpdlg.c:1567
static char * fc_chomp(char *str, size_t len)
Definition helpdlg.c:1057
void popup_help_dialog_string(const char *item)
Definition helpdlg.c:213
static int help_history_pos
Definition helpdlg.c:97
static struct help_page_selection help_wndr_req
Definition helpdlg.c:114
static GtkWidget * help_wlabel[6]
Definition helpdlg.c:89
static GtkWidget * help_box
Definition helpdlg.c:75
static void help_extras_of_act_for_terrain(struct terrain *pterr, enum unit_activity act, char *label)
Definition helpdlg.c:1271
void popup_help_dialog_typed(const char *item, enum help_page_type htype)
Definition helpdlg.c:197
#define REQ_LABEL_NEVER
Definition helpdlg.c:145
static void help_command_update(void)
Definition helpdlg.c:1716
static struct help_page_selection page_selections[HELP_LAST]
Definition helpdlg.c:116
#define TECH_TREE_DEPTH
Definition helpdlg.c:59
static const char * help_tlabel_name[2][5]
Definition helpdlg.c:127
static struct help_page_selection help_impr_req
Definition helpdlg.c:110
#define REQ_LABEL_NONE
Definition helpdlg.c:144
static GtkWidget * help_wtable
Definition helpdlg.c:77
static GtkWidget * help_slink_new(const gchar *txt, struct help_page_selection *select)
Definition helpdlg.c:413
static GtkWidget * help_vbox
Definition helpdlg.c:73
static void help_tech_tree_expand_callback(GtkWidget *w, gpointer data)
Definition helpdlg.c:331
static GtkWidget * help_tile
Definition helpdlg.c:74
static GtkWidget * help_hyperlink_new(GtkWidget *label, struct help_page_selection *select)
Definition helpdlg.c:382
static void help_update_government(const struct help_item *pitem, char *title)
Definition helpdlg.c:1528
static GtkWidget * help_ttable
Definition helpdlg.c:79
static void help_update_improvement(const struct help_item *pitem, char *title)
Definition helpdlg.c:878
static const char * help_ilabel_name[6]
Definition helpdlg.c:108
static GtkWidget * help_tree_buttons_hbox
Definition helpdlg.c:87
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:1694
static bool help_advances[A_LAST]
Definition helpdlg.c:94
static GtkWidget * help_utable
Definition helpdlg.c:78
static GtkWidget * help_itable
Definition helpdlg.c:76
static GtkTreeStore * tstore
Definition helpdlg.c:82
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:1248
static void help_command_callback(GtkWidget *w, gint response_id)
Definition helpdlg.c:1739
const char * title
Definition repodlgs.c:1314
GType type
Definition repodlgs.c:1313
void helptext_government(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, struct government *gov)
Definition helpdata.c:4400
void helptext_advance(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, int i)
Definition helpdata.c:3359
enum help_page_type help_type_by_requirement(const struct requirement *req)
Definition helpdata.c:5265
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:3854
void helptext_goods(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, struct goods_type *pgood)
Definition helpdata.c:4319
const char * helptext_road_bonus_str(const struct terrain *pterrain, const struct road_type *proad)
Definition helpdata.c:3690
char * helptext_unit_upkeep_str(const struct unit_type *utype)
Definition helpdata.c:5062
const char * helptext_extra_for_terrain_str(struct extra_type *pextra, struct terrain *pterrain, enum unit_activity act)
Definition helpdata.c:3820
void helptext_specialist(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, struct specialist *pspec)
Definition helpdata.c:4365
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:3580
void helptext_nation(char *buf, size_t bufsz, struct nation_type *pnation, const char *user_text)
Definition helpdata.c:5099
#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:1047
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:103
const struct requirement * req
Definition helpdlg.c:104
enum help_page_selection::@155 type
union help_page_selection::@156 u
Definition climisc.h:82
struct terrain * cultivate_result
Definition terrain.h:215
struct extra_type ** resources
Definition terrain.h:204
int plant_time
Definition terrain.h:219
struct terrain * plant_result
Definition terrain.h:218
int defense_bonus
Definition terrain.h:200
int cultivate_time
Definition terrain.h:216
int movement_cost
Definition terrain.h:199
int output[O_LAST]
Definition terrain.h:202
int transform_time
Definition terrain.h:231
struct terrain * transform_result
Definition terrain.h:229
int defense_strength
Definition unittype.h:516
int firepower
Definition unittype.h:525
const struct unit_type * obsoleted_by
Definition unittype.h:529
int vision_radius_sq
Definition unittype.h:522
int move_rate
Definition unittype.h:517
int attack_strength
Definition unittype.h:515
enum universals_n kind
Definition fc_types.h:902
int fc_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:974
#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
bool is_future_tech(Tech_type_id tech)
Definition tech.c:281
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:290
Tech_type_id advance_required(const Tech_type_id tech, enum tech_req require)
Definition tech.c:121
Tech_type_id advance_number(const struct advance *padvance)
Definition tech.c:98
#define advance_iterate_all_end
Definition tech.h:279
@ AR_TWO
Definition tech.h:112
@ AR_ONE
Definition tech.h:111
#define advance_iterate_all(_p)
Definition tech.h:278
#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:202
const char * terrain_name_translation(const struct terrain *pterrain)
Definition terrain.c:238
#define T_NONE
Definition terrain.h:56
struct sprite * get_building_sprite(const struct tileset *t, const struct impr_type *pimprove)
Definition tilespec.c:6794
int fill_basic_extra_sprite_array(const struct tileset *t, struct drawn_sprite *sprs, const struct extra_type *pextra)
Definition tilespec.c:7211
int fill_basic_terrain_layer_sprite_array(struct tileset *t, struct drawn_sprite *sprs, int layer, struct terrain *pterrain)
Definition tilespec.c:7178
int tileset_tile_height(const struct tileset *t)
Definition tilespec.c:765
struct sprite * get_unittype_sprite(const struct tileset *t, const struct unit_type *punittype, enum unit_activity activity, enum direction8 facing)
Definition tilespec.c:6816
struct sprite * get_nation_flag_sprite(const struct tileset *t, const struct nation_type *pnation)
Definition tilespec.c:6767
int tileset_tile_width(const struct tileset *t)
Definition tilespec.c:753
struct sprite * get_tech_sprite(const struct tileset *t, Tech_type_id tech)
Definition tilespec.c:6785
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:2724
int utype_build_shield_cost_base(const struct unit_type *punittype)
Definition unittype.c:1468
struct advance * utype_primary_tech_req(const struct unit_type *ptype)
Definition unittype.c:2710
struct unit_type * unit_type_by_translated_name(const char *name)
Definition unittype.c:1752
const char * utype_name_translation(const struct unit_type *punittype)
Definition unittype.c:1560
#define unit_type_iterate(_p)
Definition unittype.h:855
#define unit_type_iterate_end
Definition unittype.h:862
#define U_NOT_OBSOLETED
Definition unittype.h:528
const char * freeciv_name_version(void)
Definition version.c:35