Feature #563 » 0070-Add-improvement-flag-Infra.patch
| ai/default/daicity.c | ||
|---|---|---|
|      */ | ||
|     if (improvement_has_flag(pimprove, IF_GOLD)) { | ||
|       v += TRADE_WEIGHTING / 10; | ||
|     } else if (improvement_has_flag(pimprove, IF_INFRA)) { | ||
|       v += INFRA_WEIGHTING / 10; | ||
|     } | ||
|     /* Without relevant flags, base want remains 0. */ | ||
|   } else { | ||
| client/citydlg_common.c | ||
|---|---|---|
|   } | ||
|   if (city_production_is_genus(pcity, IG_CONVERT)) { | ||
|     if (city_production_has_flag(pcity, IF_GOLD)) { | ||
|       int gold = MAX(0, pcity->surplus[O_SHIELD]); | ||
|     int output = MAX(0, pcity->surplus[O_SHIELD]); | ||
|     if (city_production_has_flag(pcity, IF_GOLD)) { | ||
|       fc_snprintf(buffer, buffer_len, | ||
|                   PL_("%3d gold per turn", "%3d gold per turn", output), | ||
|                   output); | ||
|     } else if (city_production_has_flag(pcity, IF_INFRA)) { | ||
|       fc_snprintf(buffer, buffer_len, | ||
|                   PL_("%3d gold per turn", "%3d gold per turn", gold), | ||
|                   gold); | ||
|                   PL_("%3d infrapoint per turn", "%3d infrapoints per turn", output), | ||
|                   output); | ||
|     } else { | ||
|       fc_strlcpy(buffer, "---", buffer_len); | ||
|     } | ||
| ... | ... | |
|     if (is_convert_improvement(target->value.building)) { | ||
|       fc_strlcat(buffer, " (--) ", buffer_len); | ||
|       if (improvement_has_flag(target->value.building, IF_GOLD)) { | ||
|       if (improvement_has_flag(target->value.building, IF_GOLD) | ||
|           || improvement_has_flag(target->value.building, IF_INFRA)) { | ||
|         cat_snprintf(buffer, buffer_len, _("%d/turn"), | ||
|                      MAX(0, pcity->surplus[O_SHIELD])); | ||
|       } else { | ||
| ... | ... | |
|     if (VUT_IMPROVEMENT == target->kind | ||
|         && is_convert_improvement(target->value.building)) { | ||
|       /* Coinage-like improvements: print yield-per-turn instead */ | ||
|       if (improvement_has_flag(target->value.building, IF_GOLD)) { | ||
|       if (improvement_has_flag(target->value.building, IF_GOLD) | ||
|           || improvement_has_flag(target->value.building, IF_INFRA)) { | ||
|         fc_snprintf(buf[3], column_size, _("%d/turn"), | ||
|                     MAX(0, pcity->surplus[O_SHIELD])); | ||
|       } else { | ||
| client/cityrepdata.c | ||
|---|---|---|
|     gui_options.concise_city_production ? "+" : _("(worklist)"); | ||
|   if (city_production_is_genus(pcity, IG_CONVERT)) { | ||
|     if (city_production_has_flag(pcity, IF_GOLD)) { | ||
|     if (city_production_has_flag(pcity, IF_GOLD) | ||
|         || city_production_has_flag(pcity, IF_INFRA)) { | ||
|       fc_snprintf(buf, sizeof(buf), "%s (%d)%s", | ||
|                   city_production_name_translation(pcity), | ||
|                   MAX(0, pcity->surplus[O_SHIELD]), from_worklist); | ||
| client/gui-qt/citydlg.cpp | ||
|---|---|---|
|   QRect rect2; | ||
|   struct sprite *sprite; | ||
|   bool useless = false; | ||
|   bool is_coinage = false; | ||
|   bool is_convert = false; | ||
|   bool is_neutral = false; | ||
|   bool is_sea = false; | ||
|   bool is_flying = false; | ||
| ... | ... | |
|     name = improvement_name_translation(target->value.building); | ||
|     sprite = get_building_sprite(tileset, target->value.building); | ||
|     useless = is_improvement_redundant(pcity, target->value.building); | ||
|     is_coinage = improvement_has_flag(target->value.building, IF_GOLD); | ||
|     is_convert = (target->value.building->genus == IG_CONVERT); | ||
|   } | ||
|   if (sprite != nullptr) { | ||
| ... | ... | |
|     QItemDelegate::drawDecoration(painter, option, option.rect, pix_dec); | ||
|   } | ||
|   if (is_coinage) { | ||
|   if (is_convert) { | ||
|     pix_dec.fill(QColor(255, 255, 0, 70)); | ||
|     QItemDelegate::drawDecoration(painter, option, option.rect, pix_dec); | ||
|   } | ||
| client/gui-sdl2/wldlg.c | ||
|---|---|---|
|                                          editor->currently_building, &cost); | ||
|   if (convert_prod) { | ||
|     int output = MAX(0, editor->pcity->surplus[O_SHIELD]); | ||
|     if (improvement_has_flag(editor->currently_building.value.building, | ||
|                              IF_GOLD)) { | ||
|       int gold = MAX(0, editor->pcity->surplus[O_SHIELD]); | ||
|       fc_snprintf(cbuf, sizeof(cbuf), | ||
|                   PL_("%s\n%d gold per turn", | ||
|                       "%s\n%d gold per turn", gold), | ||
|                   name, gold); | ||
|                       "%s\n%d gold per turn", output), | ||
|                   name, output); | ||
|     } else if (improvement_has_flag(editor->currently_building.value.building, | ||
|                                     IF_INFRA)) { | ||
|       fc_snprintf(cbuf, sizeof(cbuf), | ||
|                   PL_("%s\n%d infrapoint per turn", | ||
|                       "%s\n%d infrapoints per turn", output), | ||
|                   name, output); | ||
|     } else { | ||
|       fc_snprintf(cbuf, sizeof(cbuf), "%s\n-", name); | ||
|     } | ||
| ... | ... | |
|     count = city_production_build_shield_cost(pcity); | ||
|     if (convert_prod) { | ||
|       if (city_production_has_flag(pcity, IF_GOLD)) { | ||
|         int gold = MAX(0, pcity->surplus[O_SHIELD]); | ||
|       int output = MAX(0, pcity->surplus[O_SHIELD]); | ||
|       if (city_production_has_flag(pcity, IF_GOLD)) { | ||
|         fc_snprintf(cbuf, sizeof(cbuf), | ||
|                     PL_("%s\n%d gold per turn", | ||
|                         "%s\n%d gold per turn", gold), | ||
|                     name, gold); | ||
|                         "%s\n%d gold per turn", output), | ||
|                     name, output); | ||
|       } else if (city_production_has_flag(pcity, IF_INFRA)) { | ||
|         fc_snprintf(cbuf, sizeof(cbuf), | ||
|                     PL_("%s\n%d infrapoint per turn", | ||
|                         "%s\n%d infrapoints per turn", output), | ||
|                     name, output); | ||
|       } else { | ||
|         fc_snprintf(cbuf, sizeof(cbuf), "%s\n-", name); | ||
|       } | ||
| ... | ... | |
|             } | ||
|           } | ||
|         } else { | ||
|           /* coinage-like */ | ||
|           if (improvement_has_flag(pimprove, IF_GOLD)) { | ||
|             int gold = MAX(0, pcity->surplus[O_SHIELD]); | ||
|           int output = MAX(0, pcity->surplus[O_SHIELD]); | ||
|           /* Coinage-like */ | ||
|           if (improvement_has_flag(pimprove, IF_GOLD)) { | ||
|             fc_snprintf(cbuf, sizeof(cbuf), PL_("%d gold per turn", | ||
|                                                 "%d gold per turn", gold), | ||
|                         gold); | ||
|                                                 "%d gold per turn", output), | ||
|                         output); | ||
|           } else if (improvement_has_flag(pimprove, IF_INFRA)) { | ||
|             fc_snprintf(cbuf, sizeof(cbuf), PL_("%d infrapoint per turn", | ||
|                                                 "%d infrapoints per turn", output), | ||
|                         output); | ||
|           } else { | ||
|             fc_strlcpy(cbuf, "-", sizeof(cbuf)); | ||
|           } | ||
|         } | ||
|       } else { | ||
|         /* non city mode */ | ||
|         /* Non city mode */ | ||
|         if (!is_convert_improvement(pimprove)) { | ||
|           int cost = impr_build_shield_cost(NULL, pimprove); | ||
| ... | ... | |
|         } else { | ||
|           if (improvement_has_flag(pimprove, IF_GOLD)) { | ||
|             fc_strlcpy(cbuf, _("shields into gold"), sizeof(cbuf)); | ||
|           } else if (improvement_has_flag(pimprove, IF_INFRA)) { | ||
|             fc_strlcpy(cbuf, _("shields into infrapoints"), sizeof(cbuf)); | ||
|           } else { | ||
|             fc_strlcpy(cbuf, "-", sizeof(cbuf)); | ||
|           } | ||
| client/gui-sdl3/wldlg.c | ||
|---|---|---|
|                                          editor->currently_building, &cost); | ||
|   if (convert_prod) { | ||
|     int output = MAX(0, editor->pcity->surplus[O_SHIELD]); | ||
|     if (improvement_has_flag(editor->currently_building.value.building, | ||
|                              IF_GOLD)) { | ||
|       int gold = MAX(0, editor->pcity->surplus[O_SHIELD]); | ||
|       fc_snprintf(cbuf, sizeof(cbuf), | ||
|                   PL_("%s\n%d gold per turn", | ||
|                       "%s\n%d gold per turn", gold), | ||
|                   name, gold); | ||
|                       "%s\n%d gold per turn", output), | ||
|                   name, output); | ||
|     } else if (improvement_has_flag(editor->currently_building.value.building, | ||
|                                     IF_INFRA)) { | ||
|       fc_snprintf(cbuf, sizeof(cbuf), | ||
|                   PL_("%s\n%d infrapoint per turn", | ||
|                       "%s\n%d infrapoints per turn", output), | ||
|                   name, output); | ||
|     } else { | ||
|       fc_snprintf(cbuf, sizeof(cbuf), "%s\n-", name); | ||
|     } | ||
| ... | ... | |
|     count = city_production_build_shield_cost(pcity); | ||
|     if (convert_prod) { | ||
|       if (city_production_has_flag(pcity, IF_GOLD)) { | ||
|         int gold = MAX(0, pcity->surplus[O_SHIELD]); | ||
|       int output = MAX(0, pcity->surplus[O_SHIELD]); | ||
|       if (city_production_has_flag(pcity, IF_GOLD)) { | ||
|         fc_snprintf(cbuf, sizeof(cbuf), | ||
|                     PL_("%s\n%d gold per turn", | ||
|                         "%s\n%d gold per turn", gold), | ||
|                     name, gold); | ||
|                         "%s\n%d gold per turn", output), | ||
|                     name, output); | ||
|       } else if (city_production_has_flag(pcity, IF_INFRA)) { | ||
|         fc_snprintf(cbuf, sizeof(cbuf), | ||
|                     PL_("%s\n%d infrapoint per turn", | ||
|                         "%s\n%d infrapoints per turn", output), | ||
|                     name, output); | ||
|       } else { | ||
|         fc_snprintf(cbuf, sizeof(cbuf), "%s\n-", name); | ||
|       } | ||
| ... | ... | |
|             } | ||
|           } | ||
|         } else { | ||
|           /* coinage-like */ | ||
|           if (improvement_has_flag(pimprove, IF_GOLD)) { | ||
|             int gold = MAX(0, pcity->surplus[O_SHIELD]); | ||
|           int output = MAX(0, pcity->surplus[O_SHIELD]); | ||
|           /* Coinage-like */ | ||
|           if (improvement_has_flag(pimprove, IF_GOLD)) { | ||
|             fc_snprintf(cbuf, sizeof(cbuf), PL_("%d gold per turn", | ||
|                                                 "%d gold per turn", gold), | ||
|                         gold); | ||
|                                                 "%d gold per turn", output), | ||
|                         output); | ||
|           } else if (improvement_has_flag(pimprove, IF_INFRA)) { | ||
|             fc_snprintf(cbuf, sizeof(cbuf), PL_("%d infrapoint per turn", | ||
|                                                 "%d infrapoints per turn", output), | ||
|                         output); | ||
|           } else { | ||
|             fc_strlcpy(cbuf, "-", sizeof(cbuf)); | ||
|           } | ||
|         } | ||
|       } else { | ||
|         /* non city mode */ | ||
|         /* Non city mode */ | ||
|         if (!is_convert_improvement(pimprove)) { | ||
|           int cost = impr_build_shield_cost(NULL, pimprove); | ||
| ... | ... | |
|         } else { | ||
|           if (improvement_has_flag(pimprove, IF_GOLD)) { | ||
|             fc_strlcpy(cbuf, _("shields into gold"), sizeof(cbuf)); | ||
|           } else if (improvement_has_flag(pimprove, IF_INFRA)) { | ||
|             fc_strlcpy(cbuf, _("shields into infrapoints"), sizeof(cbuf)); | ||
|           } else { | ||
|             fc_strlcpy(cbuf, "-", sizeof(cbuf)); | ||
|           } | ||
| common/improvement.c | ||
|---|---|---|
| { | ||
|     return (!improvement_obsolete(city_owner(pcity), pimprove, pcity) | ||
|             && (improvement_has_flag(pimprove, IF_GOLD) | ||
|                 || improvement_has_flag(pimprove, IF_INFRA) | ||
|                 || improvement_has_side_effects(pcity, pimprove) | ||
|                 || improvement_has_effects(pcity, pimprove))); | ||
| } | ||
| ... | ... | |
|    - all of its effects (if any) are provided by other means, or it's | ||
|      obsolete (and thus assumed to have no effect); and | ||
|    - it's not enabling the city to build some kind of units; and | ||
|    - it's not Coinage (IF_GOLD). | ||
|    - it's not convert production (IF_GOLD or IF_INFRA). | ||
|   (Note that it's not impossible that this improvement could become useful | ||
|   if circumstances changed, say if a new government enabled the building | ||
|   of its special units.) | ||
| ... | ... | |
|   if (improvement_has_flag(pimprove, IF_GOLD)) { | ||
|     return FALSE; | ||
|   } | ||
|   if (improvement_has_flag(pimprove, IF_INFRA)) { | ||
|     return FALSE; | ||
|   } | ||
|   /* If an improvement has side effects, don't claim it's redundant. */ | ||
|   if (improvement_has_side_effects(pcity, pimprove)) { | ||
| gen_headers/enums/fc_types_enums.def | ||
|---|---|---|
|   SAVE_SMALL_WONDER  "SaveSmallWonder" | ||
|   /* When built, gives gold */ | ||
|   GOLD               "Gold" | ||
|   /* When built, gives infrapoints */ | ||
|   INFRA              "Infra" | ||
|   /* Never destroyed by disasters */ | ||
|   DISASTER_PROOF     "DisasterProof" | ||
|   /* Never destroyed by a surgical strike */ | ||
| server/cityturn.c | ||
|---|---|---|
|      * this turn. */ | ||
|     if (city_production_has_flag(pcity, IF_GOLD)) { | ||
|       pplayer->economic.gold += pcity->before_change_shields; | ||
|     } else if (city_production_has_flag(pcity, IF_INFRA)) { | ||
|       pplayer->economic.infra_points += pcity->before_change_shields; | ||
|     } | ||
|     pcity->before_change_shields = 0; | ||
| server/ruleset/rssanity.c | ||
|---|---|---|
| { | ||
|   /* Special Genus */ | ||
|   improvement_re_active_iterate(pimprove) { | ||
|     if (improvement_has_flag(pimprove, IF_GOLD) | ||
|         && pimprove->genus != IG_CONVERT) { | ||
|     if (improvement_has_flag(pimprove, IF_GOLD)) { | ||
|       if (pimprove->genus != IG_CONVERT) { | ||
|         ruleset_error(logger, LOG_ERROR, | ||
|                       _("Gold producing improvement %s with genus other than \"Convert\""), | ||
|                       improvement_rule_name(pimprove)); | ||
|         return FALSE; | ||
|       } | ||
|       if (improvement_has_flag(pimprove, IF_INFRA)) { | ||
|         ruleset_error(logger, LOG_ERROR, | ||
|                       _("The same improvement has both \"Gold\" and \"Infra\" flags")); | ||
|         return FALSE; | ||
|       } | ||
|     } else if (improvement_has_flag(pimprove, IF_INFRA)) { | ||
|       if (pimprove->genus != IG_CONVERT) { | ||
|         ruleset_error(logger, LOG_ERROR, | ||
|                       _("Infrapoints producing improvement %s with genus other than \"Convert\""), | ||
|                       improvement_rule_name(pimprove)); | ||
|         return FALSE; | ||
|       } | ||
|     } else if (pimprove->genus == IG_CONVERT) { | ||
|       ruleset_error(logger, LOG_ERROR, | ||
|                     _("Gold producing improvement %s with genus other than \"Convert\""), | ||
|                     _("Improvement %s with no conversion target with genus \"Convert\""), | ||
|                     improvement_rule_name(pimprove)); | ||
|       return FALSE; | ||
|     } | ||
|     if (improvement_has_flag(pimprove, IF_DISASTER_PROOF) | ||
|         && pimprove->genus != IG_IMPROVEMENT) { | ||
|       ruleset_error(logger, LOG_ERROR, | ||