<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

Reply via email to