Bug #207 » 0008-AI-Stop-attempts-to-recover-Helicopter-HP-in-the-ope.patch
| ai/default/aiunit.c | ||
|---|---|---|
|   CHECK_UNIT(punit); | ||
|   if (pcity) { | ||
|     /* rest in city until the hitpoints are recovered, but attempt | ||
|        to protect city from attack (and be opportunistic too)*/ | ||
|   if (pcity != NULL) { | ||
|     /* Rest in the city until the hitpoints are recovered, but attempt | ||
|      * to protect city from attack (and be opportunistic too)*/ | ||
|     if (dai_military_rampage(punit, RAMPAGE_ANYTHING,  | ||
|                              RAMPAGE_FREE_CITY_OR_BETTER)) { | ||
|       UNIT_LOG(LOGLEVEL_RECOVERY, punit, "recovering hit points."); | ||
|     } else { | ||
|       return; /* we died heroically defending our city */ | ||
|       return; /* We died heroically defending our city */ | ||
|     } | ||
|   } else { | ||
|     /* goto to nearest city to recover hit points */ | ||
|     /* just before, check to see if we can occupy an undefended enemy city */ | ||
|     /* Goto to nearest city to recover hit points */ | ||
|     /* Just before, check to see if we can occupy an undefended enemy city */ | ||
|     if (!dai_military_rampage(punit, RAMPAGE_FREE_CITY_OR_BETTER,  | ||
|                               RAMPAGE_FREE_CITY_OR_BETTER)) {  | ||
|       return; /* oops, we died */ | ||
|       return; /* Oops, we died */ | ||
|     } | ||
|     /* find city to stay and go there */ | ||
|     /* Find a city to stay and go there */ | ||
|     safe = find_nearest_safe_city(punit); | ||
|     if (safe) { | ||
|       UNIT_LOG(LOGLEVEL_RECOVERY, punit, "going to %s to recover", | ||
| ... | ... | |
|         return; | ||
|       } | ||
|     } else { | ||
|       /* oops */ | ||
|       /* Oops */ | ||
|       UNIT_LOG(LOGLEVEL_RECOVERY, punit, "didn't find a city to recover in!"); | ||
|       dai_unit_new_task(ait, punit, AIUNIT_NONE, NULL); | ||
|       dai_military_attack(ait, pplayer, punit); | ||
| ... | ... | |
|     } | ||
|   } | ||
|   /* is the unit still damaged? if true recover hit points, if not idle */ | ||
|   if (punit->hp == punittype->hp) { | ||
|     /* we are ready to go out and kick ass again */ | ||
|   /* Is the unit still damaged? If true, and could recover hit points, do so. | ||
|    * Don't wait if would be losing hitpoints that way! */ | ||
|   if (punit->hp == punittype->hp || !is_gaining_hp(punit)) { | ||
|     /* We are ready to go out and kick ass again */ | ||
|     UNIT_LOG(LOGLEVEL_RECOVERY, punit, "ready to kick ass again!"); | ||
|     dai_unit_new_task(ait, punit, AIUNIT_NONE, NULL);   | ||
|     return; | ||
|   } else { | ||
|     def_ai_unit_data(punit, ait)->done = TRUE; /* sit tight */ | ||
|     def_ai_unit_data(punit, ait)->done = TRUE; /* Sit tight */ | ||
|   } | ||
| } | ||
| common/unit.c | ||
|---|---|---|
|        utype_class(punittype)->hp_loss_pct / 100); | ||
| } | ||
| /************************************************************************** | ||
|   Does unit gain hitpoints each turn? | ||
| **************************************************************************/ | ||
| bool is_gaining_hp(const struct unit *punit) | ||
| { | ||
|   const struct unit_type *punittype = unit_type_get(punit); | ||
|   return get_unit_bonus(punit, EFT_UNIT_RECOVER) | ||
|     > (punittype->hp * | ||
|        utype_class(punittype)->hp_loss_pct / 100); | ||
| } | ||
| /************************************************************************** | ||
|   Does unit lose hitpoints each turn? | ||
| **************************************************************************/ | ||
| common/unit.h | ||
|---|---|---|
| bool is_losing_hp(const struct unit *punit); | ||
| bool unit_type_is_losing_hp(const struct player *pplayer, | ||
|                             const struct unit_type *punittype); | ||
| bool is_gaining_hp(const struct unit *punit); | ||
| bool unit_is_alive(int id); | ||