diff -ru -X /home/jjm/cvs/no.freeciv FreecivCVS/common/player.c freeciv/common/player.c --- FreecivCVS/common/player.c Mon Jun 12 10:07:33 2000 +++ freeciv/common/player.c Fri Jun 16 22:40:55 2000 @@ -92,6 +92,7 @@ plr->economic.tax=PLAYER_DEFAULT_TAX_RATE; plr->economic.science=PLAYER_DEFAULT_SCIENCE_RATE; plr->economic.luxury=PLAYER_DEFAULT_LUXURY_RATE; + plr->research.changed_from = -1; player_limit_to_government_rates(plr); spaceship_init(&plr->spaceship); for (i = 0; i < MAX_NUM_WORKLISTS; i++) { diff -ru -X /home/jjm/cvs/no.freeciv FreecivCVS/common/player.h freeciv/common/player.h --- FreecivCVS/common/player.h Mon Jun 12 10:07:33 2000 +++ freeciv/common/player.h Fri Jun 16 22:40:55 2000 @@ -56,6 +56,9 @@ int researched; /* # bulbs reseached */ int researchpoints; /* # bulbs to complete */ int researching; /* invention being researched in */ + int changed_from; /* if the player changed techs, which one changed from */ + int before_researched; /* if the player changed techs, how many */ + /* points they had before the change */ unsigned char inventions[A_LAST]; }; diff -ru -X /home/jjm/cvs/no.freeciv FreecivCVS/server/plrhand.c freeciv/server/plrhand.c --- FreecivCVS/server/plrhand.c Mon Jun 12 10:07:35 2000 +++ freeciv/server/plrhand.c Fri Jun 16 22:51:02 2000 @@ -1366,6 +1366,7 @@ if (city_list_size(&pplayer->cities)) /* has to be below the above for got_tech */ update_tech(pplayer, city_list_size(&pplayer->cities)); #endif + pplayer->research.changed_from=-1; update_unit_activities(pplayer); update_player_aliveness(pplayer); } @@ -1588,9 +1589,16 @@ if (get_invention(plr, tech)!=TECH_REACHABLE) { /* can't research this */ return; } + if (!plr->got_tech && plr->research.changed_from == -1) { + plr->research.before_researched = plr->research.researched; + plr->research.changed_from = plr->research.researching; + /* subtract a penalty because we changed subject */ + plr->research.researched -= ((plr->research.researched * game.techpenalty) / 100); + } else if (tech == plr->research.changed_from) { + plr->research.researched = plr->research.before_researched; + plr->research.changed_from = -1; + } plr->research.researching=tech; - if (!plr->got_tech && plr->research.researched > 0) - plr->research.researched -= ((plr->research.researched * game.techpenalty) / 100); /* subtract a penalty because we changed subject */ } void choose_tech_goal(struct player *plr, int tech)