Author: cazfi
Date: Tue Jun 28 19:29:08 2016
New Revision: 33090

URL: http://svn.gna.org/viewcvs/freeciv?rev=33090&view=rev
Log:
Allow observer with hack access to start the game from the client gui,
if there's no human players to do it.

See paych #7334

Modified:
    trunk/client/client_main.c
    trunk/client/gui-gtk-2.0/pages.c
    trunk/client/gui-gtk-3.0/pages.c
    trunk/client/gui-gtk-3.x/pages.c
    trunk/client/gui-qt/fc_client.cpp
    trunk/client/gui-qt/pages.cpp
    trunk/server/srv_main.c

Modified: trunk/client/client_main.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/client/client_main.c?rev=33090&r1=33089&r2=33090&view=diff
==============================================================================
--- trunk/client/client_main.c  (original)
+++ trunk/client/client_main.c  Tue Jun 28 19:29:08 2016
@@ -1218,7 +1218,7 @@
 bool can_client_control(void)
 {
   return (NULL != client.conn.playing
-         && !client_is_observer());
+          && !client_is_observer());
 }
 
 /**************************************************************************

Modified: trunk/client/gui-gtk-2.0/pages.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/client/gui-gtk-2.0/pages.c?rev=33090&r1=33089&r2=33090&view=diff
==============================================================================
--- trunk/client/gui-gtk-2.0/pages.c    (original)
+++ trunk/client/gui-gtk-2.0/pages.c    Tue Jun 28 19:29:08 2016
@@ -2063,6 +2063,8 @@
     dsend_packet_player_ready(&client.conn,
                               player_number(client_player()),
                               !client_player()->is_ready);
+  } else {
+    dsend_packet_player_ready(&client.conn, 0, TRUE);
   }
 }
 
@@ -2141,7 +2143,19 @@
     }
   } else {
     text = _("_Start");
-    sensitive = FALSE;
+    if (can_client_access_hack()) {
+      sensitive = TRUE;
+      players_iterate(plr) {
+        if (is_human(plr)) {
+          /* There's human controlled player(s) in game, so it's their
+           * job to start the game. */
+          sensitive = FALSE;
+          break;
+        }
+      } players_iterate_end;
+    } else {
+      sensitive = FALSE;
+    }
   }
   gtk_stockbutton_set_label(ready_button, text);
   gtk_widget_set_sensitive(ready_button, sensitive);

Modified: trunk/client/gui-gtk-3.0/pages.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/client/gui-gtk-3.0/pages.c?rev=33090&r1=33089&r2=33090&view=diff
==============================================================================
--- trunk/client/gui-gtk-3.0/pages.c    (original)
+++ trunk/client/gui-gtk-3.0/pages.c    Tue Jun 28 19:29:08 2016
@@ -2128,6 +2128,8 @@
     dsend_packet_player_ready(&client.conn,
                               player_number(client_player()),
                               !client_player()->is_ready);
+  } else {
+    dsend_packet_player_ready(&client.conn, 0, TRUE);
   }
 }
 
@@ -2206,7 +2208,19 @@
     }
   } else {
     text = _("_Start");
-    sensitive = FALSE;
+    if (can_client_access_hack()) {
+      sensitive = TRUE;
+      players_iterate(plr) {
+        if (is_human(plr)) {
+          /* There's human controlled player(s) in game, so it's their
+           * job to start the game. */
+          sensitive = FALSE;
+          break;
+        }
+      } players_iterate_end;
+    } else {
+      sensitive = FALSE;
+    }
   }
   gtk_stockbutton_set_label(ready_button, text);
   gtk_widget_set_sensitive(ready_button, sensitive);

Modified: trunk/client/gui-gtk-3.x/pages.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/client/gui-gtk-3.x/pages.c?rev=33090&r1=33089&r2=33090&view=diff
==============================================================================
--- trunk/client/gui-gtk-3.x/pages.c    (original)
+++ trunk/client/gui-gtk-3.x/pages.c    Tue Jun 28 19:29:08 2016
@@ -2129,6 +2129,8 @@
     dsend_packet_player_ready(&client.conn,
                               player_number(client_player()),
                               !client_player()->is_ready);
+  } else {
+    dsend_packet_player_ready(&client.conn, 0, TRUE);
   }
 }
 
@@ -2207,7 +2209,19 @@
     }
   } else {
     text = _("_Start");
-    sensitive = FALSE;
+    if (can_client_access_hack()) {
+      sensitive = TRUE;
+      players_iterate(plr) {
+        if (is_human(plr)) {
+          /* There's human controlled player(s) in game, so it's their
+           * job to start the game. */
+          sensitive = FALSE;
+          break;
+        }
+      } players_iterate_end;
+    } else {
+      sensitive = FALSE;
+    }
   }
   gtk_stockbutton_set_label(ready_button, text);
   gtk_widget_set_sensitive(ready_button, sensitive);

Modified: trunk/client/gui-qt/fc_client.cpp
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/client/gui-qt/fc_client.cpp?rev=33090&r1=33089&r2=33090&view=diff
==============================================================================
--- trunk/client/gui-qt/fc_client.cpp   (original)
+++ trunk/client/gui-qt/fc_client.cpp   Tue Jun 28 19:29:08 2016
@@ -500,6 +500,8 @@
     dsend_packet_player_ready(&client.conn,
                               player_number(client_player()),
                               !client_player()->is_ready);
+  } else {
+    dsend_packet_player_ready(&client.conn, 0, TRUE);
   }
 }
 

Modified: trunk/client/gui-qt/pages.cpp
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/client/gui-qt/pages.cpp?rev=33090&r1=33089&r2=33090&view=diff
==============================================================================
--- trunk/client/gui-qt/pages.cpp       (original)
+++ trunk/client/gui-qt/pages.cpp       Tue Jun 28 19:29:08 2016
@@ -1505,7 +1505,19 @@
     }
   } else {
     text = _("Start");
-    sensitive = false;
+    if (can_client_access_hack()) {
+      sensitive = true;
+      players_iterate(plr) {
+        if (is_human(plr)) {
+          /* There's human controlled player(s) in game, so it's their
+           * job to start the game. */
+          sensitive = false;
+          break;
+        }
+      } players_iterate_end;
+    } else {
+      sensitive = false;
+    }
   }
   li = pages_layout[PAGE_START]->itemAtPosition(5, 7);
   pb = qobject_cast<QPushButton *>(li->widget());

Modified: trunk/server/srv_main.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/srv_main.c?rev=33090&r1=33089&r2=33090&view=diff
==============================================================================
--- trunk/server/srv_main.c     (original)
+++ trunk/server/srv_main.c     Tue Jun 28 19:29:08 2016
@@ -160,6 +160,8 @@
 static int mapimg_server_plrcolor_count(void);
 static struct rgbcolor *mapimg_server_plrcolor_get(int i);
 
+static void handle_observer_ready(struct connection *pconn);
+
 /* command-line arguments to server */
 struct server_arguments srvarg;
 
@@ -1724,16 +1726,17 @@
 }
 
 /**************************************************************************
-Returns 0 if connection should be closed (because the clients was
-rejected). Returns 1 else.
+  Returns FALSE if connection should be closed (because the clients was
+  rejected). Returns TRUE else.
 **************************************************************************/
 bool server_packet_input(struct connection *pconn, void *packet, int type)
 {
   struct player *pplayer;
 
   /* a NULL packet can be returned from receive_packet_goto_route() */
-  if (!packet)
+  if (!packet) {
     return TRUE;
+  }
 
   /* 
    * Old pre-delta clients (before 2003-11-28) send a
@@ -1798,7 +1801,7 @@
               packet_name(type), type, conn_description(pconn));
     return TRUE;
   }
-  
+
   /* valid packets from established connections but non-players */
   if (type == PACKET_CHAT_MSG_REQ
       || type == PACKET_SINGLE_WANT_HACK_REQ
@@ -1829,6 +1832,10 @@
   pplayer = pconn->playing;
 
   if (NULL == pplayer || pconn->observer) {
+    if (type == PACKET_PLAYER_READY && pconn->observer) {
+      handle_observer_ready(pconn);
+      return TRUE;
+    }
     /* don't support these yet */
     log_error("Received packet %s(%d) from non-player connection %s.",
               packet_name(type), type, conn_description(pconn));
@@ -2054,6 +2061,22 @@
 
   (void) player_set_nation(pplayer, new_nation);
   send_player_info_c(pplayer, game.est_connections);
+}
+
+/****************************************************************************
+  Handle a player-ready packet from global observer.
+****************************************************************************/
+static void handle_observer_ready(struct connection *pconn)
+{
+  if (pconn->access_level == ALLOW_HACK) {
+    players_iterate(plr) {
+      if (is_human(plr)) {
+        return;
+      }
+    } players_iterate_end;
+
+    start_command(NULL, FALSE, TRUE);
+  }
 }
 
 /****************************************************************************


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

Reply via email to