<URL: http://bugs.freeciv.org/Ticket/Display.html?id=20855 >
My previous patches are wrong. It seems that global_init_tech, init_tech
and techlevel never worked well with team games, since the team research
is polled.
Index: server/srv_main.c
===================================================================
--- server/srv_main.c (révision 13773)
+++ server/srv_main.c (copie de travail)
@@ -2010,9 +2010,10 @@
} players_iterate_end;
players_iterate(pplayer) {
+ /* Nation specific techs */
give_initial_techs(pplayer);
} players_iterate_end;
-
+
players_iterate(pplayer) {
int i;
bool free_techs_already_given = FALSE;
@@ -2024,23 +2025,25 @@
break;
}
} players_iterate_end;
-
+
if (free_techs_already_given) {
- break;
+ continue;
}
-
- for (i = 0; i < game.info.tech; i++) {
+
+ /* Global techs */
+ give_global_initial_techs(pplayer);
+ /* Note that A_NONE is always marked as researched, so the real number
+ * of techs_researched is (techs_researched - 1). */
+ for (i = get_player_research(pplayer)->techs_researched - 1;
+ i < game.info.tech; i++) {
give_random_initial_tech(pplayer);
}
} players_iterate_end;
-
-
- if(game.info.is_new_game) {
- /* If we're starting a new game, reset the rules.max_players to be the
- * number of players currently in the game. But when loading a game
- * we don't want to change it. */
- game.info.max_players = game.info.nplayers;
- }
+
+ /* If we're starting a new game, reset the rules.max_players to be the
+ * number of players currently in the game. But when loading a game
+ * we don't want to change it. */
+ game.info.max_players = game.info.nplayers;
}
/* Set up alliances based on team selections */
Index: server/techtools.c
===================================================================
--- server/techtools.c (révision 13773)
+++ server/techtools.c (copie de travail)
@@ -594,29 +594,43 @@
/****************************************************************************
Gives initial techs to the player
****************************************************************************/
-void give_initial_techs(struct player* plr)
+void give_initial_techs(struct player *pplayer)
{
- struct nation_type *nation = nation_of_player(plr);
+ struct nation_type *nation = nation_of_player(pplayer);
int i;
/*
- * Give game wide initial techs
+ * Give nation specific initial techs
*/
for (i = 0; i < MAX_NUM_TECH_LIST; i++) {
- if (game.rgame.global_init_techs[i] == A_LAST) {
+ if (nation->init_techs[i] == A_LAST) {
break;
}
- found_new_tech(plr, game.rgame.global_init_techs[i], FALSE, TRUE);
+ /* Maybe the player already got this tech by an other way (example: team) */
+ if (get_invention(pplayer, nation->init_techs[i]) != TECH_KNOWN) {
+ found_new_tech(pplayer, nation->init_techs[i], FALSE, TRUE);
+ }
}
+}
+/****************************************************************************
+ Gives global initial techs to the player
+****************************************************************************/
+void give_global_initial_techs(struct player *pplayer)
+{
+ int i;
+
/*
- * Give nation specific initial techs
+ * Give game wide initial techs
*/
for (i = 0; i < MAX_NUM_TECH_LIST; i++) {
- if (nation->init_techs[i] == A_LAST) {
+ if (game.rgame.global_init_techs[i] == A_LAST) {
break;
}
- found_new_tech(plr, nation->init_techs[i], FALSE, TRUE);
+ /* Maybe the player already got this tech by an other way (example: team) */
+ if (get_invention(pplayer, game.rgame.global_init_techs[i]) != TECH_KNOWN) {
+ found_new_tech(pplayer, game.rgame.global_init_techs[i], FALSE, TRUE);
+ }
}
}
Index: server/techtools.h
===================================================================
--- server/techtools.h (révision 13773)
+++ server/techtools.h (copie de travail)
@@ -34,7 +34,8 @@
Tech_type_id give_random_free_tech(struct player *pplayer);
Tech_type_id give_immediate_free_tech(struct player *pplayer);
-void give_initial_techs(struct player* plr);
-Tech_type_id give_random_initial_tech(struct player* pplayer);
+void give_initial_techs(struct player *pplayer);
+void give_global_initial_techs(struct player *pplayer);
+Tech_type_id give_random_initial_tech(struct player *pplayer);
#endif
_______________________________________________
Freeciv-dev mailing list
[email protected]
https://mail.gna.org/listinfo/freeciv-dev