Feature #1638 ยป 0063-unittools.-ch-Improve-coding-style.patch
| server/unittools.c | ||
|---|---|---|
|
/* Tools for controlling the client vision of every unit when a unit
|
||
|
* moves + script effects. See unit_move(). You can access this data with
|
||
|
* punit->server.moving; it may be NULL if the unit is not moving). */
|
||
|
* punit->server.moving; it may be nullptr if the unit is not moving). */
|
||
|
struct unit_move_data {
|
||
|
int ref_count;
|
||
|
struct unit *punit; /* NULL for invalidating. */
|
||
|
struct unit *punit; /* nullptr for invalidating. */
|
||
|
struct player *powner;
|
||
|
bv_player can_see_unit;
|
||
|
bv_player can_see_move;
|
||
| ... | ... | |
|
TYPED_LIST_ITERATE(struct autoattack_prob, autoattack_prob_list, _aap_) \
|
||
|
struct unit *_unit_ = game_unit_by_number(_aap_->unit_id); \
|
||
|
\
|
||
|
if (_unit_ == NULL) { \
|
||
|
if (_unit_ == nullptr) { \
|
||
|
continue; \
|
||
|
}
|
||
| ... | ... | |
|
} players_iterate_end;
|
||
|
if (players > minplayers) {
|
||
|
which[num++] = iunit;
|
||
|
which[num++] = iunit;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
int chance;
|
||
|
const struct civ_map *nmap = &(wld.map);
|
||
|
fc_assert_ret_val(punit != NULL, FALSE);
|
||
|
fc_assert_ret_val(punit != nullptr, FALSE);
|
||
|
vsystem = utype_veteran_system(unit_type_get(punit));
|
||
|
fc_assert_ret_val(vsystem != NULL, FALSE);
|
||
|
fc_assert_ret_val(vsystem != nullptr, FALSE);
|
||
|
fc_assert_ret_val(vsystem->levels > punit->veteran, FALSE);
|
||
|
vlevel = vsystem_veteran_level(vsystem, punit->veteran);
|
||
|
fc_assert_ret_val(vlevel != NULL, FALSE);
|
||
|
fc_assert_ret_val(vlevel != nullptr, FALSE);
|
||
|
if (punit->veteran + 1 >= vsystem->levels
|
||
|
|| !is_action_enabled_unit_on_self(nmap, ACTION_GAIN_VETERANCY, punit)) {
|
||
| ... | ... | |
|
*att_hp = attacker->hp;
|
||
|
*def_hp = defender->hp;
|
||
|
get_modified_firepower(nmap, attacker, defender,
|
||
|
&attack_firepower, &defense_firepower);
|
||
|
&attack_firepower, &defense_firepower);
|
||
|
log_verbose("attack:%d, defense:%d, attack firepower:%d, "
|
||
|
"defense firepower:%d", attackpower, defensepower,
|
||
| ... | ... | |
|
*def_vet = 100 * att_strength * 2 / (att_strength + def_strength);
|
||
|
if (attackpower == 0) {
|
||
|
*att_hp = 0;
|
||
|
*att_hp = 0;
|
||
|
} else if (defensepower == 0) {
|
||
|
*def_hp = 0;
|
||
|
}
|
||
| ... | ... | |
|
/* We have to be careful not to strand units at sea, for example by
|
||
|
* upgrading a frigate to an ironclad while it was carrying a unit. */
|
||
|
if (UU_OK == unit_upgrade_test(&(wld.map), punit, TRUE)) {
|
||
|
unit_list_prepend(candidates, punit); /* Potential candidate :) */
|
||
|
unit_list_prepend(candidates, punit); /* Potential candidate :) */
|
||
|
}
|
||
|
} unit_list_iterate_end;
|
||
| ... | ... | |
|
unit_tile_link(punit));
|
||
|
}
|
||
|
wipe_unit(punit, ULR_HP_LOSS, NULL);
|
||
|
wipe_unit(punit, ULR_HP_LOSS, nullptr);
|
||
|
continue; /* Continue iterating... */
|
||
|
}
|
||
| ... | ... | |
|
if (alive) {
|
||
|
/* Clear activity. Unit info will be sent in the end of
|
||
|
* the function. */
|
||
|
* the function. */
|
||
|
unit_activity_handling(punit, ACTIVITY_IDLE, ACTION_NONE);
|
||
|
adv_unit_new_task(punit, AUT_NONE, NULL);
|
||
|
punit->goto_tile = NULL;
|
||
|
adv_unit_new_task(punit, AUT_NONE, nullptr);
|
||
|
punit->goto_tile = nullptr;
|
||
|
if (!is_unit_being_refueled(punit)) {
|
||
|
carrier = transporter_for_unit(punit);
|
||
| ... | ... | |
|
E_UNIT_ORDERS, ftc_server,
|
||
|
_("Your %s has returned to refuel."),
|
||
|
unit_link(punit));
|
||
|
}
|
||
|
}
|
||
|
pf_path_destroy(path);
|
||
|
break;
|
||
|
}
|
||
| ... | ... | |
|
if (!alive) {
|
||
|
/* Unit died trying to move to refuel point. */
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
/* 6) Automatically refuel air units in cities, airbases, and
|
||
|
* transporters (carriers). */
|
||
|
if (is_unit_being_refueled(punit)) {
|
||
|
punit->fuel = utype_fuel(unit_type_get(punit));
|
||
|
punit->fuel = utype_fuel(unit_type_get(punit));
|
||
|
}
|
||
|
}
|
||
|
} unit_list_iterate_safe_end;
|
||
| ... | ... | |
|
if (punit->fuel <= 0 && utype_fuel(utype)) {
|
||
|
/* Notifications sent from the lua script when unit wiped. */
|
||
|
wipe_unit(punit, ULR_FUEL, NULL);
|
||
|
}
|
||
|
wipe_unit(punit, ULR_FUEL, nullptr);
|
||
|
}
|
||
|
} unit_list_iterate_safe_end;
|
||
|
/* Send all updates. */
|
||
|
unit_list_iterate(pplayer->units, punit) {
|
||
|
send_unit_info(NULL, punit);
|
||
|
send_unit_info(nullptr, punit);
|
||
|
} unit_list_iterate_end;
|
||
|
}
|
||
| ... | ... | |
|
punit->moved = FALSE;
|
||
|
punit->paradropped = FALSE;
|
||
|
}
|
||
|
|
||
|
/**********************************************************************//**
|
||
|
Move points are trivial, only modifiers to the base value is if it's
|
||
|
sea units and the player has certain wonders/techs. Then add veteran
|
||
| ... | ... | |
|
punit->changed_from = punit->activity;
|
||
|
punit->changed_from_target = punit->activity_target;
|
||
|
punit->changed_from_count = punit->activity_count;
|
||
|
send_unit_info(NULL, punit);
|
||
|
send_unit_info(nullptr, punit);
|
||
|
} unit_list_iterate_end;
|
||
|
}
|
||
| ... | ... | |
|
}
|
||
|
vsystem = utype_veteran_system(unit_type_get(punit));
|
||
|
fc_assert_ret(vsystem != NULL);
|
||
|
fc_assert_ret(vsystem != nullptr);
|
||
|
fc_assert_ret(vsystem->levels > punit->veteran);
|
||
|
vlevel = vsystem_veteran_level(vsystem, punit->veteran);
|
||
|
fc_assert_ret(vlevel != NULL);
|
||
|
fc_assert_ret(vlevel != nullptr);
|
||
|
notify_player(unit_owner(punit), unit_tile(punit),
|
||
|
E_UNIT_BECAME_VET, ftc_server,
|
||
| ... | ... | |
|
}
|
||
|
set_unit_activity(punit, ACTIVITY_IDLE, ACTION_NONE);
|
||
|
send_unit_info(NULL, punit);
|
||
|
send_unit_info(nullptr, punit);
|
||
|
}
|
||
|
/**********************************************************************//**
|
||
| ... | ... | |
|
{
|
||
|
struct extra_type *pextra;
|
||
|
if (punit->activity_target == NULL) {
|
||
|
if (punit->activity_target == nullptr) {
|
||
|
pextra = prev_extra_in_tile(ptile, ERM_CLEAN,
|
||
|
NULL, punit);
|
||
|
if (pextra != NULL) {
|
||
|
nullptr, punit);
|
||
|
if (pextra != nullptr) {
|
||
|
punit->activity_target = pextra;
|
||
|
}
|
||
|
} else {
|
||
|
if (is_extra_removed_by(punit->activity_target, ERM_CLEAN)) {
|
||
|
pextra = punit->activity_target;
|
||
|
} else {
|
||
|
pextra = NULL;
|
||
|
pextra = nullptr;
|
||
|
}
|
||
|
}
|
||
|
if (pextra != NULL) {
|
||
|
if (pextra != nullptr) {
|
||
|
if (total_activity_done(ptile, ACTIVITY_CLEAN, pextra)) {
|
||
|
destroy_extra(ptile, pextra);
|
||
|
unit_activity_done = TRUE;
|
||
| ... | ... | |
|
continue;
|
||
|
}
|
||
|
if (NULL != tile_city(ptile)) {
|
||
|
if (tile_city(ptile) != nullptr) {
|
||
|
continue;
|
||
|
}
|
||
| ... | ... | |
|
}
|
||
|
/* City may not have changed hands yet; see place_partisans(). */
|
||
|
value = get_virtual_defense_power(nmap, NULL, u_type, powner,
|
||
|
value = get_virtual_defense_power(nmap, nullptr, u_type, powner,
|
||
|
ptile, FALSE, 0);
|
||
|
value *= 10;
|
||
| ... | ... | |
|
void place_partisans(struct tile *pcenter, struct player *powner,
|
||
|
int count, int sq_radius)
|
||
|
{
|
||
|
struct tile *ptile = NULL;
|
||
|
struct tile *ptile = nullptr;
|
||
|
struct unit_type *u_type = get_role_unit(L_PARTISAN, 0);
|
||
|
const struct civ_map *nmap = &(wld.map);
|
||
| ... | ... | |
|
punit->action = action;
|
||
|
}
|
||
|
(void) place_unit(punit, powner, NULL, NULL, FALSE);
|
||
|
(void) place_unit(punit, powner, nullptr, nullptr, FALSE);
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
move_cost = punit->moves_left;
|
||
|
}
|
||
|
unit_move(punit, dst_tile, move_cost,
|
||
|
NULL, FALSE, FALSE, FALSE, FALSE, FALSE);
|
||
|
nullptr, FALSE, FALSE, FALSE, FALSE, FALSE);
|
||
|
return TRUE;
|
||
|
}
|
||
| ... | ... | |
|
unit_link(punit));
|
||
|
}
|
||
|
/* TODO: should a unit be able to bounce to a transport like is done
|
||
|
/* TODO: Should a unit be able to bounce to a transport like is done
|
||
|
* below? What if the unit can't legally enter the transport, say
|
||
|
* because the transport is Unreachable and the unit doesn't have it in
|
||
|
* its embarks field or because "Transport Embark" isn't enabled? Kept
|
||
|
* like it was to preserve the old rules for now. -- Sveinung */
|
||
|
unit_move(punit, ptile, 0, NULL, TRUE, FALSE, FALSE, FALSE, FALSE);
|
||
|
unit_move(punit, ptile, 0, nullptr, TRUE, FALSE, FALSE, FALSE, FALSE);
|
||
|
return;
|
||
|
}
|
||
| ... | ... | |
|
unit_tile_link(punit));
|
||
|
}
|
||
|
wipe_unit(punit, ULR_STACK_CONFLICT, NULL);
|
||
|
wipe_unit(punit, ULR_STACK_CONFLICT, nullptr);
|
||
|
}
|
||
|
/**********************************************************************//**
|
||
| ... | ... | |
|
unit_list_iterate(pplayer->units, punit) {
|
||
|
ptile = unit_tile(punit);
|
||
|
pcity = tile_city(ptile);
|
||
|
if (NULL != pcity
|
||
|
if (pcity != nullptr
|
||
|
&& !pplayers_allied(city_owner(pcity), pplayer)
|
||
|
&& 0 < get_transporter_occupancy(punit)) {
|
||
|
pcargo_units = unit_transport_cargo(punit);
|
||
| ... | ... | |
|
unit_list_iterate_safe(pplayer->units, punit) {
|
||
|
ptile = unit_tile(punit);
|
||
|
pcity = tile_city(ptile);
|
||
|
if (NULL != pcity
|
||
|
if (pcity != nullptr
|
||
|
&& !pplayers_allied(city_owner(pcity), pplayer)) {
|
||
|
ptrans = unit_transport_get(punit);
|
||
|
if (NULL == ptrans || pplayer != unit_owner(ptrans)) {
|
||
|
if (ptrans == nullptr || pplayer != unit_owner(ptrans)) {
|
||
|
bounce_unit(punit, verbose);
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
unit_list_iterate(pplayer->units, punit) {
|
||
|
ptile = unit_tile(punit);
|
||
|
pcity = tile_city(ptile);
|
||
|
fc_assert_msg(NULL == pcity
|
||
|
fc_assert_msg(pcity == nullptr
|
||
|
|| pplayers_allied(city_owner(pcity), pplayer),
|
||
|
"Failed to throw %s %d from %s %d (%d, %d)",
|
||
|
unit_rule_name(punit),
|
||
| ... | ... | |
|
{
|
||
|
throw_units_from_illegal_cities(pplayer, verbose);
|
||
|
throw_units_from_illegal_cities(aplayer, verbose);
|
||
|
|
||
|
resolve_stack_conflicts(pplayer, aplayer, verbose);
|
||
|
resolve_stack_conflicts(aplayer, pplayer, verbose);
|
||
|
}
|
||
| ... | ... | |
|
}
|
||
|
pclass = utype_class(utype);
|
||
|
if (NULL != pclass->cache.refuel_extras) {
|
||
|
if (pclass->cache.refuel_extras != nullptr) {
|
||
|
const struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
|
||
|
extra_type_list_iterate(pclass->cache.refuel_extras, pextra) {
|
||
| ... | ... | |
|
CALL_PLR_AI_FUNC(unit_transformed, pplayer, punit, old_type);
|
||
|
CALL_FUNC_EACH_AI(unit_info, punit);
|
||
|
send_unit_info(NULL, punit);
|
||
|
send_unit_info(nullptr, punit);
|
||
|
conn_list_do_unbuffer(pplayer->connections);
|
||
|
}
|
||
|
/**********************************************************************//**
|
||
|
Wrapper of the below
|
||
|
**************************************************************************/
|
||
|
struct unit *create_unit(struct player *pplayer, struct tile *ptile,
|
||
|
const struct unit_type *type, int veteran_level,
|
||
|
struct unit *create_unit(struct player *pplayer, struct tile *ptile,
|
||
|
const struct unit_type *type, int veteran_level,
|
||
|
int homecity_id, int moves_left)
|
||
|
{
|
||
|
return create_unit_full(pplayer, ptile, type, veteran_level, homecity_id,
|
||
|
moves_left, -1, NULL);
|
||
|
return create_unit_full(pplayer, ptile, type, veteran_level, homecity_id,
|
||
|
moves_left, -1, nullptr);
|
||
|
}
|
||
|
/**********************************************************************//**
|
||
| ... | ... | |
|
if (punit->homecity != 0) {
|
||
|
struct city *home = game_city_by_number(punit->homecity);
|
||
|
if (home != NULL && game.info.goods_selection == GSM_LEAVING) {
|
||
|
if (home != nullptr && game.info.goods_selection == GSM_LEAVING) {
|
||
|
punit->carrying = goods_from_city_to_unit(home, punit);
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
See unit_virtual_prepare() for the processing of moves_left and hp_left
|
||
|
**************************************************************************/
|
||
|
struct unit *create_unit_full(struct player *pplayer, struct tile *ptile,
|
||
|
const struct unit_type *type, int veteran_level,
|
||
|
const struct unit_type *type, int veteran_level,
|
||
|
int homecity_id, int moves_left, int hp_left,
|
||
|
struct unit *ptrans)
|
||
|
{
|
||
| ... | ... | |
|
= unit_virtual_prepare(pplayer, ptile, type, veteran_level,
|
||
|
homecity_id, moves_left, hp_left);
|
||
|
struct city *pcity = (!homecity_id || utype_has_flag(type, UTYF_NOHOME))
|
||
|
? NULL : game_city_by_number(homecity_id);
|
||
|
? nullptr : game_city_by_number(homecity_id);
|
||
|
bool could_place;
|
||
|
fc_assert_ret_val(punit, NULL);
|
||
|
fc_assert_ret_val(punit, nullptr);
|
||
|
could_place = place_unit(punit, pplayer, pcity, ptrans, FALSE);
|
||
|
fc_assert(could_place);
|
||
|
if (!could_place) {
|
||
|
unit_virtual_destroy(punit);
|
||
|
punit = NULL;
|
||
|
punit = nullptr;
|
||
|
}
|
||
|
return punit;
|
||
| ... | ... | |
|
{
|
||
|
struct unit *punit;
|
||
|
fc_assert_ret_val(ptile != NULL, NULL);
|
||
|
punit = unit_virtual_create(pplayer, NULL, type, veteran_level);
|
||
|
fc_assert_ret_val(ptile != nullptr, nullptr);
|
||
|
punit = unit_virtual_create(pplayer, nullptr, type, veteran_level);
|
||
|
unit_tile_set(punit, ptile);
|
||
|
if (utype_has_flag(type, UTYF_NOHOME)) {
|
||
|
punit->homecity = 0; /* none */
|
||
|
punit->homecity = 0; /* None */
|
||
|
} else {
|
||
|
punit->homecity = homecity_id;
|
||
|
}
|
||
| ... | ... | |
|
on the right lists and dispatching the information around.
|
||
|
The unit must have a tile, pcity and pplayer must be valid
|
||
|
and accord to the unit's fields (basically, set by unit_virtual_prepare()).
|
||
|
ptrans if not NULL must be a transporter on the same tile
|
||
|
ptrans, if not nullptr, must be a transporter on the same tile
|
||
|
the unit can freely load into (or just that can transport it if force)
|
||
|
Returns if the unit is placed (must be TRUE if input data are valid)
|
||
|
+**************************************************************************/
|
||
| ... | ... | |
|
unit_get_goods(punit);
|
||
|
send_unit_info(NULL, punit);
|
||
|
send_unit_info(nullptr, punit);
|
||
|
wakeup_neighbor_sentries(punit);
|
||
|
/* The unit may have changed the available tiles in nearby cities. */
|
||
| ... | ... | |
|
/* Tried to overwrite another call back. If this assertion is triggered
|
||
|
* in a case where two call back are needed it may be time to support
|
||
|
* more than one unit removal call back at a time. */
|
||
|
fc_assert_ret(punit->server.removal_callback == NULL);
|
||
|
fc_assert_ret(punit->server.removal_callback == nullptr);
|
||
|
punit->server.removal_callback = callback;
|
||
|
}
|
||
| ... | ... | |
|
**************************************************************************/
|
||
|
void unit_unset_removal_callback(struct unit *punit)
|
||
|
{
|
||
|
punit->server.removal_callback = NULL;
|
||
|
punit->server.removal_callback = nullptr;
|
||
|
}
|
||
|
/**********************************************************************//**
|
||
| ... | ... | |
|
are built, so that no two settlers head towards the same city
|
||
|
spot, we need to ensure this reservation is cleared should
|
||
|
the settler disappear on the way. */
|
||
|
adv_unit_new_task(punit, AUT_NONE, NULL);
|
||
|
adv_unit_new_task(punit, AUT_NONE, nullptr);
|
||
|
/* Clear the vision before sending unit remove. Else, we might duplicate
|
||
|
* the PACKET_UNIT_REMOVE if we lose vision of the unit tile. */
|
||
|
if (punit->server.vision != NULL) {
|
||
|
if (punit->server.vision != nullptr) {
|
||
|
vision_clear_sight(punit->server.vision);
|
||
|
vision_free(punit->server.vision);
|
||
|
punit->server.vision = NULL;
|
||
|
punit->server.vision = nullptr;
|
||
|
}
|
||
|
packet.unit_id = punit->id;
|
||
| ... | ... | |
|
}
|
||
|
} conn_list_iterate_end;
|
||
|
if (punit->server.moving != NULL) {
|
||
|
if (punit->server.moving != nullptr) {
|
||
|
/* Do not care of this unit for running moves. */
|
||
|
punit->server.moving->punit = NULL;
|
||
|
punit->server.moving->punit = nullptr;
|
||
|
}
|
||
|
if (punit->server.removal_callback != NULL) {
|
||
|
if (punit->server.removal_callback != nullptr) {
|
||
|
/* Run the unit removal call back. */
|
||
|
punit->server.removal_callback(punit);
|
||
|
}
|
||
| ... | ... | |
|
script_server_remove_exported_object(punit);
|
||
|
game_remove_unit(&wld, punit);
|
||
|
punit = NULL;
|
||
|
punit = nullptr;
|
||
|
if (NULL != ptrans) {
|
||
|
if (ptrans != nullptr) {
|
||
|
/* Update the occupy info. */
|
||
|
send_unit_info(NULL, ptrans);
|
||
|
send_unit_info(nullptr, ptrans);
|
||
|
}
|
||
|
/* This unit may have blocked tiles of adjacent cities. Update them. */
|
||
| ... | ... | |
|
if (pcity && unit_list_size(ptile->units) == 0) {
|
||
|
/* The last unit in the city was killed: update the occupied flag. */
|
||
|
send_city_info(NULL, pcity);
|
||
|
send_city_info(nullptr, pcity);
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
* about the swimming unit, and we can't remove it if it's not there
|
||
|
* in the first place -> we send it once here just to be sure it's
|
||
|
* there. */
|
||
|
send_unit_info(NULL, pcargo);
|
||
|
send_unit_info(nullptr, pcargo);
|
||
|
wipe_unit_full(pcargo, FALSE, ULR_TRANSPORT_LOST, killer);
|
||
|
}
|
||
| ... | ... | |
|
struct city *pexclcity;
|
||
|
struct civ_map *nmap = &(wld.map);
|
||
|
if (killer != NULL
|
||
|
if (killer != nullptr
|
||
|
&& (game.info.gameloss_style & GAMELOSS_STYLE_LOOT)
|
||
|
&& unit_has_type_flag(punit, UTYF_GAMELOSS)) {
|
||
|
player_loot_player(killer, pplayer);
|
||
| ... | ... | |
|
if (reason == ULR_CITY_LOST) {
|
||
|
pexclcity = unit_home(punit);
|
||
|
} else {
|
||
|
pexclcity = NULL;
|
||
|
pexclcity = nullptr;
|
||
|
}
|
||
|
/* Remove unit itself from its transport */
|
||
|
if (ptrans != NULL) {
|
||
|
if (ptrans != nullptr) {
|
||
|
unit_transport_unload(punit);
|
||
|
send_unit_info(NULL, ptrans);
|
||
|
send_unit_info(nullptr, ptrans);
|
||
|
}
|
||
|
/* First pull all units off of the transporter. */
|
||
| ... | ... | |
|
/* Unit info for unhealthy units will be sent when they are
|
||
|
* assigned new transport or removed. */
|
||
|
if (healthy) {
|
||
|
send_unit_info(NULL, pcargo);
|
||
|
send_unit_info(nullptr, pcargo);
|
||
|
}
|
||
|
} unit_list_iterate_safe_end;
|
||
|
}
|
||
| ... | ... | |
|
case ULR_CAUGHT:
|
||
|
case ULR_ELIMINATED:
|
||
|
case ULR_TRANSPORT_LOST:
|
||
|
if (killer != NULL) {
|
||
|
if (killer != nullptr) {
|
||
|
killer->score.units_killed++;
|
||
|
}
|
||
|
pplayer->score.units_lost++;
|
||
| ... | ... | |
|
/* Helpless units cannot board a transport in their current state. */
|
||
|
if (!helpless
|
||
|
&& ptransport != NULL) {
|
||
|
&& ptransport != nullptr) {
|
||
|
unit_transport_load_tp_status(punit, ptransport, FALSE);
|
||
|
send_unit_info(NULL, punit);
|
||
|
send_unit_info(nullptr, punit);
|
||
|
return TRUE;
|
||
|
} else {
|
||
|
/* Only units that cannot find transport are considered for teleport. */
|
||
| ... | ... | |
|
unit_owner(punit),
|
||
|
FALSE, FALSE, FALSE, TRUE, FALSE,
|
||
|
utype_class(pttype));
|
||
|
if (pcity != NULL) {
|
||
|
if (pcity != nullptr) {
|
||
|
char tplink[MAX_LEN_LINK]; /* In case unit dies when teleported */
|
||
|
sz_strlcpy(tplink, unit_link(punit));
|
||
| ... | ... | |
|
/**********************************************************************//**
|
||
|
We don't really change owner of the unit, but create completely new
|
||
|
unit as its copy. The new pointer to 'punit' is returned.
|
||
|
Always wipes the source unit but sometimes returns NULL or a unit
|
||
|
Always wipes the source unit but sometimes returns nullptr or a unit
|
||
|
of a player other than pplayer.
|
||
|
**************************************************************************/
|
||
|
struct unit *unit_change_owner(struct unit *punit, struct player *pplayer,
|
||
| ... | ... | |
|
placed =
|
||
|
#endif
|
||
|
place_unit(gained_unit, pplayer,
|
||
|
homecity ? game_city_by_number(homecity) : NULL,
|
||
|
NULL, FALSE);
|
||
|
homecity ? game_city_by_number(homecity) : nullptr,
|
||
|
nullptr, FALSE);
|
||
|
fc_assert_action(placed, unit_virtual_destroy(gained_unit); goto uco_wipe);
|
||
| ... | ... | |
|
uco_wipe:
|
||
|
#endif
|
||
|
wipe_unit(punit, reason, NULL);
|
||
|
wipe_unit(punit, reason, nullptr);
|
||
|
if (!unit_is_alive(id)) {
|
||
|
/* Destroyed by a script */
|
||
|
return NULL;
|
||
|
return nullptr;
|
||
|
}
|
||
|
return gained_unit; /* Returns the replacement. */
|
||
| ... | ... | |
|
/* Initialize */
|
||
|
for (i = 0; i < slots; i++) {
|
||
|
num_killed[i] = 0;
|
||
|
other_killed[i] = NULL;
|
||
|
other_killed[i] = nullptr;
|
||
|
num_escaped[i] = 0;
|
||
|
}
|
||
| ... | ... | |
|
&& fc_rand(2)) {
|
||
|
int curr_def_bonus;
|
||
|
int def_bonus = 0;
|
||
|
struct tile *dsttile = NULL;
|
||
|
struct tile *dsttile = nullptr;
|
||
|
int move_cost;
|
||
|
fc_assert(vunit->hp > 0);
|
||
|
adjc_iterate(nmap, deftile, ptile2) {
|
||
|
if (can_exist_at_tile(nmap, vunit->utype, ptile2)
|
||
|
&& NULL == tile_city(ptile2)) {
|
||
|
&& tile_city(ptile2) == nullptr) {
|
||
|
move_cost = map_move_cost_unit(nmap, vunit, ptile2);
|
||
|
if (pkiller->moves_left <= vunit->moves_left - move_cost
|
||
|
&& (is_allied_unit_tile(ptile2, pvictim)
|
||
| ... | ... | |
|
}
|
||
|
} adjc_iterate_end;
|
||
|
if (dsttile != NULL) {
|
||
|
if (dsttile != nullptr) {
|
||
|
escaped = (action_auto_perf_unit_do(AAPC_UNIT_STACK_DEATH,
|
||
|
vunit, tile_owner(dsttile),
|
||
|
NULL, NULL, dsttile,
|
||
|
nullptr, nullptr, dsttile,
|
||
|
tile_city(dsttile),
|
||
|
NULL, NULL)
|
||
|
!= NULL);
|
||
|
nullptr, nullptr)
|
||
|
!= nullptr);
|
||
|
if (escaped) {
|
||
|
num_escaped[player_index(vplayer)]++;
|
||
| ... | ... | |
|
for (i = 0; i < slots; i++) {
|
||
|
if (num_killed[i] == 1) {
|
||
|
if (i == player_index(pvictim)) {
|
||
|
fc_assert(other_killed[i] == NULL);
|
||
|
fc_assert(other_killed[i] == nullptr);
|
||
|
if (flagless_killer) {
|
||
|
notify_player(player_by_number(i), deftile,
|
||
| ... | ... | |
|
/* Remove the units - note the logic of which units actually die
|
||
|
* must be mimiced exactly in at least one place up above. */
|
||
|
punit = NULL; /* Wiped during following iteration so unsafe to use */
|
||
|
punit = nullptr; /* Wiped during following iteration so unsafe to use */
|
||
|
unit_list_iterate_safe(deftile->units, punit2) {
|
||
|
if (pplayers_at_war(pvictor, unit_owner(punit2))
|
||
|
&& is_unit_reachable_at(punit2, pkiller, deftile)) {
|
||
|
&& is_unit_reachable_at(punit2, pkiller, deftile)) {
|
||
|
wipe_unit(punit2, ULR_KILLED, pvictor);
|
||
|
}
|
||
|
} unit_list_iterate_safe_end;
|
||
| ... | ... | |
|
ransom);
|
||
|
pvictor->economic.gold += ransom;
|
||
|
pvictim->economic.gold -= ransom;
|
||
|
send_player_info_c(pvictor, NULL); /* Let me see my new gold :-) */
|
||
|
send_player_info_c(pvictor, nullptr); /* Let me see my new gold :-) */
|
||
|
if (vet) {
|
||
|
notify_unit_experience(pcollector);
|
||
| ... | ... | |
|
packet->activity = punit->activity;
|
||
|
packet->activity_count = punit->activity_count;
|
||
|
if (punit->activity_target != NULL) {
|
||
|
if (punit->activity_target != nullptr) {
|
||
|
packet->activity_tgt = extra_index(punit->activity_target);
|
||
|
} else {
|
||
|
packet->activity_tgt = EXTRA_NONE;
|
||
| ... | ... | |
|
packet->changed_from = punit->changed_from;
|
||
|
packet->changed_from_count = punit->changed_from_count;
|
||
|
if (punit->changed_from_target != NULL) {
|
||
|
if (punit->changed_from_target != nullptr) {
|
||
|
packet->changed_from_tgt = extra_index(punit->changed_from_target);
|
||
|
} else {
|
||
|
packet->changed_from_tgt = EXTRA_NONE;
|
||
| ... | ... | |
|
packet->ssa_controller = punit->ssa_controller;
|
||
|
packet->fuel = punit->fuel;
|
||
|
packet->goto_tile = (NULL != punit->goto_tile
|
||
|
packet->goto_tile = (punit->goto_tile != nullptr
|
||
|
? tile_index(punit->goto_tile) : -1);
|
||
|
packet->paradropped = punit->paradropped;
|
||
|
packet->done_moving = punit->done_moving;
|
||
| ... | ... | |
|
packet->transported = TRUE;
|
||
|
packet->transported_by = unit_transport_get(punit)->id;
|
||
|
}
|
||
|
if (punit->carrying != NULL) {
|
||
|
if (punit->carrying != nullptr) {
|
||
|
packet->carrying = goods_index(punit->carrying);
|
||
|
} else {
|
||
|
packet->carrying = -1;
|
||
| ... | ... | |
|
everything (like the unit's owner's enemies).
|
||
|
**************************************************************************/
|
||
|
void package_short_unit(struct unit *punit,
|
||
|
struct packet_unit_short_info *packet,
|
||
|
struct packet_unit_short_info *packet,
|
||
|
enum unit_info_use packet_use, int info_city_id)
|
||
|
{
|
||
|
packet->packet_use = packet_use;
|
||
| ... | ... | |
|
void unit_goes_out_of_sight(struct player *pplayer, struct unit *punit)
|
||
|
{
|
||
|
dlsend_packet_unit_remove(pplayer->connections, punit->id);
|
||
|
if (punit->server.moving != NULL) {
|
||
|
if (punit->server.moving != nullptr) {
|
||
|
/* Update status of 'pplayer' vision for 'punit'. */
|
||
|
BV_CLR(punit->server.moving->can_see_unit, player_index(pplayer));
|
||
|
}
|
||
| ... | ... | |
|
/**********************************************************************//**
|
||
|
Send the unit to the players who need the info.
|
||
|
dest = NULL means all connections (game.est_connections)
|
||
|
dest = nullptr means all connections (game.est_connections)
|
||
|
**************************************************************************/
|
||
|
void send_unit_info(struct conn_list *dest, struct unit *punit)
|
||
|
{
|
||
| ... | ... | |
|
struct packet_unit_short_info sinfo;
|
||
|
struct unit_move_data *pdata;
|
||
|
if (dest == NULL) {
|
||
|
if (dest == nullptr) {
|
||
|
dest = game.est_connections;
|
||
|
}
|
||
| ... | ... | |
|
conn_list_iterate(dest, pconn) {
|
||
|
struct player *pplayer = conn_get_player(pconn);
|
||
|
/* Be careful to consider all cases where pplayer is NULL... */
|
||
|
if (pplayer == NULL) {
|
||
|
/* Be careful to consider all cases where pplayer is nullptr... */
|
||
|
if (pplayer == nullptr) {
|
||
|
if (pconn->observer) {
|
||
|
send_packet_unit_info(pconn, &info);
|
||
|
}
|
||
|
} else if (pplayer == powner) {
|
||
|
send_packet_unit_info(pconn, &info);
|
||
|
if (pdata != NULL) {
|
||
|
if (pdata != nullptr) {
|
||
|
BV_SET(pdata->can_see_unit, player_index(pplayer));
|
||
|
}
|
||
|
} else if (can_player_see_unit(pplayer, punit)) {
|
||
|
send_packet_unit_short_info(pconn, &sinfo, FALSE);
|
||
|
if (pdata != NULL) {
|
||
|
if (pdata != nullptr) {
|
||
|
BV_SET(pdata->can_see_unit, player_index(pplayer));
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
conn_list_iterate(dest, pconn) {
|
||
|
struct player *pplayer = pconn->playing;
|
||
|
if (NULL == pplayer && !pconn->observer) {
|
||
|
if (pplayer == nullptr && !pconn->observer) {
|
||
|
continue;
|
||
|
}
|
||
| ... | ... | |
|
static void do_nuke_tile(struct player *pplayer, struct tile *ptile,
|
||
|
const struct action *paction)
|
||
|
{
|
||
|
struct city *pcity = NULL;
|
||
|
struct city *pcity = nullptr;
|
||
|
int pop_loss;
|
||
|
pcity = tile_city(ptile);
|
||
| ... | ... | |
|
pop_loss = round((game.info.nuke_pop_loss_pct * city_size_get(pcity)) / 100.0);
|
||
|
if (city_reduce_size(pcity, pop_loss, pplayer, "nuke")) {
|
||
|
/* Send city size reduction to everyone seeing it */
|
||
|
send_city_info(NULL, pcity);
|
||
|
send_city_info(nullptr, pcity);
|
||
|
} else {
|
||
|
/* City was destroyed */
|
||
|
notify_player(owner, ptile, E_CITY_NUKED, ftc_server,
|
||
| ... | ... | |
|
struct extra_type *pextra;
|
||
|
pextra = rand_extra_for_tile(ptile, EC_FALLOUT, FALSE);
|
||
|
if (pextra != NULL && !tile_has_extra(ptile, pextra)) {
|
||
|
if (pextra != nullptr && !tile_has_extra(ptile, pextra)) {
|
||
|
tile_add_extra(ptile, pextra);
|
||
|
update_tile_knowledge(ptile);
|
||
|
}
|
||
| ... | ... | |
|
struct player *pplayer, struct tile *ptile)
|
||
|
{
|
||
|
int nuke_radius_size
|
||
|
= get_target_bonus_effects(NULL,
|
||
|
= get_target_bonus_effects(nullptr,
|
||
|
&(const struct req_context) {
|
||
|
.player = pplayer,
|
||
|
/* City: Wait for users before choosing
|
||
| ... | ... | |
|
.unittype = act_utype,
|
||
|
.action = paction,
|
||
|
},
|
||
|
NULL,
|
||
|
nullptr,
|
||
|
EFT_NUKE_BLAST_RADIUS_1_SQ);
|
||
|
circle_iterate(&(wld.map), ptile, nuke_radius_size, ptile1) {
|
||
| ... | ... | |
|
script_server_signal_emit("nuke_exploded", 2, API_TYPE_TILE, ptile,
|
||
|
API_TYPE_PLAYER, pplayer);
|
||
|
notify_conn(NULL, ptile, E_NUKE, ftc_server,
|
||
|
notify_conn(nullptr, ptile, E_NUKE, ftc_server,
|
||
|
_("The %s detonated a nuke!"),
|
||
|
nation_plural_for_player(pplayer));
|
||
|
}
|
||
| ... | ... | |
|
unit_link(punit));
|
||
|
unit_move(punit, pdest_city->tile, punit->moves_left,
|
||
|
NULL, BV_ISSET(paction->sub_results, ACT_SUB_RES_MAY_EMBARK),
|
||
|
nullptr, BV_ISSET(paction->sub_results, ACT_SUB_RES_MAY_EMBARK),
|
||
|
/* Can only airlift to allied and domestic cities */
|
||
|
FALSE, FALSE,
|
||
|
BV_ISSET(paction->sub_results, ACT_SUB_RES_HUT_ENTER),
|
||
| ... | ... | |
|
break;
|
||
|
}
|
||
|
send_unit_info(NULL, punit); /* Probably duplicate */
|
||
|
send_unit_info(nullptr, punit); /* Probably duplicate */
|
||
|
}
|
||
|
/**********************************************************************//**
|
||
| ... | ... | |
|
/* Only take in account values from player map. */
|
||
|
const struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
|
||
|
if (NULL == plrtile->site) {
|
||
|
if (plrtile->site == nullptr) {
|
||
|
bv_extras fbv;
|
||
|
dbv_to_bv(fbv.vec, &(plrtile->extras));
|
||
| ... | ... | |
|
}
|
||
|
}
|
||
|
if (NULL != plrtile->site
|
||
|
&& plrtile->owner != NULL
|
||
|
if (plrtile->site != nullptr
|
||
|
&& plrtile->owner != nullptr
|
||
|
&& !pplayers_allied(pplayer, plrtile->owner)
|
||
|
&& !action_has_result(paction, ACTRES_PARADROP_CONQUER)) {
|
||
|
notify_player(pplayer, ptile, E_BAD_COMMAND, ftc_server,
|
||
| ... | ... | |
|
return FALSE;
|
||
|
}
|
||
|
if (NULL != plrtile->site
|
||
|
&& plrtile->owner != NULL
|
||
|
if (plrtile->site != nullptr
|
||
|
&& plrtile->owner != nullptr
|
||
|
&& (pplayers_non_attack(pplayer, plrtile->owner)
|
||
|
|| (player_diplstate_get(pplayer, plrtile->owner)->type
|
||
|
== DS_ALLIANCE)
|
||
| ... | ... | |
|
pcity = tile_city(ptile);
|
||
|
if ((pcity != NULL && !pplayers_allied(pplayer, city_owner(pcity))
|
||
|
if ((pcity != nullptr && !pplayers_allied(pplayer, city_owner(pcity))
|
||
|
&& !action_has_result(paction, ACTRES_PARADROP_CONQUER))
|
||
|
|| is_non_allied_unit_tile(ptile, pplayer,
|
||
|
unit_has_type_flag(punit, UTYF_FLAGLESS))) {
|
||
|
struct player *main_victim = NULL;
|
||
|
struct player *secondary_victim = NULL;
|
||
|
struct player *main_victim = nullptr;
|
||
|
struct player *secondary_victim = nullptr;
|
||
|
char victim_link[MAX_LEN_LINK];
|
||
|
map_show_circle(pplayer, ptile, act_utype->vision_radius_sq);
|
||
| ... | ... | |
|
* city owner or owner of the first/random unit get the kill? */
|
||
|
pplayer->score.units_lost++;
|
||
|
if (pcity != NULL) {
|
||
|
if (pcity != nullptr) {
|
||
|
struct player *owner = city_owner(pcity);
|
||
|
if (!pplayers_at_war(pplayer, owner)) {
|
||
| ... | ... | |
|
sz_strlcpy(victim_link, tile_link(ptile));
|
||
|
}
|
||
|
if (main_victim == NULL) {
|
||
|
if (main_victim == nullptr) {
|
||
|
unit_list_iterate(ptile->units, tgt) {
|
||
|
struct player *owner = unit_owner(tgt);
|
||
|
if (!pplayers_at_war(pplayer, owner)) {
|
||
|
main_victim = owner;
|
||
|
break;
|
||
|
} else if (secondary_victim == NULL) {
|
||
|
} else if (secondary_victim == nullptr) {
|
||
|
secondary_victim = owner;
|
||
|
}
|
||
|
} unit_list_iterate_end;
|
||
|
if (main_victim == NULL) {
|
||
|
if (main_victim == nullptr) {
|
||
|
/* There's no victim with whom the attacker isn't in war,
|
||
|
* fallback to one with whom there's already a war. */
|
||
|
main_victim = secondary_victim;
|
||
| ... | ... | |
|
if (unit_move(punit, ptile,
|
||
|
/* Done by Action_Success_Actor_Move_Cost */
|
||
|
0,
|
||
|
NULL, BV_ISSET(paction->sub_results,
|
||
|
ACT_SUB_RES_MAY_EMBARK),
|
||
|
nullptr, BV_ISSET(paction->sub_results,
|
||
|
ACT_SUB_RES_MAY_EMBARK),
|
||
|
paction->result == ACTRES_PARADROP_CONQUER,
|
||
|
paction->result == ACTRES_PARADROP_CONQUER,
|
||
|
BV_ISSET(paction->sub_results, ACT_SUB_RES_HUT_ENTER),
|
||
| ... | ... | |
|
notify_player(pplayer, unit_tile(punit), E_HUT_BARB_KILLED, ftc_server,
|
||
|
_("Your %s has been killed by barbarians!"),
|
||
|
unit_tile_link(punit));
|
||
|
wipe_unit(punit, ULR_BARB_UNLEASH, NULL);
|
||
|
wipe_unit(punit, ULR_BARB_UNLEASH, nullptr);
|
||
|
ok = FALSE;
|
||
|
}
|
||
| ... | ... | |
|
{
|
||
|
bv_player can_see_unit;
|
||
|
fc_assert_ret(punit != NULL);
|
||
|
fc_assert_ret(ptrans != NULL);
|
||
|
fc_assert_ret(punit != nullptr);
|
||
|
fc_assert_ret(ptrans != nullptr);
|
||
|
BV_CLR_ALL(can_see_unit);
|
||
|
players_iterate(pplayer) {
|
||
| ... | ... | |
|
}
|
||
|
} players_iterate_end;
|
||
|
send_unit_info(NULL, punit);
|
||
|
send_unit_info(NULL, ptrans);
|
||
|
send_unit_info(nullptr, punit);
|
||
|
send_unit_info(nullptr, ptrans);
|
||
|
}
|
||
|
/**********************************************************************//**
|
||
| ... | ... | |
|
{
|
||
|
bool had_cargo;
|
||
|
fc_assert_ret(punit != NULL);
|
||
|
fc_assert_ret(ptrans != NULL);
|
||
|
fc_assert_ret(punit != nullptr);
|
||
|
fc_assert_ret(ptrans != nullptr);
|
||
|
had_cargo = get_transporter_occupancy(ptrans) > 0;
|
||
| ... | ... | |
|
if (!had_cargo) {
|
||
|
/* Transport's loaded status changed */
|
||
|
send_unit_info(NULL, ptrans);
|
||
|
send_unit_info(nullptr, ptrans);
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
unit_transport_unload(punit);
|
||
|
send_unit_info(NULL, punit);
|
||
|
send_unit_info(NULL, ptrans);
|
||
|
send_unit_info(nullptr, punit);
|
||
|
send_unit_info(nullptr, ptrans);
|
||
|
}
|
||
|
/**********************************************************************//**
|
||
| ... | ... | |
|
probability->prob =
|
||
|
action_auto_perf_unit_prob(AAPC_UNIT_MOVED_ADJ,
|
||
|
penemy, unit_owner(punit), NULL, NULL,
|
||
|
penemy, unit_owner(punit), nullptr, nullptr,
|
||
|
tgt_tile, tile_city(tgt_tile),
|
||
|
punit, NULL);
|
||
|
punit, nullptr);
|
||
|
if (action_prob_possible(probability->prob)) {
|
||
|
probability->unit_id = penemy->id;
|
||
| ... | ... | |
|
autoattack_prob_list_iterate_safe(autoattack, peprob, penemy) {
|
||
|
int sanity2 = penemy->id;
|
||
|
struct tile *ptile = unit_tile(penemy);
|
||
|
struct unit *enemy_defender = get_defender(nmap, punit, ptile, NULL);
|
||
|
struct unit *enemy_defender = get_defender(nmap, punit, ptile, nullptr);
|
||
|
double punitwin, penemywin;
|
||
|
double threshold = 0.25;
|
||
|
struct tile *tgt_tile = unit_tile(punit);
|
||
| ... | ... | |
|
threshold = 0.90;
|
||
|
}
|
||
|
if (NULL != enemy_defender) {
|
||
|
punitwin = unit_win_chance(nmap, punit, enemy_defender, NULL);
|
||
|
if (enemy_defender != nullptr) {
|
||
|
punitwin = unit_win_chance(nmap, punit, enemy_defender, nullptr);
|
||
|
} else {
|
||
|
/* 'penemy' can attack 'punit' but it may be not reciproque. */
|
||
|
punitwin = 1.0;
|
||
| ... | ... | |
|
/* Previous attacks may have changed the odds. Recalculate. */
|
||
|
peprob->prob =
|
||
|
action_auto_perf_unit_prob(AAPC_UNIT_MOVED_ADJ,
|
||
|
penemy, unit_owner(punit), NULL, NULL,
|
||
|
penemy, unit_owner(punit), nullptr, nullptr,
|
||
|
tgt_tile, tile_city(tgt_tile),
|
||
|
punit, NULL);
|
||
|
punit, nullptr);
|
||
|
if (!action_prob_possible(peprob->prob)) {
|
||
|
/* No longer legal. */
|
||
| ... | ... | |
|
unit_activity_handling(penemy, ACTIVITY_IDLE, ACTION_NONE);
|
||
|
action_auto_perf_unit_do(AAPC_UNIT_MOVED_ADJ,
|
||
|
penemy, unit_owner(punit), NULL, NULL,
|
||
|
tgt_tile, tile_city(tgt_tile), punit, NULL);
|
||
|
penemy, unit_owner(punit), nullptr, nullptr,
|
||
|
tgt_tile, tile_city(tgt_tile), punit, nullptr);
|
||
|
} else {
|
||
|
#ifdef REALLY_DEBUG_THIS
|
||
|
log_test("!AA %s -> %s (%d,%d) %.2f > %.2f && > %.2f",
|
||
| ... | ... | |
|
}
|
||
|
if (game_unit_by_number(sanity2)) {
|
||
|
send_unit_info(NULL, penemy);
|
||
|
send_unit_info(nullptr, penemy);
|
||
|
}
|
||
|
if (game_unit_by_number(sanity1)) {
|
||
|
send_unit_info(NULL, punit);
|
||
|
send_unit_info(nullptr, punit);
|
||
|
} else {
|
||
|
autoattack_prob_list_destroy(autoattack);
|
||
|
return FALSE; /* moving unit dead */
|
||
| ... | ... | |
|
if (game_unit_by_number(sanity1)) {
|
||
|
/* We could have lost movement in combat */
|
||
|
punit->moves_left = MIN(punit->moves_left, moves);
|
||
|
send_unit_info(NULL, punit);
|
||
|
send_unit_info(nullptr, punit);
|
||
|
return TRUE;
|
||
|
} else {
|
||
|
return FALSE;
|
||
| ... | ... | |
|
static void cancel_orders(struct unit *punit, char *dbg_msg)
|
||
|
{
|
||
|
free_unit_orders(punit);
|
||
|
send_unit_info(NULL, punit);
|
||
|
send_unit_info(nullptr, punit);
|
||
|
log_debug("%s", dbg_msg);
|
||
|
}
|
||
| ... | ... | |
|
{
|
||
|
bool alone_in_city;
|
||
|
if (NULL != tile_city(unit_tile(punit))) {
|
||
|
if (tile_city(unit_tile(punit)) != nullptr) {
|
||
|
int count = 0;
|
||
|
unit_list_iterate(unit_tile(punit)->units, aunit) {
|
||
| ... | ... | |
|
* it is visible. */
|
||
|
&& (alone_in_city
|
||
|
|| can_player_see_unit(unit_owner(penemy), punit))
|
||
|
/* on board transport; don't awaken */
|
||
|
/* On board transport; don't awaken */
|
||
|
&& can_unit_exist_at_tile(&(wld.map), penemy, unit_tile(penemy))) {
|
||
|
set_unit_activity(penemy, ACTIVITY_IDLE, ACTION_NONE);
|
||
|
send_unit_info(NULL, penemy);
|
||
|
send_unit_info(nullptr, penemy);
|
||
|
}
|
||
|
} unit_list_iterate_end;
|
||
|
} square_iterate_end;
|
||
| ... | ... | |
|
square_iterate(&(wld.map), unit_tile(punit), 3, ptile) {
|
||
|
unit_list_iterate(ptile->units, ppatrol) {
|
||
|
if (punit != ppatrol
|
||
|
&& unit_has_orders(ppatrol)
|
||
|
&& ppatrol->orders.vigilant) {
|
||
|
if (maybe_cancel_patrol_due_to_enemy(ppatrol)) {
|
||
|
cancel_orders(ppatrol, " stopping because of nearby enemy");
|
||
|
&& unit_has_orders(ppatrol)
|
||
|
&& ppatrol->orders.vigilant) {
|
||
|
if (maybe_cancel_patrol_due_to_enemy(ppatrol)) {
|
||
|
cancel_orders(ppatrol, " stopping because of nearby enemy");
|
||
|
notify_player(unit_owner(ppatrol), unit_tile(ppatrol),
|
||
|
E_UNIT_ORDERS, ftc_server,
|
||
|
_("Orders for %s aborted after enemy movement was "
|
||
| ... | ... | |
|
{
|
||
|
struct city *fromcity = tile_city(src_tile);
|
||
|
struct city *tocity = tile_city(dst_tile);
|
||
|
struct city *homecity_start_pos = NULL;
|
||
|
struct city *homecity_end_pos = NULL;
|
||
|
struct city *homecity_start_pos = nullptr;
|
||
|
struct city *homecity_end_pos = nullptr;
|
||
|
int homecity_id_start_pos = punit->homecity;
|
||
|
int homecity_id_end_pos = punit->homecity;
|
||
|
struct player *pplayer_start_pos = unit_owner(punit);
|
||
| ... | ... | |
|
"Unit number %d (%p) was going to die, but "
|
||
|
"server attempts to move it.",
|
||
|
punit->id, punit);
|
||
|
fc_assert_msg(pdata->old_vision == NULL,
|
||
|
fc_assert_msg(pdata->old_vision == nullptr,
|
||
|
"Unit number %d (%p) has done an incomplete move.",
|
||
|
punit->id, punit);
|
||
|
} else {
|
||
| ... | ... | |
|
**************************************************************************/
|
||
|
static void unit_move_data_unref(struct unit_move_data *pdata)
|
||
|
{
|
||
|
fc_assert_ret(pdata != NULL);
|
||
|
fc_assert_ret(pdata != nullptr);
|
||
|
fc_assert_ret(pdata->ref_count > 0);
|
||
|
fc_assert_msg(pdata->old_vision == NULL,
|
||
|
fc_assert_msg(pdata->old_vision == nullptr,
|
||
|
"Unit number %d (%p) has done an incomplete move.",
|
||
|
pdata->punit != NULL ? pdata->punit->id : -1, pdata->punit);
|
||
|
pdata->punit != nullptr ? pdata->punit->id : -1, pdata->punit);
|
||
|
pdata->ref_count--;
|
||
|
if (pdata->ref_count == 0) {
|
||
|
if (pdata->punit != NULL) {
|
||
|
if (pdata->punit != nullptr) {
|
||
|
fc_assert(pdata->punit->server.moving == pdata);
|
||
|
pdata->punit->server.moving = NULL;
|
||
|
pdata->punit->server.moving = nullptr;
|
||
|
}
|
||
|
free(pdata);
|
||
|
}
|
||
| ... | ... | |
|
bool flagless = unit_has_type_flag(punit, UTYF_FLAGLESS);
|
||
|
/* Some checks. */
|
||
|
fc_assert_ret_val(punit != NULL, FALSE);
|
||
|
fc_assert_ret_val(pdesttile != NULL, FALSE);
|
||
|
fc_assert_ret_val(punit != nullptr, FALSE);
|
||
|
fc_assert_ret_val(pdesttile != nullptr, FALSE);
|
||
|
pplayer = unit_owner(punit);
|
||
|
saved_id = punit->id;
|
||
| ... | ... | |
|
/* Unload the unit if on a transport. */
|
||
|
ptransporter = unit_transport_get(punit);
|
||
|
if (ptransporter != NULL) {
|
||
|
if (ptransporter != nullptr) {
|
||
|
/* Unload unit _before_ setting the new tile! */
|
||
|
unit_transport_unload(punit);
|
||
|
/* Send updated information to anyone watching that transporter
|
||
|
* was unloading cargo. */
|
||
|
send_unit_info(NULL, ptransporter);
|
||
|
send_unit_info(nullptr, ptransporter);
|
||
|
}
|
||
|
/* Wakup units next to us before we move. */
|
||
| ... | ... | |
|
}
|
||
|
/* No longer relevant. */
|
||
|
punit->action_decision_tile = NULL;
|
||
|
punit->action_decision_tile = nullptr;
|
||
|
punit->action_decision_want = ACT_DEC_NOTHING;
|
||
|
/* Claim ownership of fortress? */
|
||
| ... | ... | |
|
conn_list_iterate(game.est_connections, pconn) {
|
||
|
struct player *aplayer = conn_get_player(pconn);
|
||
|
if (aplayer == NULL) {
|
||
|
if (aplayer == nullptr) {
|
||
|
if (pconn->observer) {
|
||
|
/* Global observers see all... */
|
||
|
send_packet_unit_info(pconn, &src_info);
|
||
| ... | ... | |
|
conn_list_iterate(game.est_connections, pconn) {
|
||
|
struct player *aplayer = conn_get_player(pconn);
|
||
|
if (aplayer == NULL) {
|
||
|
if (aplayer == nullptr) {
|
||
|
if (pconn->observer) {
|
||
|
/* Global observers see all... */
|
||
|
send_packet_unit_info(pconn, &dest_info);
|
||
| ... | ... | |
|
/* Clear old vision. */
|
||
|
unit_move_data_list_iterate(plist, pmove_data) {
|
||
|
if (pmove_data->old_vision != NULL) {
|
||
|
if (pmove_data->old_vision != nullptr) {
|
||
|
vision_clear_sight(pmove_data->old_vision);
|
||
|
vision_free(pmove_data->old_vision);
|
||
|
pmove_data->old_vision = NULL;
|
||
|
pmove_data->old_vision = nullptr;
|
||
|
}
|
||
|
} unit_move_data_list_iterate_end;
|
||
| ... | ... | |
|
unit_move_data_list_iterate(plist, pmove_data) {
|
||
|
struct unit *aunit = pmove_data->punit;
|
||
|
if (aunit != NULL
|
||
|
if (aunit != nullptr
|
||
|
&& unit_owner(aunit) == pmove_data->powner
|
||
|
&& unit_tile(aunit) == pdesttile) {
|
||
|
(void) unit_move_consequences(aunit, psrctile, pdesttile,
|
||
| ... | ... | |
|
if (unit_lives) {
|
||
|
/* Special checks for ground units in the ocean. */
|
||
|
if (embark_to || !can_unit_survive_at_tile(&(wld.map), punit, pdesttile)) {
|
||
|
if (embark_to != NULL) {
|
||
|
if (embark_to != nullptr) {
|
||
|
ptransporter = embark_to;
|
||
|
} else if (find_embark_target) {
|
||
|
/* TODO: Consider to stop supporting find_embark_target and make all
|
||
|
* callers that wants auto loading set embark_to. */
|
||
|
ptransporter = transporter_for_unit(punit);
|
||
|
} else {
|
||
|
ptransporter = NULL;
|
||
|
ptransporter = nullptr;
|
||
|
}
|
||
|
if (ptransporter) {
|
||
|
unit_transport_load_tp_status(punit, ptransporter, FALSE);
|
||
| ... | ... | |
|
set_unit_activity(punit, ACTIVITY_SENTRY, ACTION_NONE);
|
||
|
}
|
||
|
send_unit_info(NULL, punit);
|
||
|
send_unit_info(nullptr, punit);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
unit_move_data_list_iterate_rev(plist, pmove_data) {
|
||
|
struct unit *aunit = pmove_data->punit;
|
||
|
if (aunit == NULL) {
|
||
|
if (aunit == nullptr) {
|
||
|
continue; /* Died! */
|
||
|
}
|
||
| ... | ... | |
|
* the client settings, cause the client to start the process that makes
|
||
|
* the action selection dialog pop up. */
|
||
|
pdestcity = tile_city(pdesttile);
|
||
|
if (pdestcity != NULL) {
|
||
|
if (pdestcity != nullptr) {
|
||
|
/* Arrival in a city counts. */
|
||
|
unit_move_data_list_iterate(plist, pmove_data) {
|
||
| ... | ... | |
|
act_unit = pmove_data->punit;
|
||
|
act_player = unit_owner(act_unit);
|
||
|
if (act_unit == NULL
|
||
|
if (act_unit == nullptr
|
||
|
|| !unit_is_alive(act_unit->id)) {
|
||
|
/* The unit died before reaching this point. */
|
||
|
continue;
|
||
| ... | ... | |
|
for (ptrans = unit_transport_get(act_unit);;
|
||
|
ptrans = unit_transport_get(ptrans)) {
|
||
|
if (NULL == ptrans) {
|
||
|
if (ptrans == nullptr) {
|
||
|
/* No (recursive) transport has orders. */
|
||
|
ok = TRUE;
|
||
|
break;
|
||
| ... | ... | |
|
unit_move_data_list_destroy(plist);
|
||
|
/* Check cities at source and destination. */
|
||
|
psrccity = tile_city(psrctile);
|
||
|
if (psrccity != NULL) {
|
||
|
if (psrccity != nullptr) {
|
||
|
refresh_dumb_city(psrccity);
|
||
|
}
|
||
|
if (pdestcity != NULL) {
|
||
|
if (pdestcity != nullptr) {
|
||
|
refresh_dumb_city(pdestcity);
|
||
|
}
|
||
| ... | ... | |
|
/**********************************************************************//**
|
||
|
Maybe cancel the goto if there is an enemy in the way
|
||
|
**************************************************************************/
|
||
|
static bool maybe_cancel_goto_due_to_enemy(struct unit *punit,
|
||
|
static bool maybe_cancel_goto_due_to_enemy(struct unit *punit,
|
||
|
struct tile *ptile)
|
||
|
{
|
||
|
struct player *owner = unit_owner(punit);
|
||
|
return (is_non_allied_unit_tile(ptile, owner,
|
||
|
unit_has_type_flag(punit, UTYF_FLAGLESS))
|
||
|
unit_has_type_flag(punit, UTYF_FLAGLESS))
|
||
|
|| is_non_allied_city_tile(ptile, owner));
|
||
|
}
|
||
| ... | ... | |
|
/* For repeating orders, don't repeat more than once per turn. */
|
||
|
log_debug(" stopping because we ran a round");
|
||
|
punit->done_moving = TRUE;
|
||
|
send_unit_info(NULL, punit);
|
||
|
send_unit_info(nullptr, punit);
|
||
|
return TRUE;
|
||
|
}
|
||
|
moves_made++;
|
||
| ... | ... | |
|
}
|
||
|
last_order = (!punit->orders.repeat
|
||
|
&& punit->orders.index + 1 == punit->orders.length);
|
||
|
&& punit->orders.index + 1 == punit->orders.length);
|
||
|
if (last_order) {
|
||
|
/* Clear the orders before we engage in the move. That way any
|
||
| ... | ... | |
|
switch (order.order) {
|
||
|
case ORDER_FULL_MP:
|
||
|
if (punit->moves_left < unit_move_rate(punit)) {
|
||
|
/* If the unit doesn't have full MP then it just waits until the
|
||
|
* next turn. We assume that the next turn it will have full MP
|
||
|
* (there's no check for that). */
|
||
|
punit->done_moving = TRUE;
|
||
|
/* If the unit doesn't have full MP then it just waits until the
|
||
|
* next turn. We assume that the next turn it will have full MP
|
||
|
* (there's no check for that). */
|
||
|
punit->done_moving = TRUE;
|
||
|
log_debug(" waiting this turn");
|
||
|
send_unit_info(NULL, punit);
|
||
|
send_unit_info(nullptr, punit);
|
||
|
}
|
||
|
break;
|
||
|
case ORDER_ACTIVITY:
|
||
| ... | ... | |
|
if (can_unit_do_activity(nmap, punit, activity, order.action)) {
|
||
|
punit->done_moving = TRUE;
|
||
|
set_unit_activity(punit, activity, order.action);
|
||
|
send_unit_info(NULL, punit);
|
||
|
send_unit_info(nullptr, punit);
|
||
|
break;
|
||
|
}
|
||
| ... | ... | |
|
if (res && !same_pos(dst_tile, unit_tile(punit))) {
|
||
|
/* Movement succeeded but unit didn't move. */
|
||
|
log_debug(" orders resulted in combat.");
|
||
|
send_unit_info(NULL, punit);
|
||
|
send_unit_info(nullptr, punit);
|
||
|
return TRUE;
|
||
|
}
|
||
| ... | ... | |
|
oaction = action_by_number(order.action);
|
||
|
/* Checked in unit_order_list_is_sane() */
|
||
|
fc_assert_action(oaction != NULL, continue);
|
||
|
fc_assert_action(oaction != nullptr, continue);
|
||
|
log_debug(" orders: doing action %s", action_rule_name(oaction));
|
||
|
dst_tile = index_to_tile(&(wld.map), order.target);
|
||
|
if (dst_tile == NULL) {
|
||
|
if (dst_tile == nullptr) {
|
||
|
/* Could be at the edge of the map while trying to target a tile
|
||
|
* outside of it. */
|
||
|
cancel_orders(punit, " target location doesn't exist");
|
||
|
illegal_action_msg(unit_owner(punit), E_UNIT_ORDERS, punit,
|
||
|
order.action, dst_tile, NULL, NULL);
|
||
|
order.action, dst_tile, nullptr, nullptr);
|
||
|
return TRUE;
|
||
|
}
|
||
| ... | ... | |
|
/* Get the target city from the target tile. */
|
||
|
tgt_city = tile_city(dst_tile);
|
||
|
if (tgt_city == NULL
|
||
|
if (tgt_city == nullptr
|
||
|
&& action_id_get_target_kind(order.action) == ATK_CITY) {
|
||
|
/* This action targets a city but no city target was found. */
|
||
|
cancel_orders(punit, " perform action vs city with no city");
|
||
|
illegal_action_msg(unit_owner(punit), E_UNIT_ORDERS, punit,
|
||
|
order.action, dst_tile, tgt_city, NULL);
|
||
|
order.action, dst_tile, tgt_city, nullptr);
|
||
|
return TRUE;
|
||
|
}
|
||
| ... | ... | |
|
/* Get a target unit at the target tile. */
|
||
|
tgt_unit = action_tgt_unit(punit, dst_tile, TRUE);
|
||
|
if (tgt_unit == NULL
|
||
|
if (tgt_unit == nullptr
|
||
|
&& action_id_get_target_kind(order.action) == ATK_UNIT) {
|
||
|
/* This action targets a unit but no target unit was found. */
|
||
| ... | ... | |
|
/* Get a target extra at the target tile */
|
||
|
pextra = (sub_tgt_id == NO_TARGET ?
|
||
|
NULL :
|
||
|
nullptr :
|
||
|
extra_by_number(sub_tgt_id));
|
||
|
if (action_get_sub_target_kind(oaction) == ASTK_EXTRA_NOT_THERE
|
||
|
&& pextra != NULL
|
||
|
&& pextra != nullptr
|
||
|
&& actres_creates_extra(oaction->result, pextra)
|
||
|
&& tile_has_extra(dst_tile, pextra)) {
|
||
|
/* Already there. Move on to the next order. */
|
||
| ... | ... | |
|
}
|
||
|
if (action_get_sub_target_kind(oaction) == ASTK_EXTRA
|
||
|
&& pextra != NULL
|
||
|
&& pextra != nullptr
|
||
|
&& actres_removes_extra(oaction->result, pextra)
|
||
|
&& !tile_has_extra(dst_tile, pextra)) {
|
||
|
/* Already not there. Move on to the next order. */
|
||
| ... | ... | |
|
!= ACT_TIME_INSTANTANEOUS) {
|
||
|
/* Done at turn change. */
|
||
|
punit->done_moving = TRUE;
|
||
|
send_unit_info(NULL, punit);
|
||
|
send_unit_info(nullptr, punit);
|
||
|
break;
|
||
|
}
|
||
| ... | ... | |
|
const struct unit_type *utype = unit_type_get(punit);
|
||
|
return (utype->vision_radius_sq
|
||