<URL: http://bugs.freeciv.org/Ticket/Display.html?id=39413 >

This is a small implementation of the startyear server command, that
sets the year the game starts.

Some abstraction done in game.h:
Added GAME_MIN_YEAR and GAME_MAX_YEAR, and use them to define
GAME_MAX_/GAME_MIN_ for end year and start year.

Two places in the code still referred to GAME_START_YEAR (that now is
removed). In server/report.c a test for the first turn was wanted so I
used 'game.info.turn == 0', in server/maphand.c, tiles are initialized
with last_seen=GAME_START_YEAR, now they are inited with GAME_MIN_YEAR
which should be safe in the same way ( <= all years)

I coded the patch against S2_1 (sorry), but it applies to trunk with
some offsets.

This patch is to help generalize freeciv rules and calender. Further
down this path MIN and MAX_YEAR could be altered, but I keep it at the
old value to avoid introducing unknown bugs.

Index: server/settings.c
===================================================================
--- server/settings.c	(revision 13006)
+++ server/settings.c	(arbetskopia)
@@ -161,6 +161,19 @@
 }
 
 /*************************************************************************
+  Verify that a given startyear is valid.
+*************************************************************************/
+static bool startyear_callback(int value, const char **error_string)
+{
+  if (value > game.info.end_year) {
+    /* Tried to set startyear later than endyear */
+    *error_string = _("Cannot set startyear later than endyear.");
+    return FALSE;
+  }
+  return TRUE;
+}
+
+/*************************************************************************
   Verify that a given maxplayers string is valid.
 *************************************************************************/
 static bool maxplayers_callback(int value, const char **error_string)
@@ -875,6 +888,13 @@
           N_("The game will end at the end of the given year."),
           endyear_callback,
           GAME_MIN_END_YEAR, GAME_MAX_END_YEAR, GAME_DEFAULT_END_YEAR)
+  
+  GEN_INT("startyear", game.info.year,
+	  SSET_RULES, SSET_SOCIOLOGY, SSET_VITAL, SSET_TO_CLIENT,
+	  N_("Year the game begins"),
+          N_("The game will begin at the given year."),
+          startyear_callback,
+          GAME_MIN_START_YEAR, GAME_MAX_START_YEAR, GAME_DEFAULT_START_YEAR)
 
   GEN_INT("timeout", game.info.timeout,
 	  SSET_META, SSET_INTERNAL, SSET_VITAL, SSET_TO_CLIENT,
Index: server/report.c
===================================================================
--- server/report.c	(revision 13006)
+++ server/report.c	(arbetskopia)
@@ -935,7 +935,7 @@
   }
 
   if (!fp) {
-    if (game.info.year == GAME_START_YEAR) {
+    if (game.info.turn == 0) {
       oper = SL_CREATE;
     } else {
       fp = fopen(logname, "r");
Index: server/maphand.c
===================================================================
--- server/maphand.c	(revision 13006)
+++ server/maphand.c	(arbetskopia)
@@ -980,7 +980,7 @@
     }
   }
 
-  plrtile->last_updated = GAME_START_YEAR;
+  plrtile->last_updated = GAME_MIN_YEAR;
   vision_layer_iterate(v) {
     plrtile->own_seen[v] = plrtile->seen_count[v];
   } vision_layer_iterate_end;
Index: common/game.c
===================================================================
--- common/game.c	(revision 13006)
+++ common/game.c	(arbetskopia)
@@ -193,7 +193,7 @@
   game.info.tcptimeout    = GAME_DEFAULT_TCPTIMEOUT;
   game.info.netwait       = GAME_DEFAULT_NETWAIT;
   game.info.end_year      = GAME_DEFAULT_END_YEAR;
-  game.info.year          = GAME_START_YEAR;
+  game.info.year          = GAME_DEFAULT_START_YEAR;
   game.info.turn          = 0;
   game.info.min_players   = GAME_DEFAULT_MIN_PLAYERS;
   game.info.max_players   = GAME_DEFAULT_MAX_PLAYERS;
Index: common/game.h
===================================================================
--- common/game.h	(revision 13006)
+++ common/game.h	(arbetskopia)
@@ -175,9 +175,9 @@
 
 #define GAME_DEFAULT_ANGRYCITIZEN TRUE
 
-#define GAME_DEFAULT_END_YEAR    5000
-#define GAME_MIN_END_YEAR        GAME_START_YEAR
-#define GAME_MAX_END_YEAR        5000
+#define GAME_DEFAULT_END_YEAR    GAME_MAX_YEAR
+#define GAME_MIN_END_YEAR        GAME_MIN_YEAR
+#define GAME_MAX_END_YEAR        GAME_MAX_YEAR
 
 #define GAME_DEFAULT_MIN_PLAYERS     1
 #define GAME_MIN_MIN_PLAYERS         1
@@ -328,10 +328,10 @@
 #define GAME_MIN_BARBARIANRATE       0
 #define GAME_MAX_BARBARIANRATE       4
 
-#define GAME_DEFAULT_ONSETBARBARIAN  (GAME_START_YEAR+ \
-				      ((GAME_DEFAULT_END_YEAR-(GAME_START_YEAR))/3))
-#define GAME_MIN_ONSETBARBARIAN      GAME_START_YEAR
-#define GAME_MAX_ONSETBARBARIAN      GAME_MAX_END_YEAR
+#define GAME_DEFAULT_ONSETBARBARIAN  (GAME_DEFAULT_START_YEAR+ \
+				      ((GAME_DEFAULT_END_YEAR-(GAME_DEFAULT_START_YEAR))/3))
+#define GAME_MIN_ONSETBARBARIAN      GAME_MIN_YEAR
+#define GAME_MAX_ONSETBARBARIAN      GAME_MAX_YEAR
 
 #define GAME_DEFAULT_OCCUPYCHANCE    0
 #define GAME_MIN_OCCUPYCHANCE        0
@@ -363,6 +363,11 @@
 #define GAME_MIN_REVOLUTION_LENGTH 0
 #define GAME_MAX_REVOLUTION_LENGTH 10
 
-#define GAME_START_YEAR -4000
+#define GAME_DEFAULT_START_YEAR GAME_MIN_YEAR
+#define GAME_MIN_START_YEAR GAME_MIN_YEAR
+#define GAME_MAX_START_YEAR GAME_MAX_YEAR
 
+#define GAME_MIN_YEAR -4000
+#define GAME_MAX_YEAR 5000
+
 #endif  /* FC__GAME_H */
_______________________________________________
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev

Reply via email to