PyObject* get_buildable_units_in_city(struct city* pCity) { PyObject* list = PyList_New(0); bool can_build; unit_type_iterate(un) { can_build = can_player_build_unit_now(client.conn.playing, un); can_build = can_build && can_city_build_unit_now(pCity, un); if (can_build) { const char* name = utype_name_translation(un); int attack = un->attack_strength; int defense = un->defense_strength; int moves = un->move_rate; int stock = pCity->shield_stock; int cost = utype_build_shield_cost(un); int turns = -1; //city_turns_to_build(pCity, cid_production(cid_encode_unit(un)), TRUE) PyList_Append(list, Py_BuildValue( "lisiii(iii)O", (long)un, VUT_UTYPE, name, turns, stock, cost, attack, defense, moves, (PyObject*)get_unittype_sprite(tileset, un) )); } } unit_type_iterate_end; return list; }
/******************************************************************* Chooses the best available and usable air unit and records it in choice, if it's better than previous choice The interface is somewhat different from other ai_choose, but that's what it should be like, I believe -- GB ******************************************************************/ bool dai_choose_attacker_air(struct ai_type *ait, struct player *pplayer, struct city *pcity, struct adv_choice *choice) { bool want_something = FALSE; /* This AI doesn't know to build planes */ if (ai_handicap(pplayer, H_NOPLANES)) { return FALSE; } /* military_advisor_choose_build does something idiotic, * this function should not be called if there is danger... */ if (choice->want >= 100 && choice->type != CT_ATTACKER) { return FALSE; } if (!player_knows_techs_with_flag(pplayer, TF_BUILD_AIRBORNE)) { return FALSE; } unit_type_iterate(punittype) { struct unit_class *pclass = utype_class(punittype); if (pclass->adv.land_move == MOVE_NONE || pclass->adv.sea_move == MOVE_NONE || uclass_has_flag(pclass, UCF_TERRAIN_SPEED) || unit_type_is_losing_hp(pplayer, punittype)) { /* We don't consider this a plane */ continue; } if (can_city_build_unit_now(pcity, punittype)) { struct unit *virtual_unit = unit_virtual_create(pplayer, pcity, punittype, do_make_unit_veteran(pcity, punittype)); int profit = find_something_to_bomb(ait, virtual_unit, NULL, NULL); if (profit > choice->want){ /* Update choice */ choice->want = profit; choice->value.utype = punittype; choice->type = CT_ATTACKER; choice->need_boat = FALSE; want_something = TRUE; log_debug("%s wants to build %s (want=%d)", city_name(pcity), utype_rule_name(punittype), profit); } else { log_debug("%s doesn't want to build %s (want=%d)", city_name(pcity), utype_rule_name(punittype), profit); } unit_virtual_destroy(virtual_unit); } } unit_type_iterate_end; return want_something; }