Feature #1425 ยป 0064-Add-FutureTechs-requirement-type.patch
| ai/default/daieffects.c | ||
|---|---|---|
|   case VUT_ACHIEVEMENT: | ||
|   case VUT_MINCULTURE: | ||
|   case VUT_MINTECHS: | ||
|   case VUT_FUTURETECHS: | ||
|     /* No way to remove once present. */ | ||
|     return preq->present; | ||
| ai/default/daimilitary.c | ||
|---|---|---|
|   case VUT_PLAYER_STATE: | ||
|   case VUT_MINCULTURE: | ||
|   case VUT_MINTECHS: | ||
|   case VUT_FUTURETECHS: | ||
|   case VUT_MINCITIES: | ||
|   case VUT_ORIGINAL_OWNER: | ||
|   case VUT_ROADFLAG: | ||
| common/fc_types.h | ||
|---|---|---|
|   int age; | ||
|   int form_age; | ||
|   int min_techs; | ||
|   int future_techs; | ||
|   int min_cities; | ||
|   int latitude; | ||
|   int distance_sq; | ||
| common/reqtext.c | ||
|---|---|---|
|     } | ||
|     break; | ||
|   case VUT_FUTURETECHS: | ||
|     switch (preq->range) { | ||
|     case REQ_RANGE_WORLD: | ||
|       fc_strlcat(buf, prefix, bufsz); | ||
|       if (preq->present) { | ||
|         cat_snprintf(buf, bufsz, | ||
|                      _("Requires %d future techs to be known in the world."), | ||
|                      preq->source.value.future_techs); | ||
|       } else { | ||
|         cat_snprintf(buf, bufsz, | ||
|                      _("Prevented when %d future techs are known in the world."), | ||
|                      preq->source.value.future_techs); | ||
|       } | ||
|       return TRUE; | ||
|     case REQ_RANGE_PLAYER: | ||
|       fc_strlcat(buf, prefix, bufsz); | ||
|       if (preq->present) { | ||
|         cat_snprintf(buf, bufsz, | ||
|                      _("Requires player to know %d future techs."), | ||
|                      preq->source.value.future_techs); | ||
|       } else { | ||
|         cat_snprintf(buf, bufsz, | ||
|                      _("Prevented when player knows %d future techs."), | ||
|                      preq->source.value.future_techs); | ||
|       } | ||
|       return TRUE; | ||
|     case REQ_RANGE_LOCAL: | ||
|     case REQ_RANGE_TILE: | ||
|     case REQ_RANGE_CADJACENT: | ||
|     case REQ_RANGE_ADJACENT: | ||
|     case REQ_RANGE_CITY: | ||
|     case REQ_RANGE_TRADE_ROUTE: | ||
|     case REQ_RANGE_CONTINENT: | ||
|     case REQ_RANGE_TEAM: | ||
|     case REQ_RANGE_ALLIANCE: | ||
|     case REQ_RANGE_COUNT: | ||
|       /* Not supported. */ | ||
|       break; | ||
|     } | ||
|     break; | ||
|   case VUT_MINCITIES: | ||
|     switch (preq->range) { | ||
|     case REQ_RANGE_PLAYER: | ||
| common/requirements.c | ||
|---|---|---|
|       return; | ||
|     } | ||
|     break; | ||
|   case VUT_FUTURETECHS: | ||
|     source->value.future_techs = atoi(value); | ||
|     if (source->value.future_techs > 0) { | ||
|       return; | ||
|     } | ||
|     break; | ||
|   case VUT_MINCITIES: | ||
|     source->value.min_cities = atoi(value); | ||
|     if (source->value.min_cities > 0) { | ||
| ... | ... | |
|   case VUT_MINTECHS: | ||
|     source.value.min_techs = value; | ||
|     return source; | ||
|   case VUT_FUTURETECHS: | ||
|     source.value.future_techs = value; | ||
|     return source; | ||
|   case VUT_MINCITIES: | ||
|     source.value.min_cities = value; | ||
|     return source; | ||
| ... | ... | |
|     return source->value.form_age; | ||
|   case VUT_MINTECHS: | ||
|     return source->value.min_techs; | ||
|   case VUT_FUTURETECHS: | ||
|     return source->value.future_techs; | ||
|   case VUT_MINCITIES: | ||
|     return source->value.min_cities; | ||
|   case VUT_ACTION: | ||
| ... | ... | |
|       case VUT_PLAYER_FLAG: | ||
|       case VUT_PLAYER_STATE: | ||
|       case VUT_MINCITIES: | ||
|       case VUT_FUTURETECHS: | ||
|         req.range = REQ_RANGE_PLAYER; | ||
|         break; | ||
|       case VUT_MINYEAR: | ||
| ... | ... | |
|       break; | ||
|     case VUT_ACHIEVEMENT: | ||
|     case VUT_MINTECHS: | ||
|     case VUT_FUTURETECHS: | ||
|       invalid = (req.range < REQ_RANGE_PLAYER); | ||
|       break; | ||
|     case VUT_ADVANCE: | ||
| ... | ... | |
|     case VUT_DIPLREL_UNITANY_O: | ||
|     case VUT_MAXTILEUNITS: | ||
|     case VUT_MINTECHS: | ||
|     case VUT_FUTURETECHS: | ||
|     case VUT_MINCITIES: | ||
|     case VUT_MINLATITUDE: | ||
|     case VUT_MAXLATITUDE: | ||
| ... | ... | |
|   } | ||
| } | ||
| /**********************************************************************//** | ||
|   Determine whether a minimum future technologies requirement is satisfied | ||
|   in a given context, ignoring parts of the requirement that can be handled | ||
|   uniformly for all requirement types. | ||
|   context, other_context and req must not be null, | ||
|   and req must be a mintechs requirement | ||
| **************************************************************************/ | ||
| static enum fc_tristate | ||
| is_futuretechs_req_active(const struct civ_map *nmap, | ||
|                           const struct req_context *context, | ||
|                           const struct req_context *other_context, | ||
|                           const struct requirement *req) | ||
| { | ||
|   IS_REQ_ACTIVE_VARIANT_ASSERT(VUT_FUTURETECHS); | ||
|   switch (req->range) { | ||
|   case REQ_RANGE_WORLD: | ||
|     players_iterate_alive(plr) { | ||
|       if (research_get(plr)->future_tech | ||
|           >= req->source.value.future_techs) { | ||
|         return TRI_YES; | ||
|       } | ||
|     } players_iterate_alive_end; | ||
|     return TRI_NO; | ||
|   case REQ_RANGE_PLAYER: | ||
|     if (context->player == nullptr) { | ||
|       return TRI_MAYBE; | ||
|     } else { | ||
|       return BOOL_TO_TRISTATE(research_get(context->player)->future_tech | ||
|                               >= req->source.value.future_techs); | ||
|     } | ||
|   default: | ||
|     return TRI_MAYBE; | ||
|   } | ||
| } | ||
| /**********************************************************************//** | ||
|   Determine whether a minimum cities count requirement is satisfied in a | ||
|   given context, ignoring parts of the requirement that can be handled | ||
| ... | ... | |
|   [VUT_DIPLREL_UNITANY_O] = {is_diplrel_unitany_o_req_active, REQUCH_NO}, | ||
|   [VUT_EXTRA] = {is_extra_req_active, REQUCH_NO, REQUC_LOCAL}, | ||
|   [VUT_EXTRAFLAG] = {is_extraflag_req_active, REQUCH_NO, REQUC_LOCAL}, | ||
|   [VUT_FUTURETECHS] = {is_futuretechs_req_active, REQUCH_ACT, REQUC_WORLD}, | ||
|   [VUT_GOOD] = {is_good_req_active, REQUCH_NO}, | ||
|   [VUT_GOVERNMENT] = {is_gov_req_active, REQUCH_NO}, | ||
|   [VUT_IMPROVEMENT] = {is_building_req_active, REQUCH_NO, REQUC_IMPR}, | ||
| ... | ... | |
|   case VUT_MINCULTURE: | ||
|   case VUT_MINFOREIGNPCT: | ||
|   case VUT_MINTECHS: | ||
|   case VUT_FUTURETECHS: | ||
|   case VUT_MINCITIES: | ||
|   case VUT_NATIONALITY: | ||
|   case VUT_ORIGINAL_OWNER: /* As long as midgame player creation or civil war possible */ | ||
| ... | ... | |
|     return psource1->value.form_age == psource2->value.form_age; | ||
|   case VUT_MINTECHS: | ||
|     return psource1->value.min_techs == psource2->value.min_techs; | ||
|   case VUT_FUTURETECHS: | ||
|     return psource1->value.future_techs == psource2->value.future_techs; | ||
|   case VUT_MINCITIES: | ||
|     return psource1->value.min_cities == psource2->value.min_cities; | ||
|   case VUT_ACTION: | ||
| ... | ... | |
|   case VUT_MINTECHS: | ||
|     fc_snprintf(buffer, sizeof(buffer), "%d", psource->value.min_techs); | ||
|     return buffer; | ||
|   case VUT_FUTURETECHS: | ||
|     fc_snprintf(buffer, sizeof(buffer), "%d", psource->value.future_techs); | ||
|     return buffer; | ||
|   case VUT_MINCITIES: | ||
|     fc_snprintf(buffer, sizeof(buffer), "%d", psource->value.min_cities); | ||
| ... | ... | |
|     cat_snprintf(buf, bufsz, _("%d Techs"), | ||
|                  psource->value.min_techs); | ||
|     return buf; | ||
|   case VUT_FUTURETECHS: | ||
|     cat_snprintf(buf, bufsz, _("%d Future techs"), | ||
|                  psource->value.future_techs); | ||
|     return buf; | ||
|   case VUT_MINCITIES: | ||
|     cat_snprintf(buf, bufsz, _("%d Cities"), | ||
|                  psource->value.min_cities); | ||
| doc/README.effects | ||
|---|---|---|
| Tech:            World, Alliance, Team, Player, Local | ||
| TechFlag:        World, Alliance, Team, Player, Local | ||
| MinTechs:        World, Player | ||
| FutureTechs:     World, Player | ||
| MinCities:       Player | ||
| Achievement:     World, Alliance, Team, Player | ||
| Counter:         City | ||
| gen_headers/enums/fc_types_enums.def | ||
|---|---|---|
|   EXTRA              "Extra" | ||
|   EXTRAFLAG          "ExtraFlag" | ||
|   FORM_AGE           "FormAge" | ||
|   FUTURETECHS        "FutureTechs" | ||
|   GOOD               "Good" | ||
|   GOVERNMENT         "Gov" | ||
|   IMPROVEMENT        "Building" | ||
| server/cityturn.c | ||
|---|---|---|
|           purge = TRUE; | ||
|         } | ||
|         break; | ||
|       case VUT_FUTURETECHS: | ||
|         if (preq->present) { | ||
|           notify_player(pplayer, city_tile(pcity), | ||
|                         E_CITY_CANTBUILD, ftc_server, | ||
|                         _("%s can't build %s from the worklist; " | ||
|                           "%d future techs must be known. Postponing..."), | ||
|                         city_link(pcity), | ||
|                         tgt_name, | ||
|                         preq->source.value.future_techs); | ||
|           script_server_signal_emit(signal_name, ptarget, | ||
|                                     pcity, "need_futuretechs"); | ||
|         } else { | ||
|           purge = TRUE; | ||
|         } | ||
|         break; | ||
|       case VUT_MINCITIES: | ||
|         if (preq->present) { | ||
|           notify_player(pplayer, city_tile(pcity), | ||
| server/ruleset/rssanity.c | ||
|---|---|---|
|       break; | ||
|     case VUT_MINTECHS: | ||
|     case VUT_FUTURETECHS: | ||
|       /* At ranges 'Player' and 'World' */ | ||
|       if (rc > 2) { | ||
|         ruleset_error(logger, LOG_ERROR, | ||
| tools/ruledit/univ_value.c | ||
|---|---|---|
|   case VUT_MINTECHS: | ||
|     src->value.min_techs = 0; | ||
|     return TRUE; | ||
|   case VUT_FUTURETECHS: | ||
|     src->value.future_techs = 0; | ||
|     return TRUE; | ||
|   case VUT_MINCITIES: | ||
|     src->value.min_cities = 0; | ||
|     return TRUE; | ||
| ... | ... | |
|   case VUT_AGE: | ||
|   case VUT_FORM_AGE: | ||
|   case VUT_MINTECHS: | ||
|   case VUT_FUTURETECHS: | ||
|   case VUT_MINCITIES: | ||
|   case VUT_MINLATITUDE: | ||
|   case VUT_MAXLATITUDE: | ||