Author: jtn
Date: Mon Nov 17 11:28:50 2014
New Revision: 27058

URL: http://svn.gna.org/viewcvs/freeciv?rev=27058&view=rev
Log:
With team_pooled_research, send "tech_researched" signal to player whose
action caused it before other players.

See gna patch #5430.

Modified:
    trunk/server/diplhand.c
    trunk/server/scripting/api_server_edit.c
    trunk/server/techtools.c
    trunk/server/techtools.h

Modified: trunk/server/diplhand.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/diplhand.c?rev=27058&r1=27057&r2=27058&view=diff
==============================================================================
--- trunk/server/diplhand.c     (original)
+++ trunk/server/diplhand.c     Mon Nov 17 11:28:50 2014
@@ -456,13 +456,8 @@
                  advance_name,
                  nation_plural_for_player(pgiver));
 
-            research_players_iterate(presearch, member) {
-              script_server_signal_emit("tech_researched", 3,
-                                        API_TYPE_TECH_TYPE,
-                                        advance_by_number(pclause->value),
-                                        API_TYPE_PLAYER, member,
-                                        API_TYPE_STRING, "traded");
-            } research_players_iterate_end;
+            script_tech_learned(presearch, pdest,
+                                advance_by_number(pclause->value), "traded");
             research_apply_penalty(presearch, pclause->value,
                                    game.server.diplbulbcost);
             found_new_tech(presearch, pclause->value, FALSE, TRUE);

Modified: trunk/server/scripting/api_server_edit.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/scripting/api_server_edit.c?rev=27058&r1=27057&r2=27058&view=diff
==============================================================================
--- trunk/server/scripting/api_server_edit.c    (original)
+++ trunk/server/scripting/api_server_edit.c    Mon Nov 17 11:28:50 2014
@@ -282,12 +282,7 @@
     research_apply_penalty(presearch, id, game.server.freecost);
     found_new_tech(presearch, id, FALSE, TRUE);
     result = advance_by_number(id);
-    research_players_iterate(presearch, member) {
-      script_server_signal_emit("tech_researched", 3,
-                                API_TYPE_TECH_TYPE, result,
-                                API_TYPE_PLAYER, member,
-                                API_TYPE_STRING, reason);
-    } research_players_iterate_end;
+    script_tech_learned(presearch, pplayer, result, reason);
     return result;
   } else {
     return NULL;

Modified: trunk/server/techtools.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/techtools.c?rev=27058&r1=27057&r2=27058&view=diff
==============================================================================
--- trunk/server/techtools.c    (original)
+++ trunk/server/techtools.c    Mon Nov 17 11:28:50 2014
@@ -72,6 +72,36 @@
 }
 
 /****************************************************************************
+  Emit script signal(s) for player/team learning new tech.
+  originating_plr is the player whose action caused this; may be NULL, and
+  is only used to order the emission of the signals.
+****************************************************************************/
+void script_tech_learned(struct research *presearch,
+                         struct player *originating_plr, struct advance *tech,
+                         const char *reason)
+{
+  /* Emit signal for individual player whose action triggered the
+   * tech first */
+  if (originating_plr) {
+    fc_assert(research_get(originating_plr) == presearch);
+    script_server_signal_emit("tech_researched", 3,
+                              API_TYPE_TECH_TYPE, tech,
+                              API_TYPE_PLAYER, originating_plr,
+                              API_TYPE_STRING, reason);
+  }
+
+  /* Emit signal to remaining research teammates, if any */
+  research_players_iterate(presearch, member) {
+    if (member != originating_plr) {
+      script_server_signal_emit("tech_researched", 3,
+                                API_TYPE_TECH_TYPE, tech,
+                                API_TYPE_PLAYER, member,
+                                API_TYPE_STRING, reason);
+    }
+  } research_players_iterate_end;
+}
+
+/****************************************************************************
   Players have researched a new technology.
 ****************************************************************************/
 static void tech_researched(struct research *research)
@@ -96,13 +126,7 @@
   /* Do all the updates needed after finding new tech. */
   found_new_tech(research, tech, TRUE, TRUE);
 
-  research_players_iterate(research, member) {
-    script_server_signal_emit("tech_researched", 3,
-                              API_TYPE_TECH_TYPE,
-                              advance_by_number(tech),
-                              API_TYPE_PLAYER, member,
-                              API_TYPE_STRING, "researched");
-  } research_players_iterate_end;
+  script_tech_learned(research, NULL, advance_by_number(tech), "researched");
 }
 
 /****************************************************************************
@@ -1157,17 +1181,10 @@
   if (tech_transfer(pplayer, victim, stolen_tech)) {
     research_apply_penalty(presearch, stolen_tech, game.server.conquercost);
     found_new_tech(presearch, stolen_tech, FALSE, TRUE);
-
-    research_players_iterate(presearch, member) {
-      script_server_signal_emit("tech_researched", 3,
-                                API_TYPE_TECH_TYPE,
-                                advance_by_number(stolen_tech),
-                                API_TYPE_PLAYER, member,
-                                API_TYPE_STRING, "stolen");
-    } research_players_iterate_end;
-
+    script_tech_learned(presearch, pplayer, advance_by_number(stolen_tech),
+                        "stolen");
     return stolen_tech;
-  };
+  }
 
   return A_NONE;
 }

Modified: trunk/server/techtools.h
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/techtools.h?rev=27058&r1=27057&r2=27058&view=diff
==============================================================================
--- trunk/server/techtools.h    (original)
+++ trunk/server/techtools.h    Mon Nov 17 11:28:50 2014
@@ -25,6 +25,9 @@
 void send_research_info(const struct research *presearch,
                         const struct conn_list *dest);
 
+void script_tech_learned(struct research *presearch,
+                         struct player *originating_plr, struct advance *tech,
+                         const char *reason);
 void found_new_tech(struct research *presearch, Tech_type_id tech_found,
                     bool was_discovery, bool saving_bulbs);
 void update_bulbs(struct player *pplayer, int bulbs, bool check_tech);


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

Reply via email to