diff -Nur -Xfreecivdiff.ignore freeciv-cvs/common/government.c freeciv-patched/common/government.c --- freeciv-cvs/common/government.c 2003-07-10 11:53:38.000000000 +0100 +++ freeciv-patched/common/government.c 2003-07-24 17:02:53.000000000 +0100 @@ -252,10 +252,15 @@ * ever get it, then we can't change to the gov type even if we have * a wonder that would otherwise allow it. */ return FALSE; + } else if (get_invention(pplayer, req) == TECH_KNOWN) { + return TRUE; } else { - return (get_invention(pplayer, req) == TECH_KNOWN - || player_owns_active_govchange_wonder(pplayer)); + /* Do we have the Any_Government effect? */ + impr_effects_iterate(iter, B_LAST, NULL, pplayer) { + if (iter.imeff->type == EFT_ANY_GOVERNMENT) return TRUE; + } impr_effects_iterate_end; } + return FALSE; } /*************************************************************** diff -Nur -Xfreecivdiff.ignore freeciv-cvs/common/player.c freeciv-patched/common/player.c --- freeciv-cvs/common/player.c 2003-07-24 17:02:27.000000000 +0100 +++ freeciv-patched/common/player.c 2003-07-24 17:02:53.000000000 +0100 @@ -320,18 +320,6 @@ } /************************************************************************** - ... -**************************************************************************/ -bool player_owns_active_govchange_wonder(struct player *pplayer) -{ - return ( player_owns_active_wonder(pplayer, B_LIBERTY) || - ( (improvement_variant(B_PYRAMIDS)==1) && - player_owns_active_wonder(pplayer, B_PYRAMIDS) ) || - ( (improvement_variant(B_UNITED)==1) && - player_owns_active_wonder(pplayer, B_UNITED) ) ); -} - -/************************************************************************** Returns the number of techs the player has researched which has this flag. Needs to be optimized later (e.g. int tech_flags[TF_LAST] in struct player) diff -Nur -Xfreecivdiff.ignore freeciv-cvs/common/player.h freeciv-patched/common/player.h --- freeciv-cvs/common/player.h 2003-07-24 16:57:16.000000000 +0100 +++ freeciv-patched/common/player.h 2003-07-24 17:02:53.000000000 +0100 @@ -235,7 +235,6 @@ bool player_in_city_radius(struct player *pplayer, int x, int y); bool player_owns_active_wonder(struct player *pplayer, Impr_Type_id id); -bool player_owns_active_govchange_wonder(struct player *pplayer); bool player_knows_improvement_tech(struct player *pplayer, Impr_Type_id id); bool player_knows_techs_with_flag(struct player *pplayer, diff -Nur -Xfreecivdiff.ignore freeciv-cvs/server/plrhand.c freeciv-patched/server/plrhand.c --- freeciv-cvs/server/plrhand.c 2003-07-24 17:00:57.000000000 +0100 +++ freeciv-patched/server/plrhand.c 2003-07-24 17:02:54.000000000 +0100 @@ -774,8 +774,10 @@ check_player_government_rates(pplayer); global_city_refresh(pplayer); send_player_info(pplayer, pplayer); - if (player_owns_active_govchange_wonder(pplayer)) - pplayer->revolution=1; + /* Skip revolution period if we have the relevant effect */ + impr_effects_iterate(iter, B_LAST, NULL, pplayer) { + if (iter.imeff->type == EFT_NO_ANARCHY) pplayer->revolution = 1; + } impr_effects_iterate_end; } /************************************************************************** diff -Nur -Xfreecivdiff.ignore freeciv-cvs/server/ruleset.c freeciv-patched/server/ruleset.c --- freeciv-cvs/server/ruleset.c 2003-07-24 17:02:27.000000000 +0100 +++ freeciv-patched/server/ruleset.c 2003-07-24 17:02:54.000000000 +0100 @@ -1136,6 +1136,8 @@ case EFT_HAVE_EMBASSIES: case EFT_REVEAL_CITIES: case EFT_REVEAL_MAP: + case EFT_NO_ANARCHY: + case EFT_ANY_GOVERNMENT: e->range = EFR_PLAYER; break; case EFT_GIVE_IMM_ADV: e->range = EFR_CITY; break;