diff -Nur -X/home/thue/freeciv-dev/no.freeciv freeciv/common/city.c transitive_upgrades2/common/city.c --- freeciv/common/city.c Fri Apr 7 19:55:09 2000 +++ transitive_upgrades2/common/city.c Sat Apr 8 11:53:05 2000 @@ -556,8 +556,9 @@ { if (!can_build_unit_direct(pcity, id)) return 0; - if (can_build_unit_direct(pcity, unit_types[id].obsoleted_by)) - return 0; + while(unit_type_exists((id = unit_types[id].obsoleted_by))) + if (can_player_build_unit_direct(city_owner(pcity), id)) + return 0; return 1; } @@ -588,8 +589,9 @@ { if (!can_player_build_unit_direct(p, id)) return 0; - if (can_player_build_unit_direct(p, unit_types[id].obsoleted_by)) - return 0; + while(unit_type_exists((id = unit_types[id].obsoleted_by))) + if (can_player_build_unit_direct(p, id)) + return 0; return 1; } @@ -602,8 +604,9 @@ { if (!unit_type_exists(id)) return 0; - if (can_player_build_unit_direct(p, unit_types[id].obsoleted_by)) - return 0; + while(unit_type_exists((id = unit_types[id].obsoleted_by))) + if (can_player_build_unit_direct(p, id)) + return 0; return 1; } diff -Nur -X/home/thue/freeciv-dev/no.freeciv freeciv/common/unit.c transitive_upgrades2/common/unit.c --- freeciv/common/unit.c Fri Apr 7 19:55:10 2000 +++ transitive_upgrades2/common/unit.c Sat Apr 8 12:09:13 2000 @@ -782,21 +782,20 @@ **************************************************************************/ int can_upgrade_unittype(struct player *pplayer, Unit_Type_id id) { - if (get_invention(pplayer, - unit_types[id].tech_requirement)!=TECH_KNOWN) - return -1; - if (unit_types[id].obsoleted_by == -1) - return -1; - if (get_invention(pplayer, - unit_types[unit_types[id].obsoleted_by].tech_requirement)!=TECH_KNOWN) + Unit_Type_id best_upgrade = -1; + + if (!can_player_build_unit_direct(pplayer, id)) return -1; - while (unit_types[id].obsoleted_by!=-1 && get_invention(pplayer, - unit_types[unit_types[id].obsoleted_by].tech_requirement)==TECH_KNOWN) { - id = unit_types[id].obsoleted_by; - } - return id; + while (unit_type_exists(id = unit_types[id].obsoleted_by)) + if (can_player_build_unit_direct(pplayer, id)) + best_upgrade = id; + + return best_upgrade; } +/************************************************************************** +... +**************************************************************************/ int unit_upgrade_price(struct player *pplayer, Unit_Type_id from, Unit_Type_id to) { int total, build; diff -Nur -X/home/thue/freeciv-dev/no.freeciv freeciv/server/cityturn.c transitive_upgrades2/server/cityturn.c --- freeciv/server/cityturn.c Fri Apr 7 19:55:15 2000 +++ transitive_upgrades2/server/cityturn.c Sat Apr 8 01:18:07 2000 @@ -1132,13 +1132,13 @@ **************************************************************************/ static Unit_Type_id upgrade_unit(struct city *pcity, Unit_Type_id id) { - while(can_build_unit_direct(pcity, id) && - can_build_unit_direct(pcity, unit_types[id].obsoleted_by)) - { - id = unit_types[id].obsoleted_by; + Unit_Type_id latest_ok = id; + while(unit_type_exists(id= unit_types[id].obsoleted_by)) { + if (can_build_unit_direct(pcity, id)) + latest_ok = id; } - return id; + return latest_ok; } /**************************************************************************