Freeciv-3.1
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 "specialist.h"
37#include "tech.h"
38#include "unit.h"
39#include "map.h"
40#include "research.h"
41#include "version.h"
42
43/* client */
44#include "client_main.h"
45#include "climisc.h"
46#include "helpdata.h"
47#include "options.h"
48#include "tilespec.h"
49
50/* client/gui-gtk-4.0 */
51#include "colors.h"
52#include "graphics.h"
53#include "gui_main.h"
54#include "gui_stuff.h"
55
56#include "helpdlg.h"
57
58#define TECH_TREE_DEPTH 20
59
60/*
61 * Globals.
62 */
63static GtkWidget *help_dialog_shell;
64static GtkWidget *help_view_sw;
65
66static GtkWidget *help_view;
67
68static GtkWidget *help_frame;
69static int help_dlog_width = 520, help_dlog_height = 350;
70static GtkTextBuffer *help_text;
71static GtkWidget *help_text_sw;
72static GtkWidget *help_vbox;
73static GtkWidget *help_tile;
74static GtkWidget *help_box;
75static GtkWidget *help_itable;
76static GtkWidget *help_wtable;
77static GtkWidget *help_utable;
78static GtkWidget *help_ttable;
79static GtkWidget *help_etable;
80static GtkWidget *help_tree;
81static GtkTreeStore *tstore;
82
83static GtkWidget *help_tree_sw;
84static GtkWidget *help_tree_expand;
85static GtkWidget *help_tree_collapse;
86static GtkWidget *help_tree_buttons_hbox;
87static GtkWidget *help_ilabel[6];
88static GtkWidget *help_wlabel[6];
89static GtkWidget *help_ulabel[5][5];
90static GtkWidget *help_tlabel[2][5];
91static GtkWidget *help_elabel[6];
92
93static bool help_advances[A_LAST];
94
95static GPtrArray *help_history;
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);
152static void help_command_callback(GtkWidget *w, gint response_id);
153
154/**********************************************************************/
169
170/**********************************************************************/
173static void set_title_topic(char *topic)
174{
175 if (strcmp(topic, _(HELP_ABOUT_ITEM)) == 0) {
176 gtk_frame_set_label(GTK_FRAME(help_frame), freeciv_name_version());
177 } else {
178 gtk_frame_set_label(GTK_FRAME(help_frame), topic);
179 }
180}
181
182/**********************************************************************/
186{
187 if (help_dialog_shell) {
188 gtk_window_destroy(GTK_WINDOW(help_dialog_shell));
189 }
190}
191
192/**********************************************************************/
195void popup_help_dialog_typed(const char *item, enum help_page_type htype)
196{
197 if (!help_dialog_shell) {
199 }
200 gtk_window_present(GTK_WINDOW(help_dialog_shell));
201
203}
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;
229 GtkTreeIter l;
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) {
235 bg = COLOR_REQTREE_UNKNOWN;
236
237 gtk_tree_store_append(tstore, &l, parent);
238 help_advances[tech] = TRUE;
239
240 g_value_init(&value, G_TYPE_STRING);
241 g_value_set_static_string(&value, _("Removed"));
242 gtk_tree_store_set_value(tstore, &l, 0, &value);
243 g_value_unset(&value);
244
245 gtk_tree_store_set(tstore, &l,
246 1, -1,
247 2, tech,
248 3, &get_color(tileset, bg)->color
249 -1);
250 return;
251 }
252
253 presearch = research_get(client_player());
254
255 state = research_invention_state(presearch, tech);
256 if (tech_state_is_valid(state)) {
257 switch (state) {
258 case TECH_UNKNOWN:
259 bg = COLOR_REQTREE_UNKNOWN;
260 break;
261 case TECH_KNOWN:
262 bg = COLOR_REQTREE_KNOWN;
263 break;
264 case TECH_PREREQS_KNOWN:
265 bg = COLOR_REQTREE_PREREQS_KNOWN;
266 break;
267 }
268 } else {
269 bg = COLOR_REQTREE_BACKGROUND;
270 }
271 turns_to_tech = research_goal_unknown_techs(presearch, tech);
272
273 /* l is the original in the tree. */
274 original = !help_advances[tech];
275
276 gtk_tree_store_append(tstore, &l, parent);
277 help_advances[tech] = TRUE;
278
279 g_value_init(&value, G_TYPE_STRING);
280 g_value_set_static_string(&value,
282 tech));
283 gtk_tree_store_set_value(tstore, &l, 0, &value);
284 g_value_unset(&value);
285
286 gtk_tree_store_set(tstore, &l,
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 orginals */
298 if (advance_required(tech, AR_ONE) != A_NONE)
299 create_tech_tree(advance_required(tech, AR_ONE), levels, &l);
300 if (advance_required(tech, AR_TWO) != A_NONE)
301 create_tech_tree(advance_required(tech, AR_TWO), levels, &l);
302 }
303}
304
305/**********************************************************************/
309 GtkTreePath *path,
310 GtkTreeViewColumn *col,
311 gpointer data)
312{
313 GtkTreeIter it;
314 gint tech;
315
316 gtk_tree_model_get_iter(GTK_TREE_MODEL(tstore), &it, path);
317 gtk_tree_model_get(GTK_TREE_MODEL(tstore), &it, 2, &tech, -1);
319 HELP_TECH);
320}
321
322/**********************************************************************/
325static void help_tech_tree_expand_callback(GtkWidget *w, gpointer data)
326{
327 gtk_tree_view_expand_all(GTK_TREE_VIEW(data));
328}
329
330/**********************************************************************/
333static void help_tech_tree_collapse_callback(GtkWidget *w, gpointer data)
334{
335 gtk_tree_view_collapse_all(GTK_TREE_VIEW(data));
336}
337
338/**********************************************************************/
341static void help_hyperlink_callback(GtkWidget *w)
342{
343 const char *s;
344 struct help_page_selection *select;
346
347 s = gtk_label_get_text(GTK_LABEL(w));
348 select = (struct help_page_selection *)(g_object_get_data(G_OBJECT(w),
349 "page_type"));
350
351 switch (select->type) {
352 case HPAGE_SRC_ENUM:
353 type = select->u.page;
354 break;
355 case HPAGE_SRC_REQ:
357 break;
358 }
359
360 if (type == HELP_LAST) {
361 return;
362 }
363
364 /* FIXME: May be able to skip, or may need to modify, advances[A_NONE]
365 below, depending on which i18n is done elsewhere.
366 */
367 if (strcmp(s, REQ_LABEL_NEVER) != 0
371 }
372}
373
374/**********************************************************************/
377static GtkWidget *help_hyperlink_new(GtkWidget *label,
378 struct help_page_selection *select)
379{
380 GtkWidget *button;
381
382 button = gtk_button_new();
383 gtk_button_set_has_frame(GTK_BUTTON(button), FALSE);
384 gtk_widget_set_halign(label, GTK_ALIGN_CENTER);
385 gtk_widget_set_valign(label, GTK_ALIGN_CENTER);
386 gtk_widget_set_name(label, "help_link");
387 gtk_button_set_child(GTK_BUTTON(button), label);
388 gtk_widget_show(button);
389 g_signal_connect_swapped(button, "clicked",
390 G_CALLBACK(help_hyperlink_callback), label);
391 g_object_set_data(G_OBJECT(label), "page_type", select);
392
393 return button;
394}
395
396/**********************************************************************/
399static GtkWidget *help_hyperlink_new_page(GtkWidget *label,
400 enum help_page_type page)
401{
402 return help_hyperlink_new(label, &(page_selections[page]));
403}
404
405/**********************************************************************/
408static GtkWidget *help_slink_new(const gchar *txt,
409 struct help_page_selection *select)
410{
411 GtkWidget *button, *label;
412
413 label = gtk_label_new(txt);
414 gtk_widget_set_halign(label, GTK_ALIGN_CENTER);
415 gtk_widget_set_valign(label, GTK_ALIGN_CENTER);
416 button = help_hyperlink_new(label, select);
417
418 return button;
419}
420
421/**********************************************************************/
424static GtkWidget *help_slink_new_page(const gchar *txt,
425 enum help_page_type page)
426{
427 return help_slink_new(txt, &(page_selections[page]));
428}
429
430/**********************************************************************/
433static void help_box_hide(void)
434{
435 gtk_widget_hide(help_box);
436
437 gtk_widget_hide(help_tile);
438
439 gtk_widget_hide(help_itable);
440 gtk_widget_hide(help_wtable);
441 gtk_widget_hide(help_utable);
442 gtk_widget_hide(help_ttable);
443 gtk_widget_hide(help_etable);
444
445 gtk_widget_hide(help_tile); /* FIXME: twice? */
446
447 gtk_widget_hide(help_vbox);
448 gtk_widget_hide(help_text_sw);
449
450 gtk_widget_hide(help_tree_sw);
451 gtk_widget_hide(help_tree_buttons_hbox);
452}
453
454/**********************************************************************/
457static void help_box_add(GtkWidget *wdg)
458{
459 gtk_box_append(GTK_BOX(help_vbox), wdg);
460}
461
462/**********************************************************************/
465static void help_box_clear(void)
466{
467 GtkWidget *child = gtk_widget_get_first_child(help_vbox);
468
469 while (child != NULL) {
470 gtk_box_remove(GTK_BOX(help_vbox), child);
471 child = gtk_widget_get_first_child(help_vbox);
472 }
473}
474
475/**********************************************************************/
478static void help_destroy_callback(GtkWidget *w, gpointer data)
479{
480 g_ptr_array_free(help_history, TRUE);
481 help_dialog_shell = NULL;
482}
483
484/**********************************************************************/
487static void activated_topic(GtkTreeView *view, gpointer data)
488{
489 GtkTreePath *path;
490 GtkTreeViewColumn *col;
491 GtkTreeModel *model;
492 GtkTreeIter it;
493 struct help_item *pitem;
494
495 model = gtk_tree_view_get_model(view);
496
497 if (model == NULL) {
498 return;
499 }
500
501 gtk_tree_view_get_cursor(view, &path, &col);
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
512 && g_ptr_array_index(help_history, help_history_pos) == (gpointer) pitem) {
513 return;
514 }
515
516 help_update_dialog(pitem);
517
518 /* Add to history. */
519 if (help_history_pos < help_history->len - 1) {
520 g_ptr_array_set_size(help_history, help_history_pos + 1);
521 }
523
524 g_ptr_array_add(help_history, (gpointer)pitem);
526}
527
528/**********************************************************************/
531static void create_help_dialog(void)
532{
533 GtkWidget *hbox;
534 GtkWidget *button;
535 GtkWidget *text;
536 int i, j;
537 GtkCellRenderer *rend;
538 GtkTreeViewColumn *col;
539 GArray *array;
540 GtkTreeStore *store;
541 GtkTreeSelection *selection;
542 GtkWidget *tile_sw;
543
544 help_history = g_ptr_array_new();
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"),
555 GTK_RESPONSE_CLOSE,
556 NULL);
558 gtk_dialog_set_default_response(GTK_DIALOG(help_dialog_shell),
559 GTK_RESPONSE_CLOSE);
560 gtk_widget_set_name(help_dialog_shell, "Freeciv");
561
562 g_signal_connect(help_dialog_shell, "response",
563 G_CALLBACK(help_command_callback), NULL);
564 g_signal_connect(help_dialog_shell, "destroy",
565 G_CALLBACK(help_destroy_callback), NULL);
566 gtk_window_set_default_size (GTK_WINDOW(help_dialog_shell),
569
570 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
571 gtk_box_append(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(help_dialog_shell))),
572 hbox);
573 gtk_widget_show(hbox);
574
575 /* Build tree store. */
576 store = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_POINTER);
577
578 array = g_array_new(FALSE, FALSE, sizeof(GtkTreeIter));
579 help_items_iterate(pitem) {
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. */
604 help_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
605 g_object_unref(store);
606 gtk_tree_view_columns_autosize(GTK_TREE_VIEW(help_view));
607 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(help_view), FALSE);
608
609 g_signal_connect(help_view, "cursor-changed",
610 G_CALLBACK(activated_topic), NULL);
611
612 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(help_view));
613 gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE);
614
615 rend = gtk_cell_renderer_text_new();
616 col = gtk_tree_view_column_new_with_attributes(NULL, rend, "text", 0, NULL);
617 gtk_tree_view_append_column(GTK_TREE_VIEW(help_view), col);
618
619 help_view_sw = gtk_scrolled_window_new();
620 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(help_view_sw),
621 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
622 gtk_widget_set_size_request(help_view_sw, 190, -1);
623 gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(help_view_sw), help_view);
624 gtk_widget_show(help_view);
625 gtk_box_append(GTK_BOX(hbox), help_view_sw);
626 gtk_widget_show(help_view_sw);
627
628 help_frame = gtk_frame_new("");
629 gtk_box_append(GTK_BOX(hbox), help_frame);
630 gtk_widget_set_hexpand(help_frame, TRUE);
631 gtk_widget_show(help_frame);
632
633 help_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
634 gtk_frame_set_child(GTK_FRAME(help_frame), help_box);
635
636 help_tile = gtk_picture_new();
637 gtk_picture_set_can_shrink(GTK_PICTURE(help_tile), FALSE);
638 gtk_widget_set_valign(help_tile, GTK_ALIGN_CENTER);
639 gtk_widget_set_halign(help_tile, GTK_ALIGN_CENTER);
640 tile_sw = gtk_scrolled_window_new();
641 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(tile_sw),
642 GTK_POLICY_NEVER,
643 GTK_POLICY_NEVER);
644 gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(tile_sw), help_tile);
645 gtk_box_append(GTK_BOX(help_box), tile_sw);
646
647 help_itable = gtk_grid_new();
648 gtk_box_append(GTK_BOX(help_box), help_itable);
649
650 for (i = 0; i < 6; i++) {
651 help_ilabel[i] =
652 gtk_label_new(help_ilabel_name[i] != NULL ? _(help_ilabel_name[i]) : "");
653 gtk_widget_set_hexpand(help_ilabel[i], TRUE);
654
655 if (i == 5) {
657 gtk_grid_attach(GTK_GRID(help_itable), button, i, 0, 1, 1);
658 } else {
659 gtk_grid_attach(GTK_GRID(help_itable), help_ilabel[i], i, 0, 1, 1);
660 gtk_widget_set_name(help_ilabel[i], "help_label");
661 }
662
663 gtk_widget_show(help_ilabel[i]);
664 }
665
666 help_wtable = gtk_grid_new();
667 gtk_box_append(GTK_BOX(help_box), help_wtable);
668
669 for (i = 0; i < 6; i++) {
670 help_wlabel[i] =
671 gtk_label_new(help_wlabel_name[i] ? _(help_wlabel_name[i]) : "");
672 gtk_widget_set_hexpand(help_wlabel[i], TRUE);
673
674 if (i == 3 || i == 5) {
676 gtk_grid_attach(GTK_GRID(help_wtable), button, i, 0, 1, 1);
677 } else {
678 gtk_grid_attach(GTK_GRID(help_wtable), help_wlabel[i], i, 0, 1, 1);
679 gtk_widget_set_name(help_wlabel[i], "help_label");
680 }
681
682 gtk_widget_show(help_wlabel[i]);
683 }
684
685 help_utable = gtk_grid_new();
686 gtk_box_append(GTK_BOX(help_box), help_utable);
687
688 for (i = 0; i < 5; i++) {
689 for (j = 0; j < 5; j++) {
690 help_ulabel[j][i] =
691 gtk_label_new(help_ulabel_name[j][i] ? _(help_ulabel_name[j][i]) : "");
692 gtk_widget_set_hexpand(help_ulabel[j][i], TRUE);
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 {
703 gtk_grid_attach(GTK_GRID(help_utable), help_ulabel[j][i],
704 i, j, 1, 1);
705 gtk_widget_set_name(help_ulabel[j][i], "help_label");
706 }
707 gtk_widget_show(help_ulabel[j][i]);
708 }
709 }
710
711 help_ttable = gtk_grid_new();
712 gtk_box_append(GTK_BOX(help_box), help_ttable);
713
714 for (j = 0; j < 2; j++) {
715 for (i = 0; i < 5; i++) {
716 help_tlabel[j][i] =
717 gtk_label_new(help_tlabel_name[j][i] ? _(help_tlabel_name[j][i]) : "");
718 gtk_widget_set_hexpand(help_tlabel[j][i], TRUE);
719 gtk_widget_set_name(help_tlabel[j][i], "help_label");
720
721 /* Ugly (but these numbers are hardcoded in help_update_terrain() too) */
722 if (j == 1 && i == 1) {
723 /* Extra wide cell for terrain specials */
724 gtk_grid_attach(GTK_GRID(help_ttable), help_tlabel[j][i],
725 i, j, 4, 1);
726 gtk_widget_show(help_tlabel[j][i]);
727 break; /* skip rest of row */
728 } else {
729 gtk_grid_attach(GTK_GRID(help_ttable), help_tlabel[j][i],
730 i, j, 1, 1);
731 gtk_widget_show(help_tlabel[j][i]);
732 }
733 }
734 }
735
736 help_etable = gtk_grid_new();
737 gtk_box_append(GTK_BOX(help_box), help_etable);
738
739 for (i = 0; i < 6; i++) {
740 help_elabel[i] =
741 gtk_label_new(help_elabel_name[i] ? _(help_elabel_name[i]) : "");
742 gtk_widget_set_hexpand(help_elabel[i], TRUE);
743 gtk_grid_attach(GTK_GRID(help_etable), help_elabel[i], i % 4, i / 4, 1, 1);
744 gtk_widget_set_name(help_elabel[i], "help_label");
745 gtk_widget_show(help_elabel[i]);
746 }
747
748 help_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 1);
749 gtk_widget_set_margin_start(help_vbox, 5);
750 gtk_widget_set_margin_end(help_vbox, 5);
751 gtk_widget_set_margin_top(help_vbox, 5);
752 gtk_widget_set_margin_bottom(help_vbox, 5);
753 gtk_box_append(GTK_BOX(help_box), help_vbox);
754
755 text = gtk_text_view_new();
756 gtk_widget_set_hexpand(text, TRUE);
757 gtk_widget_set_vexpand(text, TRUE);
758 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(text), FALSE);
759 gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE);
760 gtk_widget_set_margin_start(text, 5);
761 gtk_widget_set_margin_end(text, 5);
762 gtk_widget_set_margin_top(text, 5);
763 gtk_widget_set_margin_bottom(text, 5);
764 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD);
765 gtk_widget_set_name(text, "help_text");
766 help_text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
767 gtk_widget_show(text);
768
769 help_text_sw = gtk_scrolled_window_new();
770 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(help_text_sw),
771 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
772 gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(help_text_sw), text);
773 gtk_box_append(GTK_BOX(help_box), help_text_sw);
774
775 /* Build tech store. */
776 tstore = gtk_tree_store_new(4,
777 G_TYPE_STRING, /* Tech name */
778 G_TYPE_INT, /* Turns to tech */
779 G_TYPE_INT, /* Tech id */
780 GDK_TYPE_RGBA); /* Color */
781 help_tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(tstore));
782 gtk_widget_set_hexpand(help_tree, TRUE);
783 gtk_widget_set_vexpand(help_tree, TRUE);
784 g_object_unref(tstore);
785 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(help_tree), FALSE);
786
787 g_signal_connect(help_tree, "row_activated",
788 G_CALLBACK(help_tech_tree_activated_callback), NULL);
789
790
791 col = gtk_tree_view_column_new();
792
793 rend = gtk_cell_renderer_text_new();
794 g_object_set(rend, "weight", PANGO_WEIGHT_BOLD, NULL);
795 gtk_tree_view_column_pack_start(col, rend, TRUE);
796 gtk_tree_view_column_set_attributes(col, rend,
797 "text", 0,
798 "background-rgba", 3,
799 NULL);
800 rend = gtk_cell_renderer_text_new();
801 g_object_set(rend, "weight", PANGO_WEIGHT_BOLD, "xalign", 1.0, NULL);
802 gtk_tree_view_column_pack_start(col, rend, FALSE);
803 gtk_tree_view_column_set_attributes(col, rend,
804 "text", 1,
805 "background-rgba", 3,
806 NULL);
807
808 gtk_tree_view_append_column(GTK_TREE_VIEW(help_tree), col);
809
810 help_tree_sw = gtk_scrolled_window_new();
811 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(help_tree_sw),
812 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
813 gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(help_tree_sw), help_tree);
814 gtk_widget_set_size_request(help_tree_sw, -1, 200);
815 gtk_widget_show(help_tree);
816 gtk_box_append(GTK_BOX(help_box), help_tree_sw);
817
818 help_tree_expand = gtk_button_new_with_label(_("Expand All"));
819 help_tree_collapse = gtk_button_new_with_label(_("Collapse All"));
820
821 g_signal_connect(help_tree_expand, "clicked",
823 g_signal_connect(help_tree_collapse, "clicked",
825
826 help_tree_buttons_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
827 gtk_box_append(GTK_BOX(help_tree_buttons_hbox), help_tree_expand);
828 gtk_box_append(GTK_BOX(help_tree_buttons_hbox), help_tree_collapse);
829 gtk_box_append(GTK_BOX(help_box), help_tree_buttons_hbox);
830 gtk_widget_show(help_tree_buttons_hbox);
831}
832
833/**********************************************************************/
836static void set_help_tile_from_sprite(struct sprite *spr)
837{
838 if (spr == NULL) {
839 return;
840 }
841
842 picture_set_from_surface(GTK_PICTURE(help_tile), spr->surface);
843 gtk_widget_show(help_tile);
844}
845
846/**********************************************************************/
849static void set_help_tile_from_terrain(struct terrain *pterr)
850{
852 cairo_t *cr;
853 int i;
854
855 canvas.surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,
858
859 cr = cairo_create(canvas.surface);
860 cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR);
861 cairo_paint(cr);
862 cairo_destroy(cr);
863
864 for (i = 0; i < 3; i++) {
865 struct drawn_sprite sprs[80];
867 i, pterr);
868
869 put_drawn_sprites(&canvas, 1.0, 0, 0, count, sprs, FALSE);
870 }
871
873 gtk_widget_show(help_tile);
874 cairo_surface_destroy(canvas.surface);
875}
876
877/**********************************************************************/
880static void set_help_tile_from_extra(const struct extra_type *pextra)
881{
883 cairo_t *cr;
884 struct drawn_sprite sprs[80];
885 int count;
886
887 canvas.surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,
890
891 cr = cairo_create(canvas.surface);
892 cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR);
893 cairo_paint(cr);
894 cairo_destroy(cr);
895
896 count = fill_basic_extra_sprite_array(tileset, sprs, pextra);
897
898 put_drawn_sprites(&canvas, 1.0, 0, 0, count, sprs, FALSE);
899
901 gtk_widget_show(help_tile);
902 cairo_surface_destroy(canvas.surface);
903}
904
905/**********************************************************************/
908static void help_update_improvement(const struct help_item *pitem,
909 char *title)
910{
911 char buf[8192];
913
914 if (imp != NULL && !is_great_wonder(imp)) {
916 char req_buf[512];
917
918 sprintf(buf, "%d", impr_base_build_shield_cost(imp));
919 gtk_label_set_text(GTK_LABEL(help_ilabel[1]), buf);
920 sprintf(buf, "%d", imp->upkeep);
921 gtk_label_set_text(GTK_LABEL(help_ilabel[3]), buf);
922
923 /* FIXME: this should show ranges, negated reqs, and all the
924 * MAX_NUM_REQS reqs.
925 * Currently it's limited to 1 req but this code is partially prepared
926 * to be extended. Remember MAX_NUM_REQS is a compile-time
927 * definition. */
928 help_impr_req.u.req = NULL;
929 requirement_vector_iterate(&imp->reqs, preq) {
930 if (!preq->present) {
931 continue;
932 }
933 req = universal_name_translation(&preq->source, req_buf, sizeof(req_buf));
934 help_impr_req.u.req = preq;
935 break;
937 gtk_label_set_text(GTK_LABEL(help_ilabel[5]), req);
938/* create_tech_tree(help_improvement_tree, 0, imp->tech_req, 3); */
939 } else {
940 gtk_label_set_text(GTK_LABEL(help_ilabel[1]), "0");
941 gtk_label_set_text(GTK_LABEL(help_ilabel[3]), "0");
942 gtk_label_set_text(GTK_LABEL(help_ilabel[5]), REQ_LABEL_NEVER);
943/* create_tech_tree(help_improvement_tree, 0, advance_count(), 3); */
944 }
945
947
948 gtk_widget_show(help_itable);
949
950 helptext_building(buf, sizeof(buf), client.conn.playing, pitem->text, imp);
951 gtk_text_buffer_set_text(help_text, buf, -1);
952 gtk_widget_show(help_text_sw);
953}
954
955/**********************************************************************/
958static void help_update_wonder(const struct help_item *pitem,
959 char *title)
960{
961 char buf[8192];
963
964 if (imp != NULL && is_great_wonder(imp)) {
965 int i;
966 char req_buf[512];
967
968 sprintf(buf, "%d", impr_base_build_shield_cost(imp));
969 gtk_label_set_text(GTK_LABEL(help_wlabel[1]), buf);
970
971 /* FIXME: this should show ranges, negated reqs, and all the
972 * MAX_NUM_REQS reqs.
973 * Currently it's limited to 1 req but this code is partially prepared
974 * to be extended. Remember MAX_NUM_REQS is a compile-time
975 * definition. */
976 i = 0;
977 help_wndr_req.u.req = NULL;
978 requirement_vector_iterate(&imp->reqs, preq) {
979 if (!preq->present) {
980 continue;
981 }
982 gtk_label_set_text(GTK_LABEL(help_wlabel[3 + i]),
983 universal_name_translation(&preq->source,
984 req_buf, sizeof(req_buf)));
985 help_wndr_req.u.req = preq;
986 i++;
987 break;
989
990 gtk_label_set_text(GTK_LABEL(help_wlabel[5]), REQ_LABEL_NEVER);
992 if (pobs->source.kind == VUT_ADVANCE && pobs->present) {
993 gtk_label_set_text(GTK_LABEL(help_wlabel[5]),
995 (pobs->source.value.advance));
996
997 break;
998 }
1000
1001/* create_tech_tree(help_improvement_tree, 0, imp->tech_req, 3); */
1002 } else {
1003 /* Can't find wonder */
1004 gtk_label_set_text(GTK_LABEL(help_wlabel[1]), "0");
1005 gtk_label_set_text(GTK_LABEL(help_wlabel[3]), REQ_LABEL_NEVER);
1006 gtk_label_set_text(GTK_LABEL(help_wlabel[5]), skip_intl_qualifier_prefix(REQ_LABEL_NONE));
1007/* create_tech_tree(help_improvement_tree, 0, advance_count(), 3); */
1008 }
1009
1011
1012 gtk_widget_show(help_wtable);
1013
1014 helptext_building(buf, sizeof(buf), client.conn.playing, pitem->text, imp);
1015 gtk_text_buffer_set_text(help_text, buf, -1);
1016 gtk_widget_show(help_text_sw);
1017}
1018
1019/**********************************************************************/
1022static void help_update_unit_type(const struct help_item *pitem,
1023 char *title)
1024{
1025 char buf[8192];
1027
1028 if (utype != NULL) {
1029 sprintf(buf, "%d", utype_build_shield_cost_base(utype));
1030 gtk_label_set_text(GTK_LABEL(help_ulabel[0][1]), buf);
1031 sprintf(buf, "%d", utype->attack_strength);
1032 gtk_label_set_text(GTK_LABEL(help_ulabel[0][4]), buf);
1033 sprintf(buf, "%d", utype->defense_strength);
1034 gtk_label_set_text(GTK_LABEL(help_ulabel[1][1]), buf);
1035 sprintf(buf, "%s", move_points_text(utype->move_rate, TRUE));
1036 gtk_label_set_text(GTK_LABEL(help_ulabel[1][4]), buf);
1037 sprintf(buf, "%d", utype->firepower);
1038 gtk_label_set_text(GTK_LABEL(help_ulabel[2][1]), buf);
1039 sprintf(buf, "%d", utype->hp);
1040 gtk_label_set_text(GTK_LABEL(help_ulabel[2][4]), buf);
1041 gtk_label_set_text(GTK_LABEL(help_ulabel[3][1]),
1043 sprintf(buf, "%d", (int)sqrt((double)utype->vision_radius_sq));
1044 gtk_label_set_text(GTK_LABEL(help_ulabel[3][4]), buf);
1045 if (A_NEVER == utype->require_advance) {
1046 gtk_label_set_text(GTK_LABEL(help_ulabel[4][1]), REQ_LABEL_NEVER);
1047 } else {
1048 gtk_label_set_text(GTK_LABEL(help_ulabel[4][1]),
1050 }
1051
1052#if 0
1053 create_tech_tree(help_improvement_tree, 0,
1054 advance_number(utype->require_advance), 3);
1055#endif
1056
1057 if (U_NOT_OBSOLETED == utype->obsoleted_by) {
1058 gtk_label_set_text(GTK_LABEL(help_ulabel[4][4]),
1060 } else {
1061 gtk_label_set_text(GTK_LABEL(help_ulabel[4][4]),
1063 }
1064
1065 helptext_unit(buf, sizeof(buf), client.conn.playing, pitem->text, utype);
1066
1067 gtk_text_buffer_set_text(help_text, buf, -1);
1068 gtk_widget_show(help_text_sw);
1069
1071 direction8_invalid()));
1072 } else {
1073 gtk_label_set_text(GTK_LABEL(help_ulabel[0][1]), "0");
1074 gtk_label_set_text(GTK_LABEL(help_ulabel[0][4]), "0");
1075 gtk_label_set_text(GTK_LABEL(help_ulabel[1][1]), "0");
1076 gtk_label_set_text(GTK_LABEL(help_ulabel[1][4]), "0");
1077 gtk_label_set_text(GTK_LABEL(help_ulabel[2][1]), "0");
1078 gtk_label_set_text(GTK_LABEL(help_ulabel[2][4]), "0");
1079 gtk_label_set_text(GTK_LABEL(help_ulabel[3][1]), "0");
1080 gtk_label_set_text(GTK_LABEL(help_ulabel[3][4]), "0");
1081
1082 gtk_label_set_text(GTK_LABEL(help_ulabel[4][1]), REQ_LABEL_NEVER);
1083/* create_tech_tree(help_improvement_tree, 0, A_LAST, 3); */
1084 gtk_label_set_text(GTK_LABEL(help_ulabel[4][4]),
1086
1087 gtk_text_buffer_set_text(help_text, buf, -1);
1088 gtk_widget_show(help_text_sw);
1089 }
1090 gtk_widget_show(help_utable);
1091}
1092
1093/**********************************************************************/
1096static char *fc_chomp(char *str, size_t len)
1097{
1098 gchar *i;
1099
1100 if (str == NULL || !*str) {
1101 return str;
1102 }
1103
1104 i = str + len;
1105 for (i = g_utf8_find_prev_char(str, i);
1106 (i != NULL && g_unichar_isspace(g_utf8_get_char(i)));
1107 i = g_utf8_find_prev_char(str, i)) {
1108 *i = '\0';
1109 }
1110
1111 return str;
1112}
1113
1114/**********************************************************************/
1117static void help_update_tech(const struct help_item *pitem, char *title)
1118{
1119 int i, j;
1120 GtkWidget *w, *hbox;
1121 char buf[8192];
1122 struct advance *padvance = advance_by_translated_name(title);
1123
1124 if (padvance != NULL
1125 && !is_future_tech(i = advance_number(padvance))) {
1126 GtkTextBuffer *txt;
1127 size_t len;
1128
1130
1131 for (j = 0; j < ARRAY_SIZE(help_advances); j++) {
1132 help_advances[j] = FALSE;
1133 }
1134 gtk_tree_store_clear(tstore);
1136 gtk_widget_show(help_tree_sw);
1137 gtk_widget_show(help_tree_buttons_hbox);
1138
1139 helptext_advance(buf, sizeof(buf), client.conn.playing, pitem->text, i);
1140 len = strlen(buf);
1141 fc_chomp(buf, len);
1142
1144
1145 w = gtk_text_view_new();
1146 gtk_widget_set_hexpand(w, TRUE);
1147 gtk_widget_set_vexpand(w, TRUE);
1148 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(w), FALSE);
1149 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(w), GTK_WRAP_WORD);
1150 gtk_widget_set_name(w, "help_text");
1151 gtk_widget_set_margin_start(w, 5);
1152 gtk_widget_set_margin_end(w, 5);
1153 gtk_widget_set_margin_top(w, 5);
1154 gtk_widget_set_margin_bottom(w, 5);
1155 gtk_text_view_set_editable(GTK_TEXT_VIEW(w), FALSE);
1156 help_box_add(w);
1157 gtk_widget_show(w);
1158
1159 txt = gtk_text_view_get_buffer(GTK_TEXT_VIEW(w));
1160 if (txt) {
1161 gtk_text_buffer_set_text(txt, buf, -1);
1162 }
1163
1164 w = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
1165 gtk_widget_set_margin_bottom(w, 5);
1166 gtk_widget_set_margin_end(w, 5);
1167 gtk_widget_set_margin_start(w, 5);
1168 gtk_widget_set_margin_top(w, 5);
1169 gtk_widget_set_hexpand(w, TRUE);
1170 gtk_widget_set_vexpand(w, TRUE);
1171 help_box_add(w);
1172 gtk_widget_show(w);
1173
1174 governments_iterate(pgov) {
1175 /* FIXME: need a more general mechanism for this, since this
1176 * helptext needs to be shown in all possible req source types. */
1177 requirement_vector_iterate(&pgov->reqs, preq) {
1178 if (VUT_ADVANCE == preq->source.kind
1179 && preq->source.value.advance == padvance) {
1180 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
1181 help_box_add(hbox);
1182 w = gtk_label_new(_("Allows"));
1183 gtk_box_append(GTK_BOX(hbox), w);
1186 gtk_box_append(GTK_BOX(hbox), w);
1187 gtk_widget_show(hbox);
1188 }
1191
1192 improvement_iterate(pimprove) {
1193 if (valid_improvement(pimprove)) {
1194 requirement_vector_iterate(&pimprove->reqs, preq) {
1195 if (VUT_ADVANCE == preq->source.kind
1196 && preq->source.value.advance == padvance) {
1197 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
1198 help_box_add(hbox);
1199 w = gtk_label_new(_("Allows"));
1200 gtk_box_append(GTK_BOX(hbox), w);
1202 is_great_wonder(pimprove)
1203 ? HELP_WONDER
1205 gtk_box_append(GTK_BOX(hbox), w);
1206 gtk_widget_show(hbox);
1207 }
1209 requirement_vector_iterate(&pimprove->obsolete_by, pobs) {
1210 if (pobs->source.kind == VUT_ADVANCE
1211 && pobs->source.value.advance == padvance
1212 && pobs->present) {
1213 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
1214 help_box_add(hbox);
1215 w = gtk_label_new(_("Obsoletes"));
1216 gtk_box_append(GTK_BOX(hbox), w);
1218 is_great_wonder(pimprove)
1219 ? HELP_WONDER
1221 gtk_box_append(GTK_BOX(hbox), w);
1222 gtk_widget_show(hbox);
1223 }
1225 }
1227
1228 unit_type_iterate(punittype) {
1229 if (padvance != punittype->require_advance) {
1230 continue;
1231 }
1232 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
1233 help_box_add(hbox);
1234 w = gtk_label_new(_("Allows"));
1235 gtk_box_append(GTK_BOX(hbox), w);
1237 gtk_box_append(GTK_BOX(hbox), w);
1238 gtk_widget_show(hbox);
1240
1241 advance_iterate(A_NONE, ptest) {
1242 if (padvance == advance_requires(ptest, AR_ONE)) {
1244 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
1245 help_box_add(hbox);
1246 w = gtk_label_new(_("Allows"));
1247 gtk_box_append(GTK_BOX(hbox), w);
1249 gtk_box_append(GTK_BOX(hbox), w);
1250 gtk_widget_show(hbox);
1251 } else {
1252 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
1253 help_box_add(hbox);
1254 w = gtk_label_new(_("Allows"));
1255 gtk_box_append(GTK_BOX(hbox), w);
1257 gtk_box_append(GTK_BOX(hbox), w);
1258 w = gtk_label_new(_("with"));
1259 gtk_box_append(GTK_BOX(hbox), w);
1261 AR_TWO)),
1262 HELP_TECH);
1263 gtk_box_append(GTK_BOX(hbox), w);
1264 w = gtk_label_new(Q_("?techhelp:"));
1265 gtk_box_append(GTK_BOX(hbox), w);
1266 gtk_widget_show(hbox);
1267 }
1268 }
1269 if (padvance == advance_requires(ptest, AR_TWO)) {
1270 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
1271 help_box_add(hbox);
1272 w = gtk_label_new(_("Allows"));
1273 gtk_box_append(GTK_BOX(hbox), w);
1275 gtk_box_append(GTK_BOX(hbox), w);
1276 w = gtk_label_new(_("with"));
1277 gtk_box_append(GTK_BOX(hbox), w);
1279 AR_ONE)),
1280 HELP_TECH);
1281 gtk_box_append(GTK_BOX(hbox), w);
1282 w = gtk_label_new(Q_("?techhelp:"));
1283 gtk_box_append(GTK_BOX(hbox), w);
1284 gtk_widget_show(hbox);
1285 }
1287
1288 gtk_widget_show(help_vbox);
1289 }
1290}
1291
1292/**********************************************************************/
1295static void add_act_help_for_terrain(const char *act_label,
1296 const char *result_link_label,
1297 enum help_page_type result_link_type,
1298 const char *descr_label)
1299{
1300 GtkWidget *w;
1301 GtkWidget *hbox;
1302
1303 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
1304 help_box_add(hbox);
1305 w = gtk_label_new(act_label);
1306 gtk_box_append(GTK_BOX(hbox), w);
1307 w = help_slink_new_page(result_link_label, result_link_type);
1308 gtk_box_append(GTK_BOX(hbox), w);
1309 w = gtk_label_new(descr_label);
1310 gtk_box_append(GTK_BOX(hbox), w);
1311
1312 gtk_widget_show(hbox);
1313}
1314
1315/**********************************************************************/
1318static void help_extras_of_act_for_terrain(struct terrain *pterr,
1319 enum unit_activity act,
1320 char *label)
1321{
1322 enum extra_cause cause = activity_to_extra_cause(act);
1323
1324 extra_type_by_cause_iterate(cause, pextra) {
1325 if (pextra->buildable
1326 && requirement_fulfilled_by_terrain(pterr, &(pextra->reqs))) {
1329 helptext_extra_for_terrain_str(pextra, pterr,
1330 act));
1331 }
1333}
1334
1335/**********************************************************************/
1338static void help_update_terrain(const struct help_item *pitem,
1339 char *title)
1340{
1341 char buf[8192];
1342 struct terrain *pterrain = terrain_by_translated_name(title);
1343
1344 if (pterrain != NULL) {
1345 struct universal for_terr = { .kind = VUT_TERRAIN, .value = { .terrain = pterrain }};
1346
1348
1349 {
1350 /* 25 => "1.25"; 50 => "1.5"; 100 => "2.0" */
1351 int defbonus = pterrain->defense_bonus + 100;
1352 int frac = defbonus % 100;
1353
1354 if ((frac % 10) == 0) {
1355 frac /= 10;
1356 }
1357 sprintf(buf, "%d/%d.%d",
1358 pterrain->movement_cost, defbonus / 100, frac);
1359 }
1360 gtk_label_set_text(GTK_LABEL(help_tlabel[0][1]), buf);
1361
1362 sprintf(buf, "%d/%d/%d",
1363 pterrain->output[O_FOOD],
1364 pterrain->output[O_SHIELD],
1365 pterrain->output[O_TRADE]);
1366 gtk_label_set_text(GTK_LABEL(help_tlabel[0][4]), buf);
1367
1368 buf[0] = '\0';
1369 if (*(pterrain->resources)) {
1370 struct extra_type **r;
1371
1372 for (r = pterrain->resources; *r; r++) {
1373 /* TRANS: " Whales (2/1/2)," */
1374 sprintf (buf + strlen (buf), " %s (%d/%d/%d),",
1376 pterrain->output[O_FOOD] + (*r)->data.resource->output[O_FOOD],
1377 pterrain->output[O_SHIELD] + (*r)->data.resource->output[O_SHIELD],
1378 pterrain->output[O_TRADE] + (*r)->data.resource->output[O_TRADE]);
1379 }
1380 buf[strlen (buf) - 1] = '.';
1381 } else {
1382 /* TRANS: "Resources: (none)" */
1383 sprintf (buf + strlen (buf), _("(none)"));
1384 }
1385 gtk_label_set_text(GTK_LABEL(help_tlabel[1][1]), buf);
1386
1388
1389 if (pterrain->cultivate_result != T_NONE
1390 && action_id_univs_not_blocking(ACTION_CULTIVATE,
1391 NULL, &for_terr)) {
1392 fc_snprintf(buf, sizeof(buf),
1393 PL_("%d turn", "%d turns", pterrain->cultivate_time),
1394 pterrain->cultivate_time);
1395 add_act_help_for_terrain(_("Cultivate Rslt/Time"),
1397 HELP_TERRAIN, buf);
1398 }
1399
1400 if (pterrain->plant_result != T_NONE
1401 && action_id_univs_not_blocking(ACTION_PLANT, NULL, &for_terr)) {
1402 fc_snprintf(buf, sizeof(buf),
1403 PL_("%d turn", "%d turns", pterrain->plant_time),
1404 pterrain->plant_time);
1405 add_act_help_for_terrain(_("Plant Rslt/Time"),
1407 HELP_TERRAIN, buf);
1408 }
1409
1410 if (pterrain->transform_result != T_NONE
1411 && action_id_univs_not_blocking(ACTION_TRANSFORM_TERRAIN,
1412 NULL, &for_terr)) {
1413 fc_snprintf(buf, sizeof(buf),
1414 PL_("%d turn", "%d turns", pterrain->transform_time),
1415 pterrain->transform_time);
1416 add_act_help_for_terrain(_("Trans. Rslt/Time"),
1418 HELP_TERRAIN, buf);
1419 }
1420
1421 if (action_id_univs_not_blocking(ACTION_IRRIGATE, NULL, &for_terr)) {
1422 help_extras_of_act_for_terrain(pterrain, ACTIVITY_IRRIGATE,
1423 _("Build as irrigation"));
1424 }
1425 if (action_id_univs_not_blocking(ACTION_MINE, NULL, &for_terr)) {
1426 help_extras_of_act_for_terrain(pterrain, ACTIVITY_MINE,
1427 _("Build as mine"));
1428 }
1429 if (pterrain->road_time != 0
1430 && action_id_univs_not_blocking(ACTION_ROAD, NULL, &for_terr)) {
1431 help_extras_of_act_for_terrain(pterrain, ACTIVITY_GEN_ROAD,
1432 _("Build as road"));
1433 }
1434 if (pterrain->base_time != 0
1435 && action_id_univs_not_blocking(ACTION_BASE, NULL, &for_terr)) {
1436 help_extras_of_act_for_terrain(pterrain, ACTIVITY_BASE,
1437 _("Build as base"));
1438 }
1439 gtk_widget_show(help_vbox);
1440 }
1441
1442 helptext_terrain(buf, sizeof(buf), client.conn.playing,
1443 pitem->text, pterrain);
1444
1445 gtk_text_buffer_set_text(help_text, buf, -1);
1446 gtk_widget_show(help_text_sw);
1447
1448 gtk_widget_show(help_ttable);
1449}
1450
1451/**********************************************************************/
1454static void help_update_extra(const struct help_item *pitem, char *title)
1455{
1456 char buf[8192];
1458
1459 buf[0] = '\0';
1460 if (pextra == NULL) {
1461 strcat(buf, pitem->text);
1462 } else {
1463 struct road_type *proad = extra_road_get(pextra);
1464 bool is_resource = is_extra_caused_by(pextra, EC_RESOURCE);
1465
1467
1468 /* Cost to build */
1469 if (pextra->buildable) {
1470 if (pextra->build_time != 0) {
1471 /* TRANS: "MP" = movement points */
1472 sprintf(buf, _("%d MP"), pextra->build_time);
1473 } else {
1474 /* TRANS: Build time depends on terrain. */
1475 sprintf(buf, _("Terrain specific"));
1476 }
1477 } else {
1478 sprintf(buf, "-");
1479 }
1480 gtk_label_set_text(GTK_LABEL(help_elabel[1]), buf);
1481 /* Conflicting extras */
1482 buf[0] = '\0';
1483 if (is_resource) {
1484 /* TRANS: (Resource extra) Conflicts with: */
1485 strcat(buf, _("Other Resources"));
1486 }
1487 extra_type_iterate(pextra2) {
1488 if (!can_extras_coexist(pextra, pextra2)
1489 && (!is_resource || !is_extra_caused_by(pextra2, EC_RESOURCE))) {
1490 if (buf[0] != '\0') {
1491 strcat(buf, "/");
1492 }
1493 strcat(buf, extra_name_translation(pextra2));
1494 }
1496 /* TRANS: "Conflicts with: (none)" (extras) */
1497 gtk_label_set_text(GTK_LABEL(help_elabel[3]), buf[0] ? buf : _("(none)"));
1498
1499 /* Bonus */
1500 if (proad != NULL) {
1501 const char *bonus = NULL;
1502
1504 if (proad->tile_incr[o] > 0) {
1505 /* TRANS: Road bonus depends on terrain. */
1506 bonus = _("Terrain specific");
1507 break;
1508 }
1510 if (bonus == NULL) {
1511 bonus = helptext_road_bonus_str(NULL, proad);
1512
1513 if (bonus == NULL) {
1514 /* TRANS: No output bonus from a road */
1515 bonus = Q_("?bonus:None");
1516 }
1517 }
1518 gtk_label_set_text(GTK_LABEL(help_elabel[5]), bonus);
1519 gtk_widget_set_visible(GTK_WIDGET(help_elabel[4]), TRUE);
1520 gtk_widget_set_visible(GTK_WIDGET(help_elabel[5]), TRUE);
1521 } else {
1522 gtk_widget_set_visible(GTK_WIDGET(help_elabel[4]), FALSE);
1523 gtk_widget_set_visible(GTK_WIDGET(help_elabel[5]), FALSE);
1524 }
1525
1526 helptext_extra(buf, sizeof(buf), client.conn.playing, pitem->text, pextra);
1527 }
1528 gtk_widget_show(help_etable);
1529
1530 gtk_text_buffer_set_text(help_text, buf, -1);
1531 gtk_widget_show(help_text_sw);
1532}
1533
1534/**********************************************************************/
1537static void help_update_goods(const struct help_item *pitem,
1538 char *title)
1539{
1540 char buf[8192];
1541 struct goods_type *pgood = goods_by_translated_name(title);
1542
1543 if (pgood == NULL) {
1544 strcat(buf, pitem->text);
1545 } else {
1546 helptext_goods(buf, sizeof(buf), client.conn.playing, pitem->text,
1547 pgood);
1548 }
1549
1550 gtk_text_buffer_set_text(help_text, buf, -1);
1551 gtk_widget_show(help_text_sw);
1552}
1553
1554/**********************************************************************/
1557static void help_update_specialist(const struct help_item *pitem,
1558 char *title)
1559{
1560 char buf[8192];
1562
1563 if (pspec == NULL) {
1564 strcat(buf, pitem->text);
1565 } else {
1566 helptext_specialist(buf, sizeof(buf), client.conn.playing, pitem->text,
1567 pspec);
1568 }
1569
1570 gtk_text_buffer_set_text(help_text, buf, -1);
1571 gtk_widget_show(help_text_sw);
1572}
1573
1574/**********************************************************************/
1577static void help_update_government(const struct help_item *pitem,
1578 char *title)
1579{
1580 char buf[8192];
1582
1583 if (gov == NULL) {
1584 strcat(buf, pitem->text);
1585 } else {
1586 helptext_government(buf, sizeof(buf), client.conn.playing,
1587 pitem->text, gov);
1588 }
1589
1590 gtk_text_buffer_set_text(help_text, buf, -1);
1591 gtk_widget_show(help_text_sw);
1592}
1593
1594/**********************************************************************/
1597static void help_update_nation(const struct help_item *pitem, char *title,
1598 struct nation_type *pnation)
1599{
1600 char buf[4096];
1601
1602 if (pnation == NULL) {
1603 strcat(buf, pitem->text);
1604 } else {
1605 helptext_nation(buf, sizeof(buf), pnation, pitem->text);
1606
1608 }
1609
1610 gtk_text_buffer_set_text(help_text, buf, -1);
1611 gtk_widget_show(help_text_sw);
1612}
1613
1614/**********************************************************************/
1617static void help_update_dialog(const struct help_item *pitem)
1618{
1619 char *top;
1620
1621 /* Figure out what kind of item is required for pitem ingo */
1622
1623 for (top = pitem->topic; *top == ' '; top++) {
1624 /* Nothing */
1625 }
1626
1627 help_box_hide();
1628 gtk_text_buffer_set_text(help_text, "", -1);
1629
1630 switch (pitem->type) {
1631 case HELP_IMPROVEMENT:
1632 help_update_improvement(pitem, top);
1633 break;
1634 case HELP_WONDER:
1635 help_update_wonder(pitem, top);
1636 break;
1637 case HELP_UNIT:
1638 help_update_unit_type(pitem, top);
1639 break;
1640 case HELP_TECH:
1641 help_update_tech(pitem, top);
1642 break;
1643 case HELP_TERRAIN:
1644 help_update_terrain(pitem, top);
1645 break;
1646 case HELP_EXTRA:
1647 help_update_extra(pitem, top);
1648 break;
1649 case HELP_GOODS:
1650 help_update_goods(pitem, top);
1651 break;
1652 case HELP_SPECIALIST:
1653 help_update_specialist(pitem, top);
1654 break;
1655 case HELP_GOVERNMENT:
1656 help_update_government(pitem, top);
1657 break;
1658 case HELP_NATIONS:
1660 break;
1661 case HELP_TEXT:
1662 default:
1663 /* It was a pure text item */
1664 gtk_text_buffer_set_text(help_text, pitem->text, -1);
1665 gtk_widget_show(help_text_sw);
1666 break;
1667 }
1668 set_title_topic(pitem->topic);
1669
1670 gtk_widget_show(help_box);
1671}
1672
1673/**********************************************************************/
1676static void help_item_zoom(GtkTreePath *path)
1677{
1678 GtkTreeModel *model;
1679 GtkTreeIter it, child, item;
1680 GtkTreeSelection *selection;
1681
1682 model = gtk_tree_view_get_model(GTK_TREE_VIEW(help_view));
1683 gtk_tree_model_get_iter(model, &item, path);
1684
1685 for (child = item; gtk_tree_model_iter_parent(model, &it, &child); child = it) {
1686 GtkTreePath *it_path;
1687
1688 it_path = gtk_tree_model_get_path(model, &it);
1689 gtk_tree_view_expand_row(GTK_TREE_VIEW(help_view), it_path, TRUE);
1690 gtk_tree_path_free(it_path);
1691 }
1692
1693 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(help_view));
1694 gtk_tree_selection_select_iter(selection, &item);
1695 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(help_view), path, NULL,
1696 TRUE, 0.0, 0.0);
1697}
1698
1699/**********************************************************************/
1702static GtkTreePath *help_item_path(const struct help_item *pitem)
1703{
1704 GtkTreePath *path;
1705 bool next;
1706
1707 path = gtk_tree_path_new_first();
1708 next = FALSE;
1709 help_items_iterate(pitem2) {
1710 const char *s;
1711 int depth;
1712
1713 for (s = pitem2->topic; *s == ' '; s++) {
1714 /* Nothing */
1715 }
1716 depth = s - pitem2->topic + 1;
1717
1718 while (depth < gtk_tree_path_get_depth(path)) {
1719 gtk_tree_path_up(path);
1720 gtk_tree_path_next(path);
1721 next = FALSE;
1722 }
1723 while (depth > gtk_tree_path_get_depth(path)) {
1724 gtk_tree_path_down(path);
1725 next = FALSE;
1726 }
1727
1728 if (next) {
1729 gtk_tree_path_next(path);
1730 }
1731
1732 if (pitem == pitem2) {
1733 break;
1734 }
1735
1736 next = TRUE;
1738
1739 return path;
1740}
1741
1742/**********************************************************************/
1745static void select_help_item_string(const char *item, enum help_page_type htype)
1746{
1747 const struct help_item *pitem;
1748 int idx;
1749 GtkTreePath *path;
1750 GtkTreeViewColumn *col;
1751
1752 if (!(pitem = get_help_item_spec(item, htype, &idx))) {
1753 return;
1754 }
1755
1756 path = help_item_path(pitem);
1757 help_item_zoom(path);
1758
1759 col = gtk_tree_view_get_column(GTK_TREE_VIEW(help_view), 0);
1760 gtk_tree_view_set_cursor(GTK_TREE_VIEW(help_view), path, col, FALSE);
1761 gtk_tree_path_free(path);
1762}
1763
1764/**********************************************************************/
1767static void help_command_update(void)
1768{
1769 GtkDialog *dialog = GTK_DIALOG(help_dialog_shell);
1770
1771 if (help_history_pos < 0) {
1772 gtk_dialog_set_response_sensitive(dialog, 1, FALSE);
1773 gtk_dialog_set_response_sensitive(dialog, 2, FALSE);
1774 } else {
1775 gtk_dialog_set_response_sensitive(dialog, 1, TRUE);
1776 gtk_dialog_set_response_sensitive(dialog, 2, TRUE);
1777
1778 if (help_history_pos == 0) {
1779 gtk_dialog_set_response_sensitive(dialog, 1, FALSE);
1780 }
1781 if (help_history_pos >= help_history->len - 1) {
1782 gtk_dialog_set_response_sensitive(dialog, 2, FALSE);
1783 }
1784 }
1785}
1786
1787/**********************************************************************/
1790static void help_command_callback(GtkWidget *w, gint response_id)
1791{
1792 GtkTreePath *path;
1793 const struct help_item *pitem;
1794
1795 if (response_id == 1) {
1796 if (help_history_pos > 0) {
1798
1799 pitem = g_ptr_array_index(help_history, help_history_pos);
1800 path = help_item_path(pitem);
1801 help_item_zoom(path);
1802 help_update_dialog(pitem);
1804 }
1805 } else if (response_id == 2) {
1806 if (help_history_pos < help_history->len - 1) {
1808
1809 pitem = g_ptr_array_index(help_history, help_history_pos);
1810 path = help_item_path(pitem);
1811 help_item_zoom(path);
1812 help_update_dialog(pitem);
1814 }
1815 } else {
1816 /* Save size of the dialog. */
1817 gtk_window_get_default_size (GTK_WINDOW(help_dialog_shell),
1820 gtk_window_destroy(GTK_WINDOW(help_dialog_shell));
1821 }
1822}
#define action_id_univs_not_blocking(act_id, act_uni, tgt_uni)
Definition actions.h:964
#define str
Definition astring.c:76
#define output_type_iterate(output)
Definition city.h:821
#define output_type_iterate_end
Definition city.h:827
struct civclient client
#define client_player()
struct color * get_color(const struct tileset *t, enum color_std stdcolor)
struct extra_type * extra_type_by_translated_name(const char *name)
Definition extras.c:227
enum extra_cause activity_to_extra_cause(enum unit_activity act)
Definition extras.c:1028
bool can_extras_coexist(const struct extra_type *pextra1, const struct extra_type *pextra2)
Definition extras.c:952
const char * extra_name_translation(const struct extra_type *pextra)
Definition extras.c:186
#define extra_type_iterate(_p)
Definition extras.h:291
#define extra_type_iterate_end
Definition extras.h:297
#define is_extra_caused_by(e, c)
Definition extras.h:196
#define extra_road_get(_e_)
Definition extras.h:185
#define extra_type_by_cause_iterate_end
Definition extras.h:315
#define extra_type_by_cause_iterate(_cause, _extra)
Definition extras.h:309
@ O_SHIELD
Definition fc_types.h:91
@ O_FOOD
Definition fc_types.h:91
@ O_TRADE
Definition fc_types.h:91
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:142
struct government * government_by_translated_name(const char *name)
Definition government.c:39
#define governments_iterate(NAME_pgov)
Definition government.h:121
#define governments_iterate_end
Definition government.h:124
#define FC_STATIC_CANVAS_INIT
Definition canvas.h:27
GtkWidget * toplevel
Definition gui_main.c:124
void setup_dialog(GtkWidget *shell, GtkWidget *parent)
Definition gui_stuff.c:281
static GtkWidget * help_tree_sw
Definition helpdlg.c:82
static void set_title_topic(char *topic)
Definition helpdlg.c:172
static void activated_topic(GtkTreeView *view, gpointer data)
Definition helpdlg.c:467
static GtkWidget * help_tree
Definition helpdlg.c:79
static GtkWidget * help_tree_expand
Definition helpdlg.c:83
static GtkWidget * help_ulabel[5][5]
Definition helpdlg.c:88
static void help_update_specialist(const struct help_item *pitem, char *title)
Definition helpdlg.c:1498
static void help_hyperlink_callback(GtkWidget *w)
Definition helpdlg.c:343
static GtkWidget * help_elabel[6]
Definition helpdlg.c:90
static GtkWidget * help_etable
Definition helpdlg.c:78
static void help_destroy_callback(GtkWidget *w, gpointer data)
Definition helpdlg.c:458
static void set_help_tile_from_extra(const struct extra_type *pextra)
Definition helpdlg.c:848
static GtkWidget * help_frame
Definition helpdlg.c:68
static void help_tech_tree_activated_callback(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data)
Definition helpdlg.c:310
static void help_update_tech(const struct help_item *pitem, char *title)
Definition helpdlg.c:1076
static void help_item_zoom(GtkTreePath *path)
Definition helpdlg.c:1616
static GtkWidget * help_slink_new_page(const gchar *txt, enum help_page_type page)
Definition helpdlg.c:425
static GtkWidget * help_tlabel[2][5]
Definition helpdlg.c:89
static GtkTreePath * help_item_path(const struct help_item *pitem)
Definition helpdlg.c:1642
static GtkWidget * help_tree_collapse
Definition helpdlg.c:84
static void help_update_nation(const struct help_item *pitem, char *title, struct nation_type *pnation)
Definition helpdlg.c:1537
static void create_help_dialog(void)
Definition helpdlg.c:508
static GtkTextBuffer * help_text
Definition helpdlg.c:69
static void help_update_wonder(const struct help_item *pitem, char *title)
Definition helpdlg.c:926
static GtkWidget * help_hyperlink_new_page(GtkWidget *label, enum help_page_type page)
Definition helpdlg.c:400
static GtkWidget * help_dialog_shell
Definition helpdlg.c:63
static GtkWidget * help_text_sw
Definition helpdlg.c:70
static GPtrArray * help_history
Definition helpdlg.c:94
static const char * help_elabel_name[6]
Definition helpdlg.c:131
static void create_tech_tree(int tech, int levels, GtkTreeIter *parent)
Definition helpdlg.c:225
static void help_update_extra(const struct help_item *pitem, char *title)
Definition helpdlg.c:1399
static GtkWidget * help_ilabel[6]
Definition helpdlg.c:86
static void set_help_tile_from_sprite(struct sprite *spr)
Definition helpdlg.c:804
static const char * help_wlabel_name[6]
Definition helpdlg.c:110
static const char * help_ulabel_name[5][5]
Definition helpdlg.c:116
static void help_tech_tree_collapse_callback(GtkWidget *w, gpointer data)
Definition helpdlg.c:335
static void set_help_tile_from_terrain(struct terrain *pterr)
Definition helpdlg.c:817
static GtkWidget * help_view
Definition helpdlg.c:66
static void help_update_goods(const struct help_item *pitem, char *title)
Definition helpdlg.c:1478
void help_system_init(void)
Definition helpdlg.c:156
static void help_box_hide(void)
Definition helpdlg.c:434
static void help_update_unit_type(const struct help_item *pitem, char *title)
Definition helpdlg.c:990
void popdown_help_dialog(void)
Definition helpdlg.c:185
static void help_update_terrain(const struct help_item *pitem, char *title)
Definition helpdlg.c:1288
static void help_update_dialog(const struct help_item *pitem)
Definition helpdlg.c:1557
static char * fc_chomp(char *str, size_t len)
Definition helpdlg.c:1057
void popup_help_dialog_string(const char *item)
Definition helpdlg.c:211
static int help_history_pos
Definition helpdlg.c:95
static struct help_page_selection help_wndr_req
Definition helpdlg.c:112
static GtkWidget * help_wlabel[6]
Definition helpdlg.c:87
static GtkWidget * help_box
Definition helpdlg.c:73
static void help_extras_of_act_for_terrain(struct terrain *pterr, enum unit_activity act, char *label)
Definition helpdlg.c:1268
void popup_help_dialog_typed(const char *item, enum help_page_type htype)
Definition helpdlg.c:195
#define REQ_LABEL_NEVER
Definition helpdlg.c:143
static void help_command_update(void)
Definition helpdlg.c:1706
static struct help_page_selection page_selections[HELP_LAST]
Definition helpdlg.c:114
#define TECH_TREE_DEPTH
Definition helpdlg.c:58
static const char * help_tlabel_name[2][5]
Definition helpdlg.c:125
static struct help_page_selection help_impr_req
Definition helpdlg.c:108
#define REQ_LABEL_NONE
Definition helpdlg.c:142
static GtkWidget * help_wtable
Definition helpdlg.c:75
static GtkWidget * help_slink_new(const gchar *txt, struct help_page_selection *select)
Definition helpdlg.c:409
static GtkWidget * help_vbox
Definition helpdlg.c:71
static void help_tech_tree_expand_callback(GtkWidget *w, gpointer data)
Definition helpdlg.c:327
static GtkWidget * help_tile
Definition helpdlg.c:72
static GtkWidget * help_hyperlink_new(GtkWidget *label, struct help_page_selection *select)
Definition helpdlg.c:378
static void help_update_government(const struct help_item *pitem, char *title)
Definition helpdlg.c:1518
static GtkWidget * help_ttable
Definition helpdlg.c:77
static void help_update_improvement(const struct help_item *pitem, char *title)
Definition helpdlg.c:876
static const char * help_ilabel_name[6]
Definition helpdlg.c:106
static GtkWidget * help_tree_buttons_hbox
Definition helpdlg.c:85
static GtkWidget * help_view_sw
Definition helpdlg.c:64
static void select_help_item_string(const char *item, enum help_page_type htype)
Definition helpdlg.c:1684
static bool help_advances[A_LAST]
Definition helpdlg.c:92
static GtkWidget * help_utable
Definition helpdlg.c:76
static GtkWidget * help_itable
Definition helpdlg.c:74
static GtkTreeStore * tstore
Definition helpdlg.c:80
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:1245
static void help_command_callback(GtkWidget *w, gint response_id)
Definition helpdlg.c:1729
const char * title
Definition repodlgs.c:1313
GType type
Definition repodlgs.c:1312
static void help_box_add(GtkWidget *wdg)
Definition helpdlg.c:457
static int help_dlog_height
Definition helpdlg.c:69
static void help_box_clear(void)
Definition helpdlg.c:465
static int help_dlog_width
Definition helpdlg.c:69
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:4235
void helptext_advance(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, int i)
Definition helpdata.c:3175
enum help_page_type help_type_by_requirement(const struct requirement *req)
Definition helpdata.c:5097
void helptext_extra(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, struct extra_type *pextra)
Definition helpdata.c:3679
void helptext_goods(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, struct goods_type *pgood)
Definition helpdata.c:4154
const char * helptext_road_bonus_str(const struct terrain *pterrain, const struct road_type *proad)
Definition helpdata.c:3515
char * helptext_unit_upkeep_str(const struct unit_type *utype)
Definition helpdata.c:4894
const char * helptext_extra_for_terrain_str(struct extra_type *pextra, struct terrain *pterrain, enum unit_activity act)
Definition helpdata.c:3645
void helptext_specialist(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, struct specialist *pspec)
Definition helpdata.c:4200
const struct help_item * get_help_item_spec(const char *name, enum help_page_type htype, int *pos)
Definition helpdata.c:1281
char * helptext_building(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, const struct impr_type *pimprove)
Definition helpdata.c:1374
void helptext_terrain(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, struct terrain *pterrain)
Definition helpdata.c:3398
char * helptext_unit(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, const struct unit_type *utype)
Definition helpdata.c:1823
void helptext_nation(char *buf, size_t bufsz, struct nation_type *pnation, const char *user_text)
Definition helpdata.c:4931
#define help_items_iterate(pitem)
Definition helpdata.h:70
#define help_items_iterate_end
Definition helpdata.h:74
#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:23
@ HELP_LAST
Definition helpdlg_g.h:24
@ 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:1005
struct nation_type * nation_by_translated_plural(const char *name)
Definition nation.c:105
int len
Definition packhand.c:125
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:747
const char * research_advance_name_translation(const struct research *presearch, Tech_type_id tech)
Definition research.c:271
struct research * research_get(const struct player *pplayer)
Definition research.c:126
enum tech_state research_invention_state(const struct research *presearch, Tech_type_id tech)
Definition research.c:616
#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:22
struct connection conn
Definition client_main.h:96
Definition colors.h:20
struct player * playing
Definition connection.h:156
bool buildable
Definition extras.h:112
int build_time
Definition extras.h:114
char * topic
Definition helpdata.h:26
enum help_page_type type
Definition helpdata.h:27
char * text
Definition helpdata.h:26
enum help_page_selection::@152 type
enum help_page_type page
Definition helpdlg.c:101
const struct requirement * req
Definition helpdlg.c:102
union help_page_selection::@153 u
struct requirement_vector obsolete_by
Definition improvement.h:76
struct requirement_vector reqs
Definition improvement.h:75
Definition climisc.h:82
int tile_incr[O_LAST]
Definition road.h:81
cairo_surface_t * surface
Definition sprite.h:23
struct terrain * cultivate_result
Definition terrain.h:203
struct extra_type ** resources
Definition terrain.h:197
int road_time
Definition terrain.h:201
int plant_time
Definition terrain.h:207
struct terrain * plant_result
Definition terrain.h:206
int defense_bonus
Definition terrain.h:193
int cultivate_time
Definition terrain.h:204
int movement_cost
Definition terrain.h:192
int output[O_LAST]
Definition terrain.h:195
int transform_time
Definition terrain.h:218
struct terrain * transform_result
Definition terrain.h:217
int base_time
Definition terrain.h:200
int defense_strength
Definition unittype.h:496
int firepower
Definition unittype.h:506
const struct unit_type * obsoleted_by
Definition unittype.h:510
int vision_radius_sq
Definition unittype.h:503
int move_rate
Definition unittype.h:497
struct advance * require_advance
Definition unittype.h:500
int attack_strength
Definition unittype.h:495
enum universals_n kind
Definition fc_types.h:758
int fc_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:969
#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 A_NEVER
Definition tech.h:51
@ AR_TWO
Definition tech.h:112
@ AR_ONE
Definition tech.h:111
#define advance_iterate(_start, _p)
Definition tech.h:264
#define A_NONE
Definition tech.h:43
#define advance_iterate_end
Definition tech.h:270
#define A_LAST
Definition tech.h:45
struct terrain * terrain_by_translated_name(const char *name)
Definition terrain.c:190
const char * terrain_name_translation(const struct terrain *pterrain)
Definition terrain.c:226
#define T_NONE
Definition terrain.h:56
struct sprite * get_building_sprite(const struct tileset *t, const struct impr_type *pimprove)
Definition tilespec.c:6495
struct sprite * get_unittype_sprite(const struct tileset *t, const struct unit_type *punittype, enum direction8 facing)
Definition tilespec.c:6517
int fill_basic_extra_sprite_array(const struct tileset *t, struct drawn_sprite *sprs, const struct extra_type *pextra)
Definition tilespec.c:6898
int fill_basic_terrain_layer_sprite_array(struct tileset *t, struct drawn_sprite *sprs, int layer, struct terrain *pterrain)
Definition tilespec.c:6865
int tileset_tile_height(const struct tileset *t)
Definition tilespec.c:728
struct sprite * get_nation_flag_sprite(const struct tileset *t, const struct nation_type *pnation)
Definition tilespec.c:6468
int tileset_tile_width(const struct tileset *t)
Definition tilespec.c:716
struct sprite * get_tech_sprite(const struct tileset *t, Tech_type_id tech)
Definition tilespec.c:6486
struct goods_type * goods_by_translated_name(const char *name)
int utype_build_shield_cost_base(const struct unit_type *punittype)
Definition unittype.c:1520
struct unit_type * unit_type_by_translated_name(const char *name)
Definition unittype.c:1804
const char * utype_name_translation(const struct unit_type *punittype)
Definition unittype.c:1612
#define unit_type_iterate(_p)
Definition unittype.h:841
#define unit_type_iterate_end
Definition unittype.h:848
#define U_NOT_OBSOLETED
Definition unittype.h:509
const char * freeciv_name_version(void)
Definition version.c:35