Feature #320 » 0038-Unhardcode-wld.map-from-is_action_enabled_unit_on_ci.patch
| ai/default/daicity.c | ||
|---|---|---|
| 
                                      const enum action_requester requester) 
   | 
||
| 
     { 
   | 
||
| 
       const int punit_id_stored = punit->id; 
   | 
||
| 
       const struct civ_map *nmap = &(wld.map); 
   | 
||
| 
       fc_assert_ret(owner == unit_owner(punit)); 
   | 
||
| ... | ... | |
| 
         tgt_city = tile_city(unit_tile(punit)); 
   | 
||
| 
         if (tgt_city 
   | 
||
| 
             && is_action_enabled_unit_on_city(ACTION_HELP_WONDER, 
   | 
||
| 
             && is_action_enabled_unit_on_city(nmap, ACTION_HELP_WONDER, 
   | 
||
| 
                                               punit, tgt_city)) { 
   | 
||
| 
           if (unit_perform_action(owner, punit->id, tgt_city->id, 
   | 
||
| 
                                   0, NULL, ACTION_HELP_WONDER, requester)) { 
   | 
||
| ... | ... | |
| 
         tgt_city = tile_city(unit_tile(punit)); 
   | 
||
| 
         if (tgt_city 
   | 
||
| 
             && is_action_enabled_unit_on_city(ACTION_DISBAND_UNIT_RECOVER, 
   | 
||
| 
             && is_action_enabled_unit_on_city(nmap, ACTION_DISBAND_UNIT_RECOVER, 
   | 
||
| 
                                               punit, tgt_city)) { 
   | 
||
| 
           if (unit_perform_action(owner, punit->id, tgt_city->id, 
   | 
||
| 
                                   0, NULL, ACTION_DISBAND_UNIT_RECOVER, requester)) { 
   | 
||
| ai/default/daitools.c | ||
|---|---|---|
| 
       int sanity = punit->id; 
   | 
||
| 
       bool alive; 
   | 
||
| 
       struct city *tcity; 
   | 
||
| 
       const struct civ_map *nmap = &(wld.map); 
   | 
||
| 
       CHECK_UNIT(punit); 
   | 
||
| 
       fc_assert_ret_val(is_ai(unit_owner(punit)), TRUE); 
   | 
||
| ... | ... | |
| 
                        0, "", ACTION_NUKE); 
   | 
||
| 
       } else if (action_id_get_target_kind(ACTION_NUKE) == ATK_CITY 
   | 
||
| 
                  && (tcity = tile_city(ptile)) 
   | 
||
| 
                  && is_action_enabled_unit_on_city(ACTION_NUKE, 
   | 
||
| 
                  && is_action_enabled_unit_on_city(nmap, ACTION_NUKE, 
   | 
||
| 
                                                    punit, tcity)) { 
   | 
||
| 
         /* Choose "Explode Nuclear". */ 
   | 
||
| 
         unit_do_action(unit_owner(punit), punit->id, tcity->id, 
   | 
||
| ... | ... | |
| 
                        0, "", ACTION_NUKE_CITY); 
   | 
||
| 
       } else if (action_id_get_target_kind(ACTION_NUKE_CITY) == ATK_CITY 
   | 
||
| 
                  && (tcity = tile_city(ptile)) 
   | 
||
| 
                  && is_action_enabled_unit_on_city(ACTION_NUKE_CITY, 
   | 
||
| 
                  && is_action_enabled_unit_on_city(nmap, ACTION_NUKE_CITY, 
   | 
||
| 
                                                    punit, tcity)) { 
   | 
||
| 
         /* Choose "Nuke City". */ 
   | 
||
| 
         unit_do_action(unit_owner(punit), punit->id, tcity->id, 
   | 
||
| ... | ... | |
| 
         unit_do_action(unit_owner(punit), punit->id, tile_index(ptile), 
   | 
||
| 
                        0, "", ACTION_SUICIDE_ATTACK); 
   | 
||
| 
       } else if ((tcity = tile_city(ptile)) 
   | 
||
| 
                  && is_action_enabled_unit_on_city(ACTION_CONQUER_CITY, 
   | 
||
| 
                  && is_action_enabled_unit_on_city(nmap, ACTION_CONQUER_CITY, 
   | 
||
| 
                                                    punit, tcity)) { 
   | 
||
| 
         /* Choose "Conquer City". */ 
   | 
||
| 
         unit_do_action(unit_owner(punit), punit->id, tcity->id, 
   | 
||
| 
                        0, "", ACTION_CONQUER_CITY); 
   | 
||
| 
       } else if ((tcity = tile_city(ptile)) 
   | 
||
| 
                  && is_action_enabled_unit_on_city(ACTION_CONQUER_CITY2, 
   | 
||
| 
                  && is_action_enabled_unit_on_city(nmap, ACTION_CONQUER_CITY2, 
   | 
||
| 
                                                    punit, tcity)) { 
   | 
||
| 
         /* Choose "Conquer City 2". */ 
   | 
||
| 
         unit_do_action(unit_owner(punit), punit->id, tcity->id, 
   | 
||
| 
                        0, "", ACTION_CONQUER_CITY2); 
   | 
||
| 
       } else if ((tcity = tile_city(ptile)) 
   | 
||
| 
                  && is_action_enabled_unit_on_city(ACTION_CONQUER_CITY3, 
   | 
||
| 
                  && is_action_enabled_unit_on_city(nmap, ACTION_CONQUER_CITY3, 
   | 
||
| 
                                                    punit, tcity)) { 
   | 
||
| 
         /* Choose "Conquer City 3". */ 
   | 
||
| 
         unit_do_action(unit_owner(punit), punit->id, tcity->id, 
   | 
||
| 
                        0, "", ACTION_CONQUER_CITY3); 
   | 
||
| 
       } else if ((tcity = tile_city(ptile)) 
   | 
||
| 
                  && is_action_enabled_unit_on_city(ACTION_CONQUER_CITY4, 
   | 
||
| 
                  && is_action_enabled_unit_on_city(nmap, ACTION_CONQUER_CITY4, 
   | 
||
| 
                                                    punit, tcity)) { 
   | 
||
| 
         /* Choose "Conquer City 4". */ 
   | 
||
| 
         unit_do_action(unit_owner(punit), punit->id, tcity->id, 
   | 
||
| 
                        0, "", ACTION_CONQUER_CITY4); 
   | 
||
| 
       } else if (!can_unit_survive_at_tile(&(wld.map), punit, ptile) 
   | 
||
| 
       } else if (!can_unit_survive_at_tile(nmap, punit, ptile) 
   | 
||
| 
                  && ((ptrans = transporter_for_unit_at(punit, ptile))) 
   | 
||
| 
                  && is_action_enabled_unit_on_unit(ACTION_TRANSPORT_EMBARK, 
   | 
||
| 
                                                    punit, ptrans)) { 
   | 
||
| 
         /* "Transport Embark". */ 
   | 
||
| 
         unit_do_action(unit_owner(punit), punit->id, ptrans->id, 
   | 
||
| 
                        0, "", ACTION_TRANSPORT_EMBARK); 
   | 
||
| 
       } else if (!can_unit_survive_at_tile(&(wld.map), punit, ptile) 
   | 
||
| 
       } else if (!can_unit_survive_at_tile(nmap, punit, ptile) 
   | 
||
| 
                  && ((ptrans = transporter_for_unit_at(punit, ptile))) 
   | 
||
| 
                  && is_action_enabled_unit_on_unit(ACTION_TRANSPORT_EMBARK2, 
   | 
||
| 
                                                    punit, ptrans)) { 
   | 
||
| 
         /* "Transport Embark 2". */ 
   | 
||
| 
         unit_do_action(unit_owner(punit), punit->id, ptrans->id, 
   | 
||
| 
                        0, "", ACTION_TRANSPORT_EMBARK2); 
   | 
||
| 
       } else if (!can_unit_survive_at_tile(&(wld.map), punit, ptile) 
   | 
||
| 
       } else if (!can_unit_survive_at_tile(nmap, punit, ptile) 
   | 
||
| 
                  && ((ptrans = transporter_for_unit_at(punit, ptile))) 
   | 
||
| 
                  && is_action_enabled_unit_on_unit(ACTION_TRANSPORT_EMBARK3, 
   | 
||
| 
                                                    punit, ptrans)) { 
   | 
||
| 
         /* "Transport Embark 3". */ 
   | 
||
| 
         unit_do_action(unit_owner(punit), punit->id, ptrans->id, 
   | 
||
| 
                        0, "", ACTION_TRANSPORT_EMBARK3); 
   | 
||
| 
       } else if (!can_unit_survive_at_tile(&(wld.map), punit, ptile) 
   | 
||
| 
       } else if (!can_unit_survive_at_tile(nmap, punit, ptile) 
   | 
||
| 
                  && ((ptrans = transporter_for_unit_at(punit, ptile))) 
   | 
||
| 
                  && is_action_enabled_unit_on_unit(ACTION_TRANSPORT_EMBARK4, 
   | 
||
| 
                                                    punit, ptrans)) { 
   | 
||
| ... | ... | |
| 
       int sanity = punit->id; 
   | 
||
| 
       struct player *pplayer = unit_owner(punit); 
   | 
||
| 
       const bool is_plr_ai = is_ai(pplayer); 
   | 
||
| 
       const struct civ_map *nmap = &(wld.map); 
   | 
||
| 
       CHECK_UNIT(punit); 
   | 
||
| 
       fc_assert_ret_val_msg(is_tiles_adjacent(unit_tile(punit), ptile), FALSE, 
   | 
||
| ... | ... | |
| 
       } 
   | 
||
| 
       /* Select move kind. */ 
   | 
||
| 
       if (!can_unit_survive_at_tile(&(wld.map), punit, ptile) 
   | 
||
| 
       if (!can_unit_survive_at_tile(nmap, punit, ptile) 
   | 
||
| 
           && ((ptrans = transporter_for_unit_at(punit, ptile))) 
   | 
||
| 
           && is_action_enabled_unit_on_unit(ACTION_TRANSPORT_EMBARK, 
   | 
||
| 
                                             punit, ptrans)) { 
   | 
||
| 
         /* "Transport Embark". */ 
   | 
||
| 
         paction = action_by_number(ACTION_TRANSPORT_EMBARK); 
   | 
||
| 
       } else if (!can_unit_survive_at_tile(&(wld.map), punit, ptile) 
   | 
||
| 
       } else if (!can_unit_survive_at_tile(nmap, punit, ptile) 
   | 
||
| 
                  && ptrans != NULL 
   | 
||
| 
                  && is_action_enabled_unit_on_unit(ACTION_TRANSPORT_EMBARK2, 
   | 
||
| 
                                                    punit, ptrans)) { 
   | 
||
| 
         /* "Transport Embark 2". */ 
   | 
||
| 
         paction = action_by_number(ACTION_TRANSPORT_EMBARK2); 
   | 
||
| 
       } else if (!can_unit_survive_at_tile(&(wld.map), punit, ptile) 
   | 
||
| 
       } else if (!can_unit_survive_at_tile(nmap, punit, ptile) 
   | 
||
| 
                  && ptrans != NULL 
   | 
||
| 
                  && is_action_enabled_unit_on_unit(ACTION_TRANSPORT_EMBARK3, 
   | 
||
| 
                                                    punit, ptrans)) { 
   | 
||
| 
         /* "Transport Embark 3". */ 
   | 
||
| 
         paction = action_by_number(ACTION_TRANSPORT_EMBARK3); 
   | 
||
| 
       } else if (!can_unit_survive_at_tile(&(wld.map), punit, ptile) 
   | 
||
| 
       } else if (!can_unit_survive_at_tile(nmap, punit, ptile) 
   | 
||
| 
                  && ptrans != NULL 
   | 
||
| 
                  && is_action_enabled_unit_on_unit(ACTION_TRANSPORT_EMBARK4, 
   | 
||
| 
                                                    punit, ptrans)) { 
   | 
||
| ... | ... | |
| 
       if (action_has_result(paction, ACTRES_UNIT_MOVE) 
   | 
||
| 
           || action_has_result(paction, ACTRES_TRANSPORT_DISEMBARK)) { 
   | 
||
| 
         /* The unit will have to move it self rather than being moved. */ 
   | 
||
| 
         int mcost = map_move_cost_unit(&(wld.map), punit, ptile); 
   | 
||
| 
         int mcost = map_move_cost_unit(nmap, punit, ptile); 
   | 
||
| 
         if (paction) { 
   | 
||
| 
           struct tile *from_tile; 
   | 
||
| ai/default/daiunit.c | ||
|---|---|---|
| 
     { 
   | 
||
| 
       bool alive = TRUE; 
   | 
||
| 
       struct unit_ai *unit_data = def_ai_unit_data(punit, ait); 
   | 
||
| 
       const struct civ_map *nmap = &(wld.map); 
   | 
||
| 
       fc_assert_ret(NULL != dest_city); 
   | 
||
| ... | ... | |
| 
         if (unit_transported(punit)) { 
   | 
||
| 
           aiferry_clear_boat(ait, punit); 
   | 
||
| 
         } 
   | 
||
| 
         if (help_wonder && is_action_enabled_unit_on_city(ACTION_HELP_WONDER, 
   | 
||
| 
         if (help_wonder && is_action_enabled_unit_on_city(nmap, ACTION_HELP_WONDER, 
   | 
||
| 
                                                           punit, dest_city)) { 
   | 
||
| 
             /* 
   | 
||
| 
              * We really don't want to just drop all caravans in immediately. 
   | 
||
| ... | ... | |
| 
                    city_name_get(dest_city)); 
   | 
||
| 
           unit_do_action(pplayer, punit->id, dest_city->id, 
   | 
||
| 
                          0, "", ACTION_HELP_WONDER); 
   | 
||
| 
         } else if (is_action_enabled_unit_on_city(ACTION_TRADE_ROUTE, 
   | 
||
| 
         } else if (is_action_enabled_unit_on_city(nmap, ACTION_TRADE_ROUTE, 
   | 
||
| 
                                                   punit, dest_city)) { 
   | 
||
| 
           log_base(LOG_CARAVAN, "%s %s[%d](%d,%d) creates trade route in %s", 
   | 
||
| 
                    nation_rule_name(nation_of_unit(punit)), 
   | 
||
| ... | ... | |
| 
                    city_name_get(dest_city)); 
   | 
||
| 
           unit_do_action(pplayer, punit->id, dest_city->id, 
   | 
||
| 
                          0, "", ACTION_TRADE_ROUTE); 
   | 
||
| 
         } else if (is_action_enabled_unit_on_city(ACTION_MARKETPLACE, 
   | 
||
| 
         } else if (is_action_enabled_unit_on_city(nmap, ACTION_MARKETPLACE, 
   | 
||
| 
                                                   punit, dest_city)) { 
   | 
||
| 
           /* Get the one time bonus. */ 
   | 
||
| 
           log_base(LOG_CARAVAN, "%s %s[%d](%d,%d) enters marketplace of %s", 
   | 
||
| ... | ... | |
| 
       bool required_boat = FALSE; 
   | 
||
| 
       bool request_boat = FALSE; 
   | 
||
| 
       bool tired_of_waiting_boat = FALSE; 
   | 
||
| 
       const struct civ_map *nmap = &(wld.map); 
   | 
||
| 
       CHECK_UNIT(punit); 
   | 
||
| ... | ... | |
| 
                 && !city_production_gets_caravan_shields(&city_dest->production)) 
   | 
||
| 
             || (unit_data->task == AIUNIT_TRADE 
   | 
||
| 
                 && real_map_distance(city_dest->tile, unit_tile(punit)) <= 1 
   | 
||
| 
                 && !(is_action_enabled_unit_on_city(ACTION_TRADE_ROUTE, 
   | 
||
| 
                 && !(is_action_enabled_unit_on_city(nmap, ACTION_TRADE_ROUTE, 
   | 
||
| 
                                                     punit, city_dest) 
   | 
||
| 
                      || is_action_enabled_unit_on_city(ACTION_MARKETPLACE, 
   | 
||
| 
                      || is_action_enabled_unit_on_city(nmap, ACTION_MARKETPLACE, 
   | 
||
| 
                                                        punit, city_dest))) 
   | 
||
| 
             || (unit_data->task == AIUNIT_WONDER 
   | 
||
| 
                 && real_map_distance(city_dest->tile, unit_tile(punit)) <= 1 
   | 
||
| 
                 && !is_action_enabled_unit_on_city(ACTION_HELP_WONDER, 
   | 
||
| 
                 && !is_action_enabled_unit_on_city(nmap, ACTION_HELP_WONDER, 
   | 
||
| 
                                                    punit, city_dest))) { 
   | 
||
| 
           /* destination invalid! */ 
   | 
||
| 
           dai_unit_new_task(ait, punit, AIUNIT_NONE, NULL); 
   | 
||
| common/actions.c | ||
|---|---|---|
| 
       const struct city *target_city 
   | 
||
| 
           = blocked_find_target_city(act, actor_unit, target_tile, 
   | 
||
| 
                                      target_city_arg, target_unit); 
   | 
||
| 
       const struct civ_map *nmap = &(wld.map); 
   | 
||
| 
       action_iterate(blocker_id) { 
   | 
||
| 
         struct action *blocker = action_by_number(blocker_id); 
   | 
||
| ... | ... | |
| 
             /* Can't be enabled. No target. */ 
   | 
||
| 
             continue; 
   | 
||
| 
           } 
   | 
||
| 
           if (is_action_enabled_unit_on_city(blocker->id, 
   | 
||
| 
           if (is_action_enabled_unit_on_city(nmap, blocker->id, 
   | 
||
| 
                                              actor_unit, target_city)) { 
   | 
||
| 
             return blocker; 
   | 
||
| 
           } 
   | 
||
| ... | ... | |
| 
       See note in is_action_enabled() for why the action may still be disabled. 
   | 
||
| 
     **************************************************************************/ 
   | 
||
| 
     bool is_action_enabled_unit_on_city(const action_id wanted_action, 
   | 
||
| 
     bool is_action_enabled_unit_on_city(const struct civ_map *nmap, 
   | 
||
| 
                                         const action_id wanted_action, 
   | 
||
| 
                                         const struct unit *actor_unit, 
   | 
||
| 
                                         const struct city *target_city) 
   | 
||
| 
     { 
   | 
||
| 
       const struct civ_map *nmap = &(wld.map); 
   | 
||
| 
       return is_action_enabled_unit_on_city_full(nmap, wanted_action, actor_unit, 
   | 
||
| 
                                                  unit_home(actor_unit), 
   | 
||
| 
                                                  unit_tile(actor_unit), 
   | 
||
| common/actions.h | ||
|---|---|---|
| 
                                         const struct city *target_city, 
   | 
||
| 
                                         const struct unit *target_unit); 
   | 
||
| 
     bool is_action_enabled_unit_on_city(const action_id wanted_action, 
   | 
||
| 
     bool is_action_enabled_unit_on_city(const struct civ_map *nmap, 
   | 
||
| 
                                         const action_id wanted_action, 
   | 
||
| 
                                         const struct unit *actor_unit, 
   | 
||
| 
                                         const struct city *target_city); 
   | 
||
| common/unit.c | ||
|---|---|---|
| 
     bool unit_can_airlift_to(const struct unit *punit, 
   | 
||
| 
                              const struct city *pdest_city) 
   | 
||
| 
     { 
   | 
||
| 
       const struct civ_map *nmap = &(wld.map); 
   | 
||
| 
       fc_assert_ret_val(pdest_city, FALSE); 
   | 
||
| 
       if (is_server()) { 
   | 
||
| 
         return is_action_enabled_unit_on_city(ACTION_AIRLIFT, 
   | 
||
| 
         return is_action_enabled_unit_on_city(nmap, ACTION_AIRLIFT, 
   | 
||
| 
                                               punit, pdest_city); 
   | 
||
| 
       } else { 
   | 
||
| 
         return action_prob_possible(action_prob_vs_city(punit, ACTION_AIRLIFT, 
   | 
||
| server/actiontools.c | ||
|---|---|---|
| 
       const struct city *tgt_city; 
   | 
||
| 
       const struct tile *tgt_tile; 
   | 
||
| 
       const struct unit *tgt_unit; 
   | 
||
| 
       const struct civ_map *nmap = &(wld.map); 
   | 
||
| 
       const struct action_auto_perf *autoperf 
   | 
||
| 
         = action_auto_perf_unit_sel(cause, actor, other_player, 
   | 
||
| ... | ... | |
| 
             break; 
   | 
||
| 
           case ATK_CITY: 
   | 
||
| 
             if (tgt_city 
   | 
||
| 
                 && is_action_enabled_unit_on_city(act, actor, tgt_city)) { 
   | 
||
| 
                 && is_action_enabled_unit_on_city(nmap, act, actor, tgt_city)) { 
   | 
||
| 
               perform_action_to(act, actor, tgt_city->id, EXTRA_NONE) 
   | 
||
| 
             } 
   | 
||
| 
             break; 
   | 
||
| ... | ... | |
| 
       const struct city *tgt_city; 
   | 
||
| 
       const struct tile *tgt_tile; 
   | 
||
| 
       const struct unit *tgt_unit; 
   | 
||
| 
       const struct civ_map *nmap = &(wld.map); 
   | 
||
| 
       const struct action_auto_perf *autoperf 
   | 
||
| 
         = action_auto_perf_unit_sel(cause, actor, other_player, 
   | 
||
| ... | ... | |
| 
             break; 
   | 
||
| 
           case ATK_CITY: 
   | 
||
| 
             if (tgt_city 
   | 
||
| 
                 && is_action_enabled_unit_on_city(act, actor, tgt_city)) { 
   | 
||
| 
                 && is_action_enabled_unit_on_city(nmap, act, actor, tgt_city)) { 
   | 
||
| 
               current = action_prob_vs_city(actor, act, tgt_city); 
   | 
||
| 
             } 
   | 
||
| 
             break; 
   | 
||
| server/scripting/api_server_edit.c | ||
|---|---|---|
| 
       fc_assert_ret_val(action_get_actor_kind(paction) == AAK_UNIT, FALSE); 
   | 
||
| 
       fc_assert_ret_val(action_get_target_kind(paction) == ATK_CITY, FALSE); 
   | 
||
| 
       fc_assert_ret_val(!action_has_result(paction, ACTRES_FOUND_CITY), FALSE); 
   | 
||
| 
       if (is_action_enabled_unit_on_city(paction->id, punit, tgt)) { 
   | 
||
| 
       if (is_action_enabled_unit_on_city(&(wld.map), paction->id, punit, tgt)) { 
   | 
||
| 
         return unit_perform_action(unit_owner(punit), punit->id, 
   | 
||
| 
                                    tgt->id, IDENTITY_NUMBER_ZERO, "", 
   | 
||
| 
                                    paction->id, ACT_REQ_RULES); 
   | 
||
| ... | ... | |
| 
       fc_assert_ret_val(action_get_actor_kind(paction) == AAK_UNIT, FALSE); 
   | 
||
| 
       fc_assert_ret_val(action_get_target_kind(paction) == ATK_CITY, FALSE); 
   | 
||
| 
       fc_assert_ret_val(!action_has_result(paction, ACTRES_FOUND_CITY), FALSE); 
   | 
||
| 
       if (is_action_enabled_unit_on_city(paction->id, punit, tgt)) { 
   | 
||
| 
       if (is_action_enabled_unit_on_city(&(wld.map), paction->id, punit, tgt)) { 
   | 
||
| 
         return unit_perform_action(unit_owner(punit), punit->id, 
   | 
||
| 
                                    tgt->id, sub_tgt->item_number, "", 
   | 
||
| 
                                    paction->id, ACT_REQ_RULES); 
   | 
||
| ... | ... | |
| 
       fc_assert_ret_val(action_get_actor_kind(paction) == AAK_UNIT, FALSE); 
   | 
||
| 
       fc_assert_ret_val(action_get_target_kind(paction) == ATK_CITY, FALSE); 
   | 
||
| 
       fc_assert_ret_val(!action_has_result(paction, ACTRES_FOUND_CITY), FALSE); 
   | 
||
| 
       if (is_action_enabled_unit_on_city(paction->id, punit, tgt)) { 
   | 
||
| 
       if (is_action_enabled_unit_on_city(&(wld.map), paction->id, punit, tgt)) { 
   | 
||
| 
         return unit_perform_action(unit_owner(punit), punit->id, 
   | 
||
| 
                                    tgt->id, sub_tgt->item_number, "", 
   | 
||
| 
                                    paction->id, ACT_REQ_RULES); 
   | 
||
| server/unithand.c | ||
|---|---|---|
| 
       struct unit_type *from_unittype = utype_by_number(uti); 
   | 
||
| 
       int number_of_upgraded_units = 0; 
   | 
||
| 
       struct action *paction = action_by_number(ACTION_UPGRADE_UNIT); 
   | 
||
| 
       const struct civ_map *nmap = &(wld.map); 
   | 
||
| 
       if (NULL == from_unittype) { 
   | 
||
| 
         /* Probably died or bribed. */ 
   | 
||
| ... | ... | |
| 
         if (unit_type_get(punit) == from_unittype) { 
   | 
||
| 
           struct city *pcity = tile_city(unit_tile(punit)); 
   | 
||
| 
           if (is_action_enabled_unit_on_city(paction->id, punit, pcity) 
   | 
||
| 
           if (is_action_enabled_unit_on_city(nmap, paction->id, punit, pcity) 
   | 
||
| 
               && unit_perform_action(pplayer, punit->id, pcity->id, 0, "", 
   | 
||
| 
                                      paction->id, ACT_REQ_SS_AGENT)) { 
   | 
||
| 
             number_of_upgraded_units++; 
   | 
||
| ... | ... | |
| 
       struct action *paction = action_by_number(action_type); 
   | 
||
| 
       struct unit *punit = game_unit_by_number(target_id); 
   | 
||
| 
       struct city *pcity = game_city_by_number(target_id); 
   | 
||
| 
       const struct civ_map *nmap = &(wld.map); 
   | 
||
| 
       if (NULL == paction) { 
   | 
||
| 
         /* Non existing action */ 
   | 
||
| ... | ... | |
| 
         break; 
   | 
||
| 
       case ACTRES_SPY_INCITE_CITY: 
   | 
||
| 
         if (pcity 
   | 
||
| 
             && is_action_enabled_unit_on_city(action_type, 
   | 
||
| 
             && is_action_enabled_unit_on_city(nmap, action_type, 
   | 
||
| 
                                               pactor, pcity)) { 
   | 
||
| 
           dsend_packet_unit_action_answer(pc, 
   | 
||
| 
                                           actor_id, target_id, 
   | 
||
| ... | ... | |
| 
         break; 
   | 
||
| 
       case ACTRES_UPGRADE_UNIT: 
   | 
||
| 
         if (pcity 
   | 
||
| 
             && is_action_enabled_unit_on_city(action_type, 
   | 
||
| 
             && is_action_enabled_unit_on_city(nmap, action_type, 
   | 
||
| 
                                               pactor, pcity)) { 
   | 
||
| 
           const struct unit_type *tgt_utype; 
   | 
||
| 
           int upgr_cost; 
   | 
||
| ... | ... | |
| 
       case ACTRES_SPY_TARGETED_SABOTAGE_CITY: 
   | 
||
| 
       case ACTRES_STRIKE_BUILDING: 
   | 
||
| 
         if (pcity 
   | 
||
| 
             && is_action_enabled_unit_on_city(action_type, 
   | 
||
| 
             && is_action_enabled_unit_on_city(nmap, action_type, 
   | 
||
| 
                                               pactor, pcity)) { 
   | 
||
| 
           spy_send_sabotage_list(pc, pactor, pcity, 
   | 
||
| 
                                  action_by_number(action_type), request_kind); 
   | 
||
| ... | ... | |
| 
       struct impr_type *sub_tgt_impr; 
   | 
||
| 
       struct unit *punit = NULL; 
   | 
||
| 
       struct city *pcity = NULL; 
   | 
||
| 
       const struct civ_map *nmap = &(wld.map); 
   | 
||
| 
       if (!action_id_exists(action_type)) { 
   | 
||
| 
         /* Non existing action */ 
   | 
||
| ... | ... | |
| 
     #define ACTION_PERFORM_UNIT_CITY(action, actor, target, action_performer) \ 
   | 
||
| 
       if (pcity                                                               \ 
   | 
||
| 
           && is_action_enabled_unit_on_city(action_type,                      \ 
   | 
||
| 
                                            actor_unit, pcity)) {              \ 
   | 
||
| 
           && is_action_enabled_unit_on_city(nmap, action_type,                \ 
   | 
||
| 
                                             actor_unit, pcity)) {             \ 
   | 
||
| 
         bool success;                                                         \ 
   | 
||
| 
         script_server_signal_emit("action_started_unit_city",                 \ 
   | 
||
| 
                                   action_by_number(action), actor, target);   \ 
   | 
||