Author: cazfi
Date: Sat Sep 19 08:48:23 2015
New Revision: 29928

URL: http://svn.gna.org/viewcvs/freeciv?rev=29928&view=rev
Log:
Allow empty "startunits" when "startcity" is enabled

See patch #5887

Modified:
    trunk/server/gamehand.c
    trunk/server/settings.c
    trunk/server/srv_main.c
    trunk/server/stdinhand.c

Modified: trunk/server/gamehand.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/gamehand.c?rev=29928&r1=29927&r2=29928&view=diff
==============================================================================
--- trunk/server/gamehand.c     (original)
+++ trunk/server/gamehand.c     Sat Sep 19 08:48:23 2015
@@ -417,6 +417,7 @@
   struct tile *player_startpos[player_slot_count()];
   int placed_units[player_slot_count()];
   int players_to_place = player_count();
+  int sulen;
 
   randomize_base64url_string(server.game_identifier,
                              sizeof(server.game_identifier));
@@ -751,15 +752,18 @@
   startpos_list_destroy(targeted_list);
   startpos_list_destroy(flexible_list);
 
+  sulen = strlen(game.server.start_units);
 
   /* Loop over all players, creating their initial units... */
   players_iterate(pplayer) {
+    struct tile *ptile;
+
     /* We have to initialise the advisor and ai here as we could make contact
      * to other nations at this point. */
     adv_data_phase_init(pplayer, FALSE);
     CALL_PLR_AI_FUNC(phase_begin, pplayer, pplayer, FALSE);
 
-    struct tile *ptile = player_startpos[player_index(pplayer)];
+    ptile = player_startpos[player_index(pplayer)];
 
     fc_assert_action(NULL != ptile, continue);
 
@@ -769,10 +773,14 @@
                   NULL);
     }
 
-    /* Place the first unit. */
-    if (place_starting_unit(ptile, pplayer,
-                            game.server.start_units[0]) != NULL) {
-      placed_units[player_index(pplayer)] = 1;
+    if (sulen > 0) {
+      /* Place the first unit. */
+      if (place_starting_unit(ptile, pplayer,
+                              game.server.start_units[0]) != NULL) {
+        placed_units[player_index(pplayer)] = 1;
+      } else {
+        placed_units[player_index(pplayer)] = 0;
+      }
     } else {
       placed_units[player_index(pplayer)] = 0;
     }
@@ -787,7 +795,7 @@
     fc_assert_action(NULL != ptile, continue);
 
     /* Place global start units */
-    for (i = 1; i < strlen(game.server.start_units); i++) {
+    for (i = 1; i < sulen; i++) {
       struct tile *rand_tile = find_dispersed_position(pplayer, ptile);
 
       /* Create the unit of an appropriate type. */
@@ -814,7 +822,7 @@
     adv_data_phase_done(pplayer);
     CALL_PLR_AI_FUNC(phase_finished, pplayer, pplayer);
 
-    fc_assert_msg(0 < placed_units[player_index(pplayer)],
+    fc_assert_msg(game.server.start_city || 0 < 
placed_units[player_index(pplayer)],
                   _("No units placed for %s!"), player_name(pplayer));
   } players_iterate_end;
 

Modified: trunk/server/settings.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/settings.c?rev=29928&r1=29927&r2=29928&view=diff
==============================================================================
--- trunk/server/settings.c     (original)
+++ trunk/server/settings.c     Sat Sep 19 08:48:23 2015
@@ -852,13 +852,6 @@
   int len = strlen(value), i;
   Unit_Class_id  first_role;
   bool firstnative = FALSE;
-
-  if (len == 0) {
-    settings_snprintf(reject_msg, reject_msg_len,
-                      _("Starting units string cannot be empty."));
-
-    return FALSE;
-  }
 
   /* We check each character individually to see if it's valid. */
   for (i = 0; i < len; i++) {

Modified: trunk/server/srv_main.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/srv_main.c?rev=29928&r1=29927&r2=29928&view=diff
==============================================================================
--- trunk/server/srv_main.c     (original)
+++ trunk/server/srv_main.c     Sat Sep 19 08:48:23 2015
@@ -2910,8 +2910,13 @@
     struct unit_type *utype = NULL;
     int sucount = strlen(game.server.start_units);
 
-    for (i = 0; utype == NULL && i < sucount; i++) {
-      utype = crole_to_unit_type(game.server.start_units[i], NULL);
+    if (sucount > 0) {
+      for (i = 0; utype == NULL && i < sucount; i++) {
+        utype = crole_to_unit_type(game.server.start_units[i], NULL);
+      }
+    } else {
+      /* First unit the initial city might build. */
+      utype = get_role_unit(L_FIRSTBUILD, 0);
     }
     fc_assert(utype != NULL);
 

Modified: trunk/server/stdinhand.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/stdinhand.c?rev=29928&r1=29927&r2=29928&view=diff
==============================================================================
--- trunk/server/stdinhand.c    (original)
+++ trunk/server/stdinhand.c    Sat Sep 19 08:48:23 2015
@@ -5639,6 +5639,12 @@
                       _("Not enough nations for all players; game will "
                         "not start."));
       return FALSE;
+    } else if (strlen(game.server.start_units) == 0 && 
!game.server.start_city) {
+      start_cmd_reply(caller, notify,
+                      _("Neither 'startcity' nor 'startunits' setting give "
+                        "players anything to start game with; game will "
+                        "not start."));
+      return FALSE;
     } else if (check) {
       return TRUE;
     } else if (!caller) {


_______________________________________________
Freeciv-commits mailing list
Freeciv-commits@gna.org
https://mail.gna.org/listinfo/freeciv-commits

Reply via email to