<URL: http://bugs.freeciv.org/Ticket/Display.html?id=40358 >
This patch adds support for ruleset description. Custom rulesets can show generic description, containing background and important rules of the ruleset in the help browser. Only gtk-client supported. - ML
diff -Nurd -X.diff_ignore freeciv/client/gui-gtk-2.0/menu.c freeciv/client/gui-gtk-2.0/menu.c --- freeciv/client/gui-gtk-2.0/menu.c 2008-07-03 21:58:06.000000000 +0300 +++ freeciv/client/gui-gtk-2.0/menu.c 2008-07-03 23:35:20.000000000 +0300 @@ -178,6 +178,7 @@ MENU_HELP_WORKLIST_EDITOR, MENU_HELP_CMA, MENU_HELP_PLAYING, + MENU_HELP_RULESET, MENU_HELP_IMPROVEMENTS, MENU_HELP_UNITS, MENU_HELP_COMBAT, @@ -667,6 +668,9 @@ case MENU_HELP_PLAYING: popup_help_dialog_string(HELP_PLAYING_ITEM); break; + case MENU_HELP_RULESET: + popup_help_dialog_string(HELP_RULESET_ITEM); + break; case MENU_HELP_IMPROVEMENTS: popup_help_dialog_string(HELP_IMPROVEMENTS_ITEM); break; @@ -995,6 +999,9 @@ help_menu_callback, MENU_HELP_PLAYING }, { "/" N_("Help") "/sep1", NULL, NULL, 0, "<Separator>" }, + { "/" N_("Help") "/" N_("About Ruleset"), NULL, + help_menu_callback, MENU_HELP_RULESET + }, { "/" N_("Help") "/" N_("City _Improvements"), NULL, help_menu_callback, MENU_HELP_IMPROVEMENTS }, { "/" N_("Help") "/" N_("_Units"), NULL, diff -Nurd -X.diff_ignore freeciv/client/helpdata.c freeciv/client/helpdata.c --- freeciv/client/helpdata.c 2008-06-18 18:49:41.000000000 +0300 +++ freeciv/client/helpdata.c 2008-07-03 23:39:27.000000000 +0300 @@ -49,9 +49,10 @@ /* helper macro for easy conversion from snprintf and cat_snprintf */ #define CATLSTR(_b, _s, _t) mystrlcat(_b, _t, _s) +/* This must be in same order as enum in helpdlg_g.h */ static const char * const help_type_names[] = { "(Any)", "(Text)", "Units", "Improvements", "Wonders", - "Techs", "Terrain", "Governments", NULL + "Techs", "Terrain", "Governments", "Ruleset", NULL }; /*define MAX_LAST (MAX(MAX(MAX(A_LAST,B_LAST),U_LAST),terrain_count()))*/ @@ -393,81 +394,100 @@ */ char name[2048]; struct help_list *category_nodes = help_list_new(); - - if (current_type == HELP_UNIT) { - unit_type_iterate(punittype) { - pitem = new_help_item(current_type); - my_snprintf(name, sizeof(name), " %s", - utype_name_translation(punittype)); - pitem->topic = mystrdup(name); - pitem->text = mystrdup(""); - help_list_append(category_nodes, pitem); - } unit_type_iterate_end; - } else if (current_type == HELP_TECH) { - advance_index_iterate(A_FIRST, i) { - if (valid_advance_by_number(i)) { - pitem = new_help_item(current_type); - my_snprintf(name, sizeof(name), " %s", - advance_name_for_player(pplayer, i)); - pitem->topic = mystrdup(name); - pitem->text = mystrdup(""); - help_list_append(category_nodes, pitem); - } - } advance_index_iterate_end; - } else if (current_type == HELP_TERRAIN) { - terrain_type_iterate(pterrain) { - if (0 != strlen(terrain_rule_name(pterrain))) { - pitem = new_help_item(current_type); - my_snprintf(name, sizeof(name), " %s", - terrain_name_translation(pterrain)); - pitem->topic = mystrdup(name); - pitem->text = mystrdup(""); - help_list_append(category_nodes, pitem); - } - } terrain_type_iterate_end; - /* Add special Civ2-style river help text if it's supplied. */ - if (terrain_control.river_help_text) { - pitem = new_help_item(HELP_TEXT); - /* TRANS: preserve single space at beginning */ - pitem->topic = mystrdup(_(" Rivers")); - sz_strlcpy(long_buffer, _(terrain_control.river_help_text)); - pitem->text = mystrdup(long_buffer); - help_list_append(category_nodes, pitem); - } - } else if (current_type == HELP_GOVERNMENT) { - government_iterate(gov) { - pitem = new_help_item(current_type); - my_snprintf(name, sizeof(name), " %s", - government_name_translation(gov)); - pitem->topic = mystrdup(name); - pitem->text = mystrdup(""); - help_list_append(category_nodes, pitem); - } government_iterate_end; - } else if (current_type == HELP_IMPROVEMENT) { - improvement_iterate(pimprove) { - if (valid_improvement(pimprove) && !is_great_wonder(pimprove)) { - pitem = new_help_item(current_type); - my_snprintf(name, sizeof(name), " %s", - improvement_name_translation(pimprove)); - pitem->topic = mystrdup(name); - pitem->text = mystrdup(""); - help_list_append(category_nodes, pitem); - } - } improvement_iterate_end; - } else if (current_type == HELP_WONDER) { - improvement_iterate(pimprove) { - if (valid_improvement(pimprove) && is_great_wonder(pimprove)) { - pitem = new_help_item(current_type); - my_snprintf(name, sizeof(name), " %s", - improvement_name_translation(pimprove)); - pitem->topic = mystrdup(name); - pitem->text = mystrdup(""); - help_list_append(category_nodes, pitem); - } - } improvement_iterate_end; - } else { - die("Bad current_type %d", current_type); - } + + switch (current_type) { + case HELP_UNIT: + unit_type_iterate(punittype) { + pitem = new_help_item(current_type); + my_snprintf(name, sizeof(name), " %s", + utype_name_translation(punittype)); + pitem->topic = mystrdup(name); + pitem->text = mystrdup(""); + help_list_append(category_nodes, pitem); + } unit_type_iterate_end; + break; + case HELP_TECH: + advance_index_iterate(A_FIRST, i) { + if (valid_advance_by_number(i)) { + pitem = new_help_item(current_type); + my_snprintf(name, sizeof(name), " %s", + advance_name_for_player(pplayer, i)); + pitem->topic = mystrdup(name); + pitem->text = mystrdup(""); + help_list_append(category_nodes, pitem); + } + } advance_index_iterate_end; + break; + case HELP_TERRAIN: + terrain_type_iterate(pterrain) { + if (0 != strlen(terrain_rule_name(pterrain))) { + pitem = new_help_item(current_type); + my_snprintf(name, sizeof(name), " %s", + terrain_name_translation(pterrain)); + pitem->topic = mystrdup(name); + pitem->text = mystrdup(""); + help_list_append(category_nodes, pitem); + } + } terrain_type_iterate_end; + /* Add special Civ2-style river help text if it's supplied. */ + if (terrain_control.river_help_text) { + pitem = new_help_item(HELP_TEXT); + /* TRANS: preserve single space at beginning */ + pitem->topic = mystrdup(_(" Rivers")); + sz_strlcpy(long_buffer, _(terrain_control.river_help_text)); + pitem->text = mystrdup(long_buffer); + help_list_append(category_nodes, pitem); + } + break; + case HELP_GOVERNMENT: + government_iterate(gov) { + pitem = new_help_item(current_type); + my_snprintf(name, sizeof(name), " %s", + government_name_translation(gov)); + pitem->topic = mystrdup(name); + pitem->text = mystrdup(""); + help_list_append(category_nodes, pitem); + } government_iterate_end; + break; + case HELP_IMPROVEMENT: + improvement_iterate(pimprove) { + if (valid_improvement(pimprove) && !is_great_wonder(pimprove)) { + pitem = new_help_item(current_type); + my_snprintf(name, sizeof(name), " %s", + improvement_name_translation(pimprove)); + pitem->topic = mystrdup(name); + pitem->text = mystrdup(""); + help_list_append(category_nodes, pitem); + } + } improvement_iterate_end; + break; + case HELP_WONDER: + improvement_iterate(pimprove) { + if (valid_improvement(pimprove) && is_great_wonder(pimprove)) { + pitem = new_help_item(current_type); + my_snprintf(name, sizeof(name), " %s", + improvement_name_translation(pimprove)); + pitem->topic = mystrdup(name); + pitem->text = mystrdup(""); + help_list_append(category_nodes, pitem); + } + } improvement_iterate_end; + break; + case HELP_RULESET: + pitem = new_help_item(HELP_RULESET); + /* pitem->topic = mystrdup(game.control.name); */ + pitem->topic = mystrdup(HELP_RULESET_ITEM); + if (game.control.description[0] != '\0') { + pitem->text = mystrdup(game.control.description); + } else { + pitem->text = mystrdup(_("Current ruleset contains no description.")); + } + help_list_append(help_nodes, pitem); + break; + default: + die("Bad current_type %d", current_type); + break; + } help_list_sort(category_nodes, help_item_compar); help_list_iterate(category_nodes, ptmp) { help_list_append(help_nodes, ptmp); @@ -482,9 +502,9 @@ pitem = new_help_item(HELP_TEXT); pitem->topic = mystrdup(_(secfile_lookup_str(sf, "%s.name", sec[isec]))); - + paras = secfile_lookup_str_vec(sf, &npara, "%s.text", sec[isec]); - + long_buffer[0] = '\0'; for (i=0; i<npara; i++) { char *para = paras[i]; diff -Nurd -X.diff_ignore freeciv/client/include/helpdlg_g.h freeciv/client/include/helpdlg_g.h --- freeciv/client/include/helpdlg_g.h 2007-09-14 14:51:51.000000000 +0300 +++ freeciv/client/include/helpdlg_g.h 2008-07-03 22:49:32.000000000 +0300 @@ -13,9 +13,10 @@ #ifndef FC__HELPDLG_G_H #define FC__HELPDLG_G_H +/* This must be in same order as names in helpdata.c */ enum help_page_type { HELP_ANY, HELP_TEXT, HELP_UNIT, HELP_IMPROVEMENT, HELP_WONDER, HELP_TECH, HELP_TERRAIN, - HELP_GOVERNMENT, HELP_LAST }; + HELP_GOVERNMENT, HELP_RULESET, HELP_LAST }; void popup_help_dialog_string(const char *item); void popup_help_dialog_typed(const char *item, enum help_page_type); @@ -28,6 +29,7 @@ #define HELP_WORKLIST_EDITOR_ITEM "Worklist Editor" #define HELP_CMA_ITEM "Citizen Governor" #define HELP_CONTROLS_ITEM "Controls" +#define HELP_RULESET_ITEM "Ruleset" #define HELP_IMPROVEMENTS_ITEM "City Improvements" #define HELP_UNITS_ITEM "Units" #define HELP_COMBAT_ITEM "Combat" diff -Nurd -X.diff_ignore freeciv/common/packets.def freeciv/common/packets.def --- freeciv/common/packets.def 2008-07-03 21:58:05.000000000 +0300 +++ freeciv/common/packets.def 2008-07-03 22:07:56.000000000 +0300 @@ -1334,6 +1334,9 @@ UINT8 num_specialist_types; STRING prefered_tileset[MAX_LEN_NAME]; + + STRING name[MAX_LEN_NAME]; + STRING description[MAX_LEN_PACKET]; end /********************************************************* diff -Nurd -X.diff_ignore freeciv/data/civ1/game.ruleset freeciv/data/civ1/game.ruleset --- freeciv/data/civ1/game.ruleset 2007-10-29 21:10:35.000000000 +0200 +++ freeciv/data/civ1/game.ruleset 2008-07-03 23:53:48.000000000 +0300 @@ -14,6 +14,19 @@ description="Civ1-style game rules for Freeciv" options="1.11.1" +[about] +; Ruleset name +name = _("Civ1 ruleset") +; Description of the ruleset +description = _("You are playing with civ1 style rules. \ +These rules are much more simple than Freeciv default rules. \ +If you know only default rules, spend some time checking the \ +differences.\ +\n\n\ + * There is less technologies, buildings and units\n\ + * Units have no hitpoints. If they win battle, they remain in full health\n\ +") + [options] global_init_techs="" global_init_buildings="Palace" diff -Nurd -X.diff_ignore freeciv/data/civ2/game.ruleset freeciv/data/civ2/game.ruleset --- freeciv/data/civ2/game.ruleset 2007-10-29 21:10:36.000000000 +0200 +++ freeciv/data/civ2/game.ruleset 2008-07-03 23:43:37.000000000 +0300 @@ -14,6 +14,13 @@ description="Civ2-style game rules for Freeciv" options="1.11.1" +[about] +; Ruleset name +name = _("Civ2 ruleset") +; Description of the ruleset +description = _("You are playing with civ2 style rules.\ +These are quite close to Freeciv default rules, but with some additions.") + [options] global_init_techs="" global_init_buildings="Palace" diff -Nurd -X.diff_ignore freeciv/data/default/game.ruleset freeciv/data/default/game.ruleset --- freeciv/data/default/game.ruleset 2007-09-14 14:45:42.000000000 +0300 +++ freeciv/data/default/game.ruleset 2008-07-03 23:37:25.000000000 +0300 @@ -14,6 +14,12 @@ description="Default game rules for Freeciv" options="1.11.1" +[about] +; Ruleset name +name = _("Default ruleset") +; Description of the ruleset +description = _("You are playing Freeciv with default rules.") + [options] global_init_techs="" global_init_buildings="Palace" diff -Nurd -X.diff_ignore freeciv/data/helpdata.txt freeciv/data/helpdata.txt --- freeciv/data/helpdata.txt 2008-03-08 16:32:29.000000000 +0200 +++ freeciv/data/helpdata.txt 2008-07-03 23:18:01.000000000 +0300 @@ -12,7 +12,7 @@ ; 'generate' = means replace this node with generated list of game ; elements; current categories are: ; "Units", "Improvements", "Wonders", "Techs", -; "Terrain", "Governments" +; "Terrain", "Governments", "Ruleset" ; ; Within the text, the help engine recognizes a few "generated table"s. ; These are generated by the help engine, and inserted at the point of @@ -869,6 +869,9 @@ preset examples in the file README.cma, included with Freeciv.\n\ ") +[help_gen_ruleset] +generate = "Ruleset" + [help_city_improvements] name = _("City Improvements") text = _("\ diff -Nurd -X.diff_ignore freeciv/server/ruleset.c freeciv/server/ruleset.c --- freeciv/server/ruleset.c 2008-07-03 21:58:06.000000000 +0300 +++ freeciv/server/ruleset.c 2008-07-03 21:58:23.000000000 +0300 @@ -2899,22 +2899,35 @@ const char *filename; int *food_ini; int i; - char *tileset; + char *text; openload_ruleset_file(&file, "game"); filename = secfile_filename(&file); (void) check_ruleset_capabilities(&file, "+1.11.1", filename); (void) section_file_lookup(&file, "datafile.description"); /* unused */ - tileset = secfile_lookup_str_default(&file, "", "tileset.prefered"); - if (tileset[0] != '\0') { + text = secfile_lookup_str_default(&file, "", "tileset.prefered"); + if (text[0] != '\0') { /* There was tileset suggestion */ - sz_strlcpy(game.control.prefered_tileset, tileset); + sz_strlcpy(game.control.prefered_tileset, text); } else { /* No tileset suggestions */ game.control.prefered_tileset[0] = '\0'; } + text = secfile_lookup_str(&file, "about.name"); + /* Ruleset/modpack name found */ + sz_strlcpy(game.control.name, text); + + text = secfile_lookup_str_default(&file, "", "about.description"); + if (text[0] != '\0') { + /* Ruleset/modpack description found */ + sz_strlcpy(game.control.description, text); + } else { + /* No description */ + game.control.description[0] = '\0'; + } + game.info.base_pollution = secfile_lookup_int_default(&file, -20, "civstyle.base_pollution"); game.info.happy_cost = diff -Nurd -X.diff_ignore freeciv/version.in freeciv/version.in --- freeciv/version.in 2008-07-02 01:47:22.000000000 +0300 +++ freeciv/version.in 2008-07-03 21:58:42.000000000 +0300 @@ -23,5 +23,5 @@ # - Avoid adding a new mandatory capability to the development branch for # as long as possible. We want to maintain network compatibility with # the stable branch for as long as possible. -NETWORK_CAPSTRING_MANDATORY="+Freeciv.Devel.2008.Jul.01" +NETWORK_CAPSTRING_MANDATORY="+Freeciv.Devel.2008.Jul.03" NETWORK_CAPSTRING_OPTIONAL=""
_______________________________________________ Freeciv-dev mailing list Freeciv-dev@gna.org https://mail.gna.org/listinfo/freeciv-dev