Feature #139 » 0029-Unhardcode-wld.map-from-unit_transform_result.patch
client/gui-gtk-3.22/menu.c | ||
---|---|---|
units_can_do_action(punits, ACTION_DISBAND_UNIT,
|
||
TRUE));
|
||
menu_entry_set_sensitive("UNIT_UPGRADE",
|
||
units_can_upgrade(punits));
|
||
units_can_upgrade(&(wld.map), punits));
|
||
/* "UNIT_CONVERT" dealt with below */
|
||
menu_entry_set_sensitive("UNIT_HOMECITY",
|
||
can_units_do(punits, can_unit_change_homecity));
|
||
... | ... | |
menus_rename("UNIT_UPGRADE", _("Upgr_ade"));
|
||
}
|
||
if (units_can_convert(punits)) {
|
||
if (units_can_convert(&(wld.map), punits)) {
|
||
menu_entry_set_sensitive("UNIT_CONVERT", TRUE);
|
||
if (units_all_same_type) {
|
||
struct unit *punit = unit_list_get(punits, 0);
|
||
/* TRANS: %s is a unit type. */
|
||
fc_snprintf(acttext, sizeof(acttext), _("C_onvert to %s"),
|
||
utype_name_translation(unit_type_get(punit)->converted_to));
|
client/gui-gtk-4.0/menu.c | ||
---|---|---|
ACTIVITY_SENTRY));
|
||
menu_entry_set_sensitive(map, "UNIT_HOMECITY",
|
||
can_units_do(punits, can_unit_change_homecity));
|
||
menu_entry_set_sensitive(map, "UNIT_UPGRADE", units_can_upgrade(punits));
|
||
menu_entry_set_sensitive(map, "UNIT_CONVERT", units_can_convert(punits));
|
||
menu_entry_set_sensitive(map, "UNIT_UPGRADE", units_can_upgrade(&(wld.map), punits));
|
||
menu_entry_set_sensitive(map, "UNIT_CONVERT", units_can_convert(&(wld.map), punits));
|
||
menu_entry_set_sensitive(map, "UNIT_DISBAND",
|
||
units_can_do_action(punits, ACTION_DISBAND_UNIT,
|
||
TRUE));
|
||
... | ... | |
menus_rename(unit_menu, 13, "UNIT_UPGRADE", _("Upgr_ade"));
|
||
}
|
||
if (units_can_convert(punits)) {
|
||
if (units_can_convert(&(wld.map), punits)) {
|
||
if (units_all_same_type && num_units > 0) {
|
||
struct unit *punit = unit_list_get(punits, 0);
|
||
client/gui-qt/citydlg.cpp | ||
---|---|---|
unload_trans = NULL;
|
||
}
|
||
if (units_can_upgrade(qunits)) {
|
||
if (units_can_upgrade(&(wld.map), qunits)) {
|
||
upgrade = new QAction(_("Upgrade Unit"), this);
|
||
connect(upgrade, &QAction::triggered, this, &unit_item::upgrade_unit);
|
||
} else {
|
client/gui-qt/hudwidget.cpp | ||
---|---|---|
}
|
||
// Upgrade
|
||
if (UU_OK == unit_upgrade_test(current_unit, FALSE)) {
|
||
if (UU_OK == unit_upgrade_test(&(wld.map), current_unit, FALSE)) {
|
||
a = new hud_action(this);
|
||
a->action_shortcut = SC_UPGRADE_UNIT;
|
||
a->set_pixmap(fc_icons::instance()->get_pixmap("upgrade"));
|
client/gui-qt/menu.cpp | ||
---|---|---|
break;
|
||
case CONVERT:
|
||
if (units_can_convert(punits)) {
|
||
if (units_can_convert(&(wld.map), punits)) {
|
||
i.value()->setEnabled(true);
|
||
}
|
||
break;
|
||
... | ... | |
break;
|
||
case UPGRADE:
|
||
if (units_can_upgrade(punits)) {
|
||
if (units_can_upgrade(&(wld.map), punits)) {
|
||
i.value()->setEnabled(true);
|
||
}
|
||
break;
|
client/gui-sdl2/dialogs.c | ||
---|---|---|
unit_upgrade_dlg = fc_calloc(1, sizeof(struct small_dialog));
|
||
unit_upgrade_result = unit_upgrade_info(punit, cbuf, sizeof(cbuf));
|
||
unit_upgrade_result = unit_upgrade_info(&(wld.map), punit, cbuf, sizeof(cbuf));
|
||
pstr = create_utf8_from_char_fonto(_("Upgrade Obsolete Units"),
|
||
FONTO_ATTENTION);
|
client/gui-sdl2/menu.c | ||
---|---|---|
local_hide(ID_UNIT_ORDER_UPGRADE);
|
||
}
|
||
if (unit_can_convert(punit)) {
|
||
if (unit_can_convert(&(wld.map), punit)) {
|
||
local_show(ID_UNIT_ORDER_CONVERT);
|
||
} else {
|
||
local_hide(ID_UNIT_ORDER_CONVERT);
|
client/gui-sdl3/dialogs.c | ||
---|---|---|
unit_upgrade_dlg = fc_calloc(1, sizeof(struct small_dialog));
|
||
unit_upgrade_result = unit_upgrade_info(punit, cbuf, sizeof(cbuf));
|
||
unit_upgrade_result = unit_upgrade_info(&(wld.map), punit, cbuf, sizeof(cbuf));
|
||
pstr = create_utf8_from_char_fonto(_("Upgrade Obsolete Units"),
|
||
FONTO_ATTENTION);
|
client/gui-sdl3/menu.c | ||
---|---|---|
local_hide(ID_UNIT_ORDER_UPGRADE);
|
||
}
|
||
if (unit_can_convert(punit)) {
|
||
if (unit_can_convert(&(wld.map), punit)) {
|
||
local_show(ID_UNIT_ORDER_CONVERT);
|
||
} else {
|
||
local_hide(ID_UNIT_ORDER_CONVERT);
|
client/text.c | ||
---|---|---|
fc_snprintf(buf, bufsz, _("No units to upgrade!"));
|
||
return FALSE;
|
||
} else if (unit_list_size(punits) == 1) {
|
||
return (UU_OK == unit_upgrade_info(unit_list_front(punits), buf, bufsz));
|
||
return (UU_OK == unit_upgrade_info(&(wld.map), unit_list_front(punits), buf, bufsz));
|
||
} else {
|
||
int upgrade_cost = 0;
|
||
int num_upgraded = 0;
|
||
... | ... | |
unit_list_iterate(punits, punit) {
|
||
if (unit_owner(punit) == client_player()
|
||
&& UU_OK == unit_upgrade_test(punit, FALSE)) {
|
||
&& UU_OK == unit_upgrade_test(&(wld.map), punit, FALSE)) {
|
||
const struct unit_type *from_unittype = unit_type_get(punit);
|
||
const struct unit_type *to_unittype = can_upgrade_unittype(client.conn.playing,
|
||
from_unittype);
|
common/actions.c | ||
---|---|---|
const struct city *homecity)
|
||
{
|
||
enum action_result result = paction->result;
|
||
const struct civ_map *nmap = &(wld.map);
|
||
if (actor == NULL) {
|
||
actor = req_context_empty();
|
||
... | ... | |
case ACTRES_CONVERT:
|
||
/* Reason: Keep the old rules. */
|
||
/* Info leak: The player knows their unit's cargo and location. */
|
||
if (!unit_can_convert(actor->unit)) {
|
||
if (!unit_can_convert(nmap, actor->unit)) {
|
||
return TRI_NO;
|
||
}
|
||
break;
|
common/actres.c | ||
---|---|---|
* of cargo, they can predict if there will be enough room in the unit
|
||
* upgraded to, as long as they know what unit type their unit will end
|
||
* up as. */
|
||
if (unit_upgrade_test(actor->unit, FALSE) != UU_OK) {
|
||
if (unit_upgrade_test(nmap, actor->unit, FALSE) != UU_OK) {
|
||
return TRI_NO;
|
||
}
|
||
common/scriptcore/api_game_methods.c | ||
---|---|---|
bool api_methods_unit_can_upgrade(lua_State *L, Unit *punit, bool is_free)
|
||
{
|
||
return UU_OK == unit_upgrade_test(punit, is_free);
|
||
return UU_OK == unit_upgrade_test(&(wld.map), punit, is_free);
|
||
}
|
||
/**********************************************************************//**
|
||
... | ... | |
LUASCRIPT_CHECK_SELF(L, punit, NULL);
|
||
LUASCRIPT_CHECK_ARG_NIL(L, ptype, 3, Unit_Type, NULL);
|
||
uu = unit_transform_result(punit, ptype);
|
||
uu = unit_transform_result(&(wld.map), punit, ptype);
|
||
switch (uu) {
|
||
case UU_OK:
|
||
return NULL;
|
common/unit.c | ||
---|---|---|
in result.
|
||
**************************************************************************/
|
||
enum unit_upgrade_result
|
||
unit_transform_result(const struct unit *punit,
|
||
unit_transform_result(const struct civ_map *nmap,
|
||
const struct unit *punit,
|
||
const struct unit_type *to_unittype)
|
||
{
|
||
fc_assert_ret_val(NULL != to_unittype, UU_NO_UNITTYPE);
|
||
... | ... | |
utype_class(to_unittype))) {
|
||
return UU_UNSUITABLE_TRANSPORT;
|
||
}
|
||
} else if (!can_exist_at_tile(&(wld.map), to_unittype, unit_tile(punit))) {
|
||
} else if (!can_exist_at_tile(nmap, to_unittype, unit_tile(punit))) {
|
||
/* The new unit type can't survive on this terrain. */
|
||
return UU_NOT_TERRAIN;
|
||
}
|
||
... | ... | |
Note that this function is strongly tied to unittools.c:transform_unit().
|
||
**************************************************************************/
|
||
enum unit_upgrade_result unit_upgrade_test(const struct unit *punit,
|
||
enum unit_upgrade_result unit_upgrade_test(const struct civ_map *nmap,
|
||
const struct unit *punit,
|
||
bool is_free)
|
||
{
|
||
struct player *pplayer = unit_owner(punit);
|
||
... | ... | |
return UU_NOT_IN_CITY;
|
||
}
|
||
if (city_owner(pcity) != pplayer) {
|
||
/* TODO: should upgrades in allied cities be possible? */
|
||
/* TODO: Should upgrades in allied cities be possible? */
|
||
return UU_NOT_CITY_OWNER;
|
||
}
|
||
}
|
||
/* TODO: allow transported units to be reassigned. Check here
|
||
/* TODO: Allow transported units to be reassigned. Check here
|
||
* and make changes to upgrade_unit. */
|
||
return unit_transform_result(punit, to_unittype);
|
||
return unit_transform_result(nmap, punit, to_unittype);
|
||
}
|
||
/**********************************************************************//**
|
||
Tests if unit can be converted to another type.
|
||
**************************************************************************/
|
||
bool unit_can_convert(const struct unit *punit)
|
||
bool unit_can_convert(const struct civ_map *nmap,
|
||
const struct unit *punit)
|
||
{
|
||
const struct unit_type *tgt = unit_type_get(punit)->converted_to;
|
||
... | ... | |
return FALSE;
|
||
}
|
||
return UU_OK == unit_transform_result(punit, tgt);
|
||
return UU_OK == unit_transform_result(nmap, punit, tgt);
|
||
}
|
||
/**********************************************************************//**
|
||
Find the result of trying to upgrade the unit, and a message that
|
||
most callers can use directly.
|
||
**************************************************************************/
|
||
enum unit_upgrade_result unit_upgrade_info(const struct unit *punit,
|
||
enum unit_upgrade_result unit_upgrade_info(const struct civ_map *nmap,
|
||
const struct unit *punit,
|
||
char *buf, size_t bufsz)
|
||
{
|
||
struct player *pplayer = unit_owner(punit);
|
||
enum unit_upgrade_result result = unit_upgrade_test(punit, FALSE);
|
||
enum unit_upgrade_result result = unit_upgrade_test(nmap, punit, FALSE);
|
||
int upgrade_cost;
|
||
const struct unit_type *from_unittype = unit_type_get(punit);
|
||
const struct unit_type *to_unittype = can_upgrade_unittype(pplayer,
|
common/unit.h | ||
---|---|---|
const struct tile *ptile);
|
||
enum unit_upgrade_result
|
||
unit_transform_result(const struct unit *punit,
|
||
unit_transform_result(const struct civ_map *nmap,
|
||
const struct unit *punit,
|
||
const struct unit_type *to_unittype);
|
||
enum unit_upgrade_result unit_upgrade_test(const struct unit *punit,
|
||
enum unit_upgrade_result unit_upgrade_test(const struct civ_map *nmap,
|
||
const struct unit *punit,
|
||
bool is_free);
|
||
enum unit_upgrade_result unit_upgrade_info(const struct unit *punit,
|
||
enum unit_upgrade_result unit_upgrade_info(const struct civ_map *nmap,
|
||
const struct unit *punit,
|
||
char *buf, size_t bufsz);
|
||
bool unit_can_convert(const struct unit *punit);
|
||
bool unit_can_convert(const struct civ_map *nmap, const struct unit *punit);
|
||
int unit_pays_mp_for_action(const struct action *paction,
|
||
const struct unit *punit);
|
common/unitlist.c | ||
---|---|---|
Return TRUE iff any of the units can be upgraded to another unit type
|
||
(for money)
|
||
****************************************************************************/
|
||
bool units_can_upgrade(const struct unit_list *punits)
|
||
bool units_can_upgrade(const struct civ_map *nmap,
|
||
const struct unit_list *punits)
|
||
{
|
||
unit_list_iterate(punits, punit) {
|
||
if (UU_OK == unit_upgrade_test(punit, FALSE)) {
|
||
if (UU_OK == unit_upgrade_test(nmap, punit, FALSE)) {
|
||
return TRUE;
|
||
}
|
||
} unit_list_iterate_end;
|
||
... | ... | |
/************************************************************************//**
|
||
Return TRUE iff any of the units can convert to another unit type
|
||
****************************************************************************/
|
||
bool units_can_convert(const struct unit_list *punits)
|
||
bool units_can_convert(const struct civ_map *nmap,
|
||
const struct unit_list *punits)
|
||
{
|
||
unit_list_iterate(punits, punit) {
|
||
if (utype_can_do_action(unit_type_get(punit), ACTION_CONVERT)
|
||
&& unit_can_convert(punit)) {
|
||
&& unit_can_convert(nmap, punit)) {
|
||
return TRUE;
|
||
}
|
||
} unit_list_iterate_end;
|
common/unitlist.h | ||
---|---|---|
bool units_have_activity_on_tile(const struct unit_list *punits,
|
||
enum unit_activity activity);
|
||
bool units_can_upgrade(const struct unit_list *punits);
|
||
bool units_can_convert(const struct unit_list *punits);
|
||
bool units_can_upgrade(const struct civ_map *nmap,
|
||
const struct unit_list *punits);
|
||
bool units_can_convert(const struct civ_map *nmap,
|
||
const struct unit_list *punits);
|
||
#ifdef __cplusplus
|
||
}
|
server/scripting/api_server_edit.c | ||
---|---|---|
ur_transform_unit(struct unit *punit, const struct unit_type *to_unit,
|
||
int vet_loss)
|
||
{
|
||
if (UU_OK == unit_transform_result(punit, to_unit)) {
|
||
if (UU_OK == unit_transform_result(&(wld.map), punit, to_unit)) {
|
||
/* Avoid getting overt veteranship if a user requests increasing it */
|
||
if (vet_loss < 0) {
|
||
int vl = utype_veteran_levels(to_unit);
|
server/unithand.c | ||
---|---|---|
&& unit_perform_action(pplayer, punit->id, pcity->id, 0, "",
|
||
paction->id, ACT_REQ_SS_AGENT)) {
|
||
number_of_upgraded_units++;
|
||
} else if (UU_NO_MONEY == unit_upgrade_test(punit, FALSE)) {
|
||
} else if (UU_NO_MONEY == unit_upgrade_test(&(wld.map), punit, FALSE)) {
|
||
break;
|
||
}
|
||
}
|
||
... | ... | |
} else {
|
||
switch (paction->result) {
|
||
case ACTRES_UPGRADE_UNIT:
|
||
action_custom = unit_upgrade_test(punit, FALSE);
|
||
action_custom = unit_upgrade_test(nmap, punit, FALSE);
|
||
break;
|
||
case ACTRES_AIRLIFT:
|
||
action_custom = test_unit_can_airlift_to(nmap, NULL, punit, target_city);
|
server/unittools.c | ||
---|---|---|
unit_list_iterate(pplayer->units, punit) {
|
||
/* 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(punit, TRUE)) {
|
||
if (UU_OK == unit_upgrade_test(&(wld.map), punit, TRUE)) {
|
||
unit_list_prepend(candidates, punit); /* Potential candidate :) */
|
||
}
|
||
} unit_list_iterate_end;
|
||
... | ... | |
from_type = unit_type_get(punit);
|
||
to_type = from_type->converted_to;
|
||
if (unit_can_convert(punit)) {
|
||
if (unit_can_convert(&(wld.map), punit)) {
|
||
transform_unit(punit, to_type, 0);
|
||
notify_player(unit_owner(punit), unit_tile(punit),
|
||
E_UNIT_UPGRADED, ftc_server,
|