Project

General

Profile

Feature #1650 ยป 0051-player.-ch-Replace-NULL-with-nullptr.patch

Marko Lindqvist, 08/08/2025 01:02 AM

View differences:

common/player.c
{
struct player_diplstate *diplstate;
fc_assert_ret(plr1 != NULL);
fc_assert_ret(plr2 != NULL);
fc_assert_ret(plr1 != nullptr);
fc_assert_ret(plr2 != nullptr);
const struct player_diplstate **diplstate_slot
= plr1->diplstates + player_index(plr2);
fc_assert_ret(*diplstate_slot == NULL);
fc_assert_ret(*diplstate_slot == nullptr);
diplstate = fc_calloc(1, sizeof(*diplstate));
*diplstate_slot = diplstate;
......
{
struct player_diplstate *diplstate = player_diplstate_get(plr1, plr2);
fc_assert_ret(diplstate != NULL);
fc_assert_ret(diplstate != nullptr);
diplstate->type = DS_NO_CONTACT;
diplstate->max_state = DS_NO_CONTACT;
......
struct player_diplstate *player_diplstate_get(const struct player *plr1,
const struct player *plr2)
{
fc_assert_ret_val(plr1 != NULL, NULL);
fc_assert_ret_val(plr2 != NULL, NULL);
fc_assert_ret_val(plr1 != nullptr, nullptr);
fc_assert_ret_val(plr2 != nullptr, nullptr);
const struct player_diplstate **diplstate_slot
= plr1->diplstates + player_index(plr2);
fc_assert_ret_val(*diplstate_slot != NULL, NULL);
fc_assert_ret_val(*diplstate_slot != nullptr, nullptr);
return (struct player_diplstate *) *diplstate_slot;
}
......
static void player_diplstate_destroy(const struct player *plr1,
const struct player *plr2)
{
fc_assert_ret(plr1 != NULL);
fc_assert_ret(plr2 != NULL);
fc_assert_ret(plr1 != nullptr);
fc_assert_ret(plr2 != nullptr);
const struct player_diplstate **diplstate_slot
= plr1->diplstates + player_index(plr2);
if (*diplstate_slot != NULL) {
if (*diplstate_slot != nullptr) {
free(player_diplstate_get(plr1, plr2));
}
*diplstate_slot = NULL;
*diplstate_slot = nullptr;
}
/*******************************************************************//**
......
/* Can't use the defined functions as the needed data will be
* defined here. */
for (i = 0; i < player_slot_count(); i++) {
player_slots.slots[i].player = NULL;
player_slots.slots[i].player = nullptr;
}
player_slots.used_slots = 0;
}
......
***********************************************************************/
bool player_slots_initialised(void)
{
return (player_slots.slots != NULL);
return (player_slots.slots != nullptr);
}
/*******************************************************************//**
......
player_destroy(pplayer);
} players_iterate_end;
free(player_slots.slots);
player_slots.slots = NULL;
player_slots.slots = nullptr;
player_slots.used_slots = 0;
}
......
struct player_slot *player_slot_next(struct player_slot *pslot)
{
pslot++;
return (pslot < player_slots.slots + player_slot_count() ? pslot : NULL);
return (pslot < player_slots.slots + player_slot_count()
? pslot : nullptr);
}
/*******************************************************************//**
......
***********************************************************************/
int player_slot_index(const struct player_slot *pslot)
{
fc_assert_ret_val(NULL != pslot, -1);
fc_assert_ret_val(pslot != nullptr, -1);
return pslot - player_slots.slots;
}
/*******************************************************************//**
Returns the team corresponding to the slot. If the slot is not used, it
will return NULL. See also player_slot_is_used().
will return nullptr. See also player_slot_is_used().
***********************************************************************/
struct player *player_slot_get_player(const struct player_slot *pslot)
{
fc_assert_ret_val(NULL != pslot, NULL);
fc_assert_ret_val(pslot != nullptr, nullptr);
return pslot->player;
}
......
***********************************************************************/
bool player_slot_is_used(const struct player_slot *pslot)
{
fc_assert_ret_val(NULL != pslot, FALSE);
fc_assert_ret_val(pslot != nullptr, FALSE);
/* No player slot available, if the game is not initialised. */
if (!player_slots_initialised()) {
return FALSE;
}
return NULL != pslot->player;
return pslot->player != nullptr;
}
/*******************************************************************//**
......
{
if (!player_slots_initialised()
|| !(0 <= player_id && player_id < player_slot_count())) {
return NULL;
return nullptr;
}
return player_slots.slots + player_id;
......
}
/*******************************************************************//**
Creates a new player for the slot. If slot is NULL, it will lookup to a
Creates a new player for the slot. If slot is nullptr, it will lookup to a
free slot. If the slot is already used, then just return the player.
***********************************************************************/
struct player *player_new(struct player_slot *pslot)
{
struct player *pplayer;
fc_assert_ret_val(player_slots_initialised(), NULL);
fc_assert_ret_val(player_slots_initialised(), nullptr);
if (pslot == NULL) {
if (pslot == nullptr) {
player_slots_iterate(aslot) {
if (!player_slot_is_used(aslot)) {
pslot = aslot;
......
}
} player_slots_iterate_end;
if (pslot == NULL) {
return NULL;
if (pslot == nullptr) {
return nullptr;
}
} else if (NULL != pslot->player) {
} else if (pslot->player != nullptr) {
return pslot->player;
}
......
const struct player_diplstate **diplstate_slot
= pplayer->diplstates + player_slot_index(dslot);
*diplstate_slot = NULL;
*diplstate_slot = nullptr;
} player_slots_iterate_end;
players_iterate(aplayer) {
......
pplayer->unassigned_ranked = TRUE;
pplayer->user_turns = 0;
pplayer->is_male = TRUE;
pplayer->government = NULL;
pplayer->target_government = NULL;
pplayer->government = nullptr;
pplayer->target_government = nullptr;
pplayer->nation = NO_NATION_SELECTED;
pplayer->team = NULL;
pplayer->team = nullptr;
pplayer->is_ready = FALSE;
pplayer->nturns_idle = 0;
pplayer->is_alive = TRUE;
......
player_slots_iterate(pslot) {
pplayer->ai_common.love[player_slot_index(pslot)] = 1;
} player_slots_iterate_end;
pplayer->ai_common.traits = NULL;
pplayer->ai_common.traits = nullptr;
pplayer->ai = NULL;
pplayer->ai = nullptr;
pplayer->was_created = FALSE;
pplayer->savegame_ai_type_name = NULL;
pplayer->savegame_ai_type_name = nullptr;
pplayer->random_name = TRUE;
pplayer->is_connected = FALSE;
pplayer->current_conn = NULL;
pplayer->current_conn = nullptr;
pplayer->connections = conn_list_new();
pplayer->autoselect_weight = -1;
BV_CLR_ALL(pplayer->gives_shared_vision);
......
pplayer->wonders[i] = WONDER_NOT_BUILT;
}
pplayer->attribute_block.data = NULL;
pplayer->attribute_block.data = nullptr;
pplayer->attribute_block.length = 0;
pplayer->attribute_block_buffer.data = NULL;
pplayer->attribute_block_buffer.data = nullptr;
pplayer->attribute_block_buffer.length = 0;
pplayer->tile_known.vec = NULL;
pplayer->tile_known.vec = nullptr;
pplayer->tile_known.bits = 0;
pplayer->rgb = NULL;
pplayer->rgb = nullptr;
memset(pplayer->multipliers, 0, sizeof(pplayer->multipliers));
......
/*******************************************************************//**
Set the player's color.
May be NULL in pregame.
May be nullptr in pregame.
***********************************************************************/
void player_set_color(struct player *pplayer,
const struct rgbcolor *prgbcolor)
{
if (pplayer->rgb != NULL) {
if (pplayer->rgb != nullptr) {
rgbcolor_destroy(pplayer->rgb);
pplayer->rgb = NULL;
pplayer->rgb = nullptr;
}
if (prgbcolor) {
......
{
bool client = !is_server();
if (pplayer == NULL) {
if (pplayer == nullptr) {
return;
}
if (pplayer->savegame_ai_type_name != NULL) {
if (pplayer->savegame_ai_type_name != nullptr) {
free(pplayer->savegame_ai_type_name);
pplayer->savegame_ai_type_name = NULL;
pplayer->savegame_ai_type_name = nullptr;
}
/* Clears the attribute blocks. */
if (pplayer->attribute_block.data) {
free(pplayer->attribute_block.data);
pplayer->attribute_block.data = NULL;
pplayer->attribute_block.data = nullptr;
}
pplayer->attribute_block.length = 0;
if (pplayer->attribute_block_buffer.data) {
free(pplayer->attribute_block_buffer.data);
pplayer->attribute_block_buffer.data = NULL;
pplayer->attribute_block_buffer.data = nullptr;
}
pplayer->attribute_block_buffer.length = 0;
......
} unit_list_iterate_end;
city_list_iterate(pplayer->cities, pcity) {
if (fc_funcs->destroy_city != NULL) {
if (fc_funcs->destroy_city != nullptr) {
fc_funcs->destroy_city(pcity);
} else {
game_remove_city(&wld, pcity);
......
/* This comes last because log calls in the above functions
* may use it. */
if (pplayer->nation != NULL) {
player_set_nation(pplayer, NULL);
if (pplayer->nation != nullptr) {
player_set_nation(pplayer, nullptr);
}
}
}
......
***********************************************************************/
void player_ruleset_close(struct player *pplayer)
{
pplayer->government = NULL;
pplayer->target_government = NULL;
player_set_nation(pplayer, NULL);
pplayer->style = NULL;
pplayer->government = nullptr;
pplayer->target_government = nullptr;
player_set_nation(pplayer, nullptr);
pplayer->style = nullptr;
}
/*******************************************************************//**
......
{
struct player_slot *pslot;
fc_assert_ret(NULL != pplayer);
fc_assert_ret(pplayer != nullptr);
pslot = pplayer->slot;
fc_assert(pslot->player == pplayer);
......
if (pcity->original == pplayer) {
/* Unknown origin is better than giving baseless
* benefits to current owner */
pcity->original = NULL;
pcity->original = nullptr;
}
} city_list_iterate_end;
}
......
}
free(pplayer);
pslot->player = NULL;
pslot->player = nullptr;
player_slots.used_slots--;
}
......
***********************************************************************/
int player_number(const struct player *pplayer)
{
fc_assert_ret_val(NULL != pplayer, -1);
fc_assert_ret_val(pplayer != nullptr, -1);
return player_slot_index(pplayer->slot);
}
......
Return struct player pointer for the given player index.
You can retrieve players that are not in the game (with IDs larger than
player_count). An out-of-range player request will return NULL.
player_count). An out-of-range player request will return nullptr.
***********************************************************************/
struct player *player_by_number(const int player_id)
{
struct player_slot *pslot = player_slot_by_number(player_id);
return (NULL != pslot ? player_slot_get_player(pslot) : NULL);
return (pslot != nullptr ? player_slot_get_player(pslot) : nullptr);
}
/*******************************************************************//**
Set the player's nation to the given nation (may be NULL). Returns TRUE
iff there was a change.
Set the player's nation to the given nation (may be nullptr).
Returns TRUE iff there was a change.
Doesn't check if the nation is legal wrt nationset.
***********************************************************************/
bool player_set_nation(struct player *pplayer, struct nation_type *pnation)
......
if (pplayer->nation != pnation) {
if (pplayer->nation) {
fc_assert(pplayer->nation->player == pplayer);
pplayer->nation->player = NULL;
pplayer->nation->player = nullptr;
}
if (pnation) {
fc_assert(pnation->player == NULL);
fc_assert(pnation->player == nullptr);
pnation->player = pplayer;
}
pplayer->nation = pnation;
return TRUE;
}
return FALSE;
}
......
}
} players_iterate_end;
return NULL;
return nullptr;
}
/*******************************************************************//**
......
const char *player_name(const struct player *pplayer)
{
if (!pplayer) {
return NULL;
return nullptr;
}
return pplayer->name;
}
/*******************************************************************//**
Find player by name, allowing unambiguous prefix (i.e. abbreviation).
Returns NULL if could not match, or if ambiguous or other
Returns nullptr if could not match, or if ambiguous or other
problem, and fills *result with characterisation of match/non-match
(see shared.[ch])
***********************************************************************/
......
struct player *pplayer;
pplayer = player_by_number(i);
return player_name(pplayer);
}
......
if (*result < M_PRE_AMBIGUOUS) {
return player_by_number(ind);
} else {
return NULL;
return nullptr;
}
}
......
}
} players_iterate_end;
return NULL;
return nullptr;
}
/*******************************************************************//**
......
***********************************************************************/
int player_age(const struct player *pplayer)
{
fc_assert_ret_val(pplayer != NULL, 0);
fc_assert_ret_val(pplayer != nullptr, 0);
return pplayer->turns_alive;
}
......
See can_player_see_unit_at().
***********************************************************************/
bool can_player_see_unit(const struct player *pplayer,
const struct unit *punit)
const struct unit *punit)
{
return can_player_see_unit_at(pplayer, punit, unit_tile(punit),
unit_transported(punit));
......
Otherwise the player would not know anything about the city's units at
all, since the full city packet has no "occupied" flag.
Returns TRUE if given a NULL player. This is used by the client when in
Returns TRUE if given a nullptr player. This is used by the client when in
observer mode.
***********************************************************************/
bool can_player_see_units_in_city(const struct player *pplayer,
const struct city *pcity)
const struct city *pcity)
{
return (!pplayer
|| can_player_see_city_internals(pplayer, pcity)
|| pplayers_allied(pplayer, city_owner(pcity)));
|| can_player_see_city_internals(pplayer, pcity)
|| pplayers_allied(pplayer, city_owner(pcity)));
}
/*******************************************************************//**
......
full city packet is sent to the client, who should then be able to popup
a dialog for it.
Returns TRUE if given a NULL player. This is used by the client when in
Returns TRUE if given a nullptr player. This is used by the client when in
observer mode.
***********************************************************************/
bool can_player_see_city_internals(const struct player *pplayer,
const struct city *pcity)
const struct city *pcity)
{
return (!pplayer || pplayer == city_owner(pcity));
}
......
/*******************************************************************//**
If the specified player owns the city with the specified id,
return pointer to the city struct. Else return NULL.
return pointer to the city struct. Else return nullptr.
Now always uses fast idex_lookup_city.
pplayer may be NULL in which case all cities registered to
pplayer may be nullptr in which case all cities registered to
hash are considered - even those not currently owned by any
player. Callers expect this behavior.
***********************************************************************/
......
struct city *pcity = idex_lookup_city(&wld, city_id);
if (!pcity) {
return NULL;
return nullptr;
}
if (!pplayer || (city_owner(pcity) == pplayer)) {
......
return pcity;
}
return NULL;
return nullptr;
}
/*******************************************************************//**
If the specified player owns the unit with the specified id,
return pointer to the unit struct. Else return NULL.
Uses fast idex_lookup_city.
return pointer to the unit struct. Else return nullptr.
Uses fast idex_lookup_city().
pplayer may be NULL in which case all units registered to
pplayer may be nullptr in which case all units registered to
hash are considered - even those not currently owned by any
player. Callers expect this behavior.
***********************************************************************/
......
struct unit *punit = idex_lookup_unit(&wld, unit_id);
if (!punit) {
return NULL;
return nullptr;
}
if (!pplayer || (unit_owner(punit) == pplayer)) {
......
return punit;
}
return NULL;
return nullptr;
}
/*******************************************************************//**
......
struct city *pcity = tile_city(ptile1);
if (pcity
&& (pplayer == NULL || city_owner(pcity) == pplayer)
&& (pplayer == nullptr || city_owner(pcity) == pplayer)
&& city_map_radius_sq_get(pcity) >= sq_map_distance(ptile,
ptile1)) {
return TRUE;
......
given flag.
***********************************************************************/
bool player_knows_techs_with_flag(const struct player *pplayer,
enum tech_flag_id flag)
enum tech_flag_id flag)
{
return num_known_tech_with_flag(pplayer, flag) > 0;
}
/*******************************************************************//**
Locate the player's primary capital city, (NULL Otherwise)
Locate the player's primary capital city, (nullptr Otherwise)
***********************************************************************/
struct city *player_primary_capital(const struct player *pplayer)
{
......
if (!pplayer) {
/* The client depends on this behavior in some places. */
return NULL;
return nullptr;
}
capital = player_city_by_number(pplayer, pplayer->primary_capital_id);
......
const struct player *player2,
int diplrel)
{
fc_assert(player1 != NULL);
fc_assert(player2 != NULL);
fc_assert(player1 != nullptr);
fc_assert(player2 != nullptr);
/* No relationship to it self. */
if (player1 == player2 && diplrel != DRO_FOREIGN) {
......
***********************************************************************/
bool is_diplrel_to_other(const struct player *pplayer, int diplrel)
{
fc_assert(pplayer != NULL);
fc_assert(pplayer != nullptr);
players_iterate_alive(oplayer) {
if (oplayer == pplayer) {
......
/* The victim gets a casus belli if CASUS_BELLI_VICTIM or above. Everyone
* gets a casus belli if CASUS_BELLI_OUTRAGE or above. */
casus_belli_amount =
get_target_bonus_effects(NULL,
get_target_bonus_effects(nullptr,
&(const struct req_context) {
.player = offender,
.city = tile_city(tgt_tile),
......
/* An array of mutually exclusive requirement sets for the DiplRel
* requirement type. Is initialized the first time diplrel_mess_get() is
* called. */
static bv_diplrel_all_reqs *diplrel_mess = NULL;
static bv_diplrel_all_reqs *diplrel_mess = nullptr;
/*******************************************************************//**
Get the mutually exclusive requirement sets for DiplRel.
***********************************************************************/
static bv_diplrel_all_reqs *diplrel_mess_get(void)
{
if (diplrel_mess == NULL) {
if (diplrel_mess == nullptr) {
/* This is the first call. Initialize diplrel_mess. */
diplrel_mess = diplrel_mess_gen();
}
......
***********************************************************************/
void diplrel_mess_close(void)
{
if (diplrel_mess != NULL) {
if (diplrel_mess != nullptr) {
free(diplrel_mess);
diplrel_mess = NULL;
diplrel_mess = nullptr;
}
}
......
will not be found (this function doesn't cheat).
***********************************************************************/
int player_in_territory(const struct player *pplayer,
const struct player *pplayer2)
const struct player *pplayer2)
{
int in_territory = 0;
......
case PLRS_BARBARIAN:
return is_barbarian(pplayer);
case PLRS_HAS_CAPITAL:
return player_primary_capital(pplayer) != NULL;
return player_primary_capital(pplayer) != nullptr;
case PLRS_LAST:
fc_assert(state != PLRS_LAST);
break;
common/player.h
int techout;
int landarea;
int settledarea;
int population; /* in thousand of citizen */
int population; /* In thousand of citizen */
int cities;
int units;
int pollution;
......
struct player_ai {
int maxbuycost;
void *handicaps;
enum ai_level skill_level; /* 0-10 value for save/load/display */
int fuzzy; /* chance in 1000 to mis-decide */
int expand; /* percentage factor to value new cities */
enum ai_level skill_level; /* 0-10 value for save/load/display */
int fuzzy; /* Chance in 1000 to mis-decide */
int expand; /* Percentage factor to value new cities */
int science_cost; /* Cost in bulbs to get new tech, relative
to non-AI players (100: Equal cost) */
int warmth, frost; /* threat of global warming / nuclear winter */
int warmth, frost; /* Threat of global warming / nuclear winter */
enum barbarian_type barbarian_type;
int love[MAX_NUM_PLAYER_SLOTS];
......
#define SPECENUM_VALUE6NAME N_("?diplomatic_state:Team")
/* When adding or removing entries, note that first value
* of diplrel_other should be next to last diplstate_type */
#define SPECENUM_COUNT DS_LAST /* leave this last */
#define SPECENUM_COUNT DS_LAST /* Leave this last */
#include "specenum_gen.h"
/* Other diplomatic relation properties.
......
struct attribute_block_s {
void *data;
int length;
#define MAX_ATTRIBUTE_BLOCK (256*1024) /* largest attribute block */
#define MAX_ATTRIBUTE_BLOCK (256*1024) /* Largest attribute block */
};
struct ai_type;
......
char name[MAX_LEN_NAME];
char username[MAX_LEN_NAME];
bool unassigned_user;
char ranked_username[MAX_LEN_NAME]; /* the user who will be ranked */
char ranked_username[MAX_LEN_NAME]; /* The user who will be ranked */
bool unassigned_ranked;
int user_turns; /* number of turns this user has played */
int user_turns; /* Number of turns this user has played */
bool is_male;
struct government *government; /* may be NULL in pregame */
struct government *target_government; /* may be NULL */
struct government *government; /* May be nullptr in pregame */
struct government *target_government; /* May be nullptr */
struct nation_type *nation;
struct team *team;
bool is_ready; /* Did the player click "start" yet? */
......
bool can_player_see_hypotetic_units_at(const struct player *pplayer,
const struct tile *ptile);
bool can_player_see_unit(const struct player *pplayer,
const struct unit *punit);
const struct unit *punit);
bool can_player_see_unit_at(const struct player *pplayer,
const struct unit *punit,
const struct unit *punit,
const struct tile *ptile,
bool is_transported);
bool can_player_see_tile(const struct player *plr,
const struct tile *ptile);
bool can_player_see_units_in_city(const struct player *pplayer,
const struct city *pcity);
const struct city *pcity);
bool can_player_see_city_internals(const struct player *pplayer,
const struct city *pcity);
const struct city *pcity);
bool player_can_see_city_externals(const struct player *pow_player,
const struct city *target_city);
bool player_owns_city(const struct player *pplayer,
const struct city *pcity);
const struct city *pcity);
bool player_can_invade_tile(const struct player *pplayer,
const struct tile *ptile);
......
bool player_in_city_map(const struct player *pplayer,
const struct tile *ptile);
bool player_knows_techs_with_flag(const struct player *pplayer,
enum tech_flag_id flag);
enum tech_flag_id flag);
int num_known_tech_with_flag(const struct player *pplayer,
enum tech_flag_id flag);
enum tech_flag_id flag);
int player_get_expected_income(const struct player *pplayer);
struct city *player_primary_capital(const struct player *pplayer);
......
struct player_diplstate *player_diplstate_get(const struct player *plr1,
const struct player *plr2);
bool are_diplstates_equal(const struct player_diplstate *pds1,
const struct player_diplstate *pds2);
const struct player_diplstate *pds2);
enum dipl_reason pplayer_can_make_treaty(const struct player *p1,
const struct player *p2,
enum diplstate_type treaty);
enum dipl_reason pplayer_can_cancel_treaty(const struct player *p1,
const struct player *p2);
bool pplayers_at_war(const struct player *pplayer,
const struct player *pplayer2);
const struct player *pplayer2);
bool pplayers_allied(const struct player *pplayer,
const struct player *pplayer2);
const struct player *pplayer2);
bool pplayers_in_peace(const struct player *pplayer,
const struct player *pplayer2);
bool players_non_invade(const struct player *pplayer1,
const struct player *pplayer2);
const struct player *pplayer2);
bool pplayers_non_attack(const struct player *pplayer,
const struct player *pplayer2);
const struct player *pplayer2);
bool players_on_same_team(const struct player *pplayer1,
const struct player *pplayer2);
int player_in_territory(const struct player *pplayer,
const struct player *pplayer2);
const struct player *pplayer2);
/**************************************************************************
Return TRUE iff player is any kind of barbarian
......
#define player_slots_iterate(_pslot) \
if (player_slots_initialised()) { \
struct player_slot *_pslot = player_slot_first(); \
for (; NULL != _pslot; _pslot = player_slot_next(_pslot)) {
for (; _pslot != nullptr; _pslot = player_slot_next(_pslot)) {
#define player_slots_iterate_end \
} \
}
/* iterate over all players, which are used at the moment */
/* Iterate over all players, which are used at the moment */
#define players_iterate(_pplayer) \
player_slots_iterate(_pslot##_pplayer) { \
struct player *_pplayer = player_slot_get_player(_pslot##_pplayer); \
if (_pplayer != NULL) {
if (_pplayer != nullptr) {
#define players_iterate_end \
} \
} player_slots_iterate_end;
/* iterate over all players, which are used at the moment and are alive */
/* Iterate over all players, which are used at the moment and are alive */
#define players_iterate_alive(_pplayer) \
players_iterate(_pplayer) { \
if (!_pplayer->is_alive) { \
......
#define players_iterate_alive_end \
} players_iterate_end;
/* get 'struct player_list' and related functions: */
/* Get 'struct player_list' and related functions: */
#define SPECLIST_TAG player
#define SPECLIST_TYPE struct player
#include "speclist.h"
......
#define player_list_iterate_end \
LIST_ITERATE_END
/* ai love values should be in range [-MAX_AI_LOVE..MAX_AI_LOVE] */
/* AI love values should be in range [-MAX_AI_LOVE..MAX_AI_LOVE] */
#define MAX_AI_LOVE 1000
    (1-1/1)