Project

General

Profile

Feature #363 ยป 0051-Rename-action_._units-as-action_._stack.patch

Marko Lindqvist, 04/01/2024 12:05 PM

View differences:

ai/default/daitools.c
/* FIXME: try the next action if the unit tried to do an illegal action.
* That would allow the AI to stop using the omniscient
* is_action_enabled_unit_on_*() functions. */
if (is_action_enabled_unit_on_units(nmap, ACTION_CAPTURE_UNITS,
if (is_action_enabled_unit_on_stack(nmap, ACTION_CAPTURE_UNITS,
punit, ptile)) {
/* Choose capture. */
unit_do_action(unit_owner(punit), punit->id, tile_index(ptile),
0, "", ACTION_CAPTURE_UNITS);
} else if (is_action_enabled_unit_on_units(nmap, ACTION_BOMBARD_LETHAL,
} else if (is_action_enabled_unit_on_stack(nmap, ACTION_BOMBARD_LETHAL,
punit, ptile)) {
/* Choose "Bombard Lethal". */
unit_do_action(unit_owner(punit), punit->id, tile_index(ptile),
0, "", ACTION_BOMBARD_LETHAL);
} else if (is_action_enabled_unit_on_units(nmap, ACTION_BOMBARD,
} else if (is_action_enabled_unit_on_stack(nmap, ACTION_BOMBARD,
punit, ptile)) {
/* Choose "Bombard". */
unit_do_action(unit_owner(punit), punit->id, tile_index(ptile),
0, "", ACTION_BOMBARD);
} else if (is_action_enabled_unit_on_units(nmap, ACTION_BOMBARD2,
} else if (is_action_enabled_unit_on_stack(nmap, ACTION_BOMBARD2,
punit, ptile)) {
/* Choose "Bombard 2". */
unit_do_action(unit_owner(punit), punit->id, tile_index(ptile),
0, "", ACTION_BOMBARD2);
} else if (is_action_enabled_unit_on_units(nmap, ACTION_BOMBARD3,
} else if (is_action_enabled_unit_on_stack(nmap, ACTION_BOMBARD3,
punit, ptile)) {
/* Choose "Bombard 3". */
unit_do_action(unit_owner(punit), punit->id, tile_index(ptile),
0, "", ACTION_BOMBARD3);
} else if (is_action_enabled_unit_on_units(nmap, ACTION_NUKE_UNITS,
} else if (is_action_enabled_unit_on_stack(nmap, ACTION_NUKE_UNITS,
punit, ptile)) {
/* Choose "Nuke Units". */
unit_do_action(unit_owner(punit), punit->id, tile_index(ptile),
......
/* Choose "Nuke City". */
unit_do_action(unit_owner(punit), punit->id, tcity->id,
0, "", ACTION_NUKE_CITY);
} else if (is_action_enabled_unit_on_units(nmap, ACTION_ATTACK,
} else if (is_action_enabled_unit_on_stack(nmap, ACTION_ATTACK,
punit, ptile)) {
/* Choose regular attack. */
unit_do_action(unit_owner(punit), punit->id, tile_index(ptile),
0, "", ACTION_ATTACK);
} else if (is_action_enabled_unit_on_units(nmap, ACTION_SUICIDE_ATTACK,
} else if (is_action_enabled_unit_on_stack(nmap, ACTION_SUICIDE_ATTACK,
punit, ptile)) {
/* Choose suicide attack (explode missile). */
unit_do_action(unit_owner(punit), punit->id, tile_index(ptile),
client/control.c
break;
case ATK_UNITS:
if ((ptile = unit_tile(punit))
&& action_prob_possible(action_prob_vs_units(punit, act, ptile))) {
&& action_prob_possible(action_prob_vs_stack(punit, act, ptile))) {
request_do_action(act, punit->id, ptile->index, 0, "");
}
break;
common/actions.c
/* Can't be enabled. No target. */
continue;
}
if (is_action_enabled_unit_on_units(nmap, blocker->id,
if (is_action_enabled_unit_on_stack(nmap, blocker->id,
actor_unit, target_tile)) {
return blocker;
}
......
See note in is_action_enabled() for why the action may still be disabled.
**************************************************************************/
static bool
is_action_enabled_unit_on_units_full(const struct civ_map *nmap,
is_action_enabled_unit_on_stack_full(const struct civ_map *nmap,
const action_id wanted_action,
const struct unit *actor_unit,
const struct city *actor_home,
......
See note in is_action_enabled() for why the action may still be disabled.
**************************************************************************/
bool is_action_enabled_unit_on_units(const struct civ_map *nmap,
bool is_action_enabled_unit_on_stack(const struct civ_map *nmap,
const action_id wanted_action,
const struct unit *actor_unit,
const struct tile *target_tile)
{
return is_action_enabled_unit_on_units_full(nmap, wanted_action, actor_unit,
return is_action_enabled_unit_on_stack_full(nmap, wanted_action, actor_unit,
unit_home(actor_unit),
unit_tile(actor_unit),
target_tile);
......
action on all units at the target tile.
**************************************************************************/
static struct act_prob
action_prob_vs_units_full(const struct civ_map *nmap,
action_prob_vs_stack_full(const struct civ_map *nmap,
const struct unit *actor_unit,
const struct city *actor_home,
const struct tile *actor_tile,
......
Get the actor unit's probability of successfully performing the chosen
action on all units at the target tile.
**************************************************************************/
struct act_prob action_prob_vs_units(const struct unit *actor_unit,
struct act_prob action_prob_vs_stack(const struct unit *actor_unit,
const action_id act_id,
const struct tile *target_tile)
{
const struct civ_map *nmap = &(wld.map);
return action_prob_vs_units_full(nmap, actor_unit,
return action_prob_vs_stack_full(nmap, actor_unit,
unit_home(actor_unit),
unit_tile(actor_unit),
act_id,
......
switch (action_get_target_kind(paction)) {
case ATK_UNITS:
if (tgt_tile) {
prob = action_prob_vs_units(act_unit, paction->id, tgt_tile);
prob = action_prob_vs_stack(act_unit, paction->id, tgt_tile);
}
break;
case ATK_TILE:
......
game state changes.
**************************************************************************/
struct act_prob
action_speculate_unit_on_units(action_id act_id,
action_speculate_unit_on_stack(action_id act_id,
const struct unit *actor,
const struct city *actor_home,
const struct tile *actor_tile,
......
const struct civ_map *nmap = &(wld.map);
if (omniscient_cheat) {
if (is_action_enabled_unit_on_units_full(nmap, act_id,
if (is_action_enabled_unit_on_stack_full(nmap, act_id,
actor, actor_home, actor_tile,
target)) {
return ACTPROB_CERTAIN;
......
return ACTPROB_IMPOSSIBLE;
}
} else {
return action_prob_vs_units_full(nmap, actor, actor_home, actor_tile,
return action_prob_vs_stack_full(nmap, actor, actor_home, actor_tile,
act_id, target);
}
}
common/actions.h
const struct unit *actor_unit,
const struct unit *target_unit);
bool is_action_enabled_unit_on_units(const struct civ_map *nmap,
bool is_action_enabled_unit_on_stack(const struct civ_map *nmap,
const action_id wanted_action,
const struct unit *actor_unit,
const struct tile *target_tile);
......
const action_id act_id,
const struct unit* victim);
struct act_prob action_prob_vs_units(const struct unit* actor,
struct act_prob action_prob_vs_stack(const struct unit* actor,
const action_id act_id,
const struct tile* victims);
......
const struct unit *target);
struct act_prob
action_speculate_unit_on_units(action_id act_id,
action_speculate_unit_on_stack(action_id act_id,
const struct unit *actor,
const struct city *actor_home,
const struct tile *actor_tile,
server/actiontools.c
prob = action_prob_vs_extras(actor, act, target, target_extra);
break;
case ATK_UNITS:
prob = action_prob_vs_units(actor, act, target);
prob = action_prob_vs_stack(actor, act, target);
break;
case ATK_CITY:
case ATK_UNIT:
......
switch (action_id_get_target_kind(act)) {
case ATK_UNITS:
if (tgt_tile
&& is_action_enabled_unit_on_units(nmap, act, actor, tgt_tile)) {
&& is_action_enabled_unit_on_stack(nmap, act, actor, tgt_tile)) {
perform_action_to(act, actor, tgt_tile->index, EXTRA_NONE);
}
break;
......
switch (action_id_get_target_kind(act)) {
case ATK_UNITS:
if (tgt_tile
&& is_action_enabled_unit_on_units(nmap, act, actor, tgt_tile)) {
current = action_prob_vs_units(actor, act, tgt_tile);
&& is_action_enabled_unit_on_stack(nmap, act, actor, tgt_tile)) {
current = action_prob_vs_stack(actor, act, tgt_tile);
}
break;
case ATK_TILE:
server/advisors/autoworkers.c
FALSE);
break;
case ATK_UNITS:
return action_prob_possible(action_speculate_unit_on_units(
return action_prob_possible(action_speculate_unit_on_stack(
paction->id,
punit, unit_home(punit), ptile,
omniscient_cheat,
server/scripting/api_server_edit.c
fc_assert_ret_val(action_get_actor_kind(paction) == AAK_UNIT, FALSE);
switch (action_get_target_kind(paction)) {
case ATK_UNITS:
enabled = is_action_enabled_unit_on_units(nmap, paction->id, punit, tgt);
enabled = is_action_enabled_unit_on_stack(nmap, paction->id, punit, tgt);
break;
case ATK_TILE:
enabled = is_action_enabled_unit_on_tile(nmap, paction->id, punit,
......
fc_assert_ret_val(action_get_actor_kind(paction) == AAK_UNIT, FALSE);
switch (action_get_target_kind(paction)) {
case ATK_UNITS:
enabled = is_action_enabled_unit_on_units(nmap, paction->id, punit, tgt);
enabled = is_action_enabled_unit_on_stack(nmap, paction->id, punit, tgt);
break;
case ATK_TILE:
enabled = is_action_enabled_unit_on_tile(nmap, paction->id, punit,
server/unithand.c
case ATK_UNITS:
if (target_tile) {
/* Calculate the probabilities. */
probabilities[act] = action_prob_vs_units(actor_unit, act,
probabilities[act] = action_prob_vs_stack(actor_unit, act,
target_tile);
} else {
/* No target to act against. */
......
#define ACTION_PERFORM_UNIT_UNITS(action, actor, target, action_performer)\
if (target_tile \
&& is_action_enabled_unit_on_units(nmap, action_type, \
&& is_action_enabled_unit_on_stack(nmap, action_type, \
actor_unit, target_tile)) { \
bool success; \
script_server_signal_emit("action_started_unit_units", \
server/unittools.c
switch (action_id_get_target_kind(order.action)) {
case ATK_UNITS:
prob = action_prob_vs_units(punit, order.action,
prob = action_prob_vs_stack(punit, order.action,
dst_tile);
tgt_id = dst_tile->index;
break;
......
struct tile *dest = mapstep(&(wld.map), curtile, dirs[choice]);
if (dest != NULL) {
if (action_prob_possible(action_prob_vs_units(punit, ACTION_ATTACK,
if (action_prob_possible(action_prob_vs_stack(punit, ACTION_ATTACK,
dest))) {
if (unit_perform_action(pplayer, id, tile_index(dest), NO_TARGET,
"", ACTION_ATTACK, ACT_REQ_RULES)) {
    (1-1/1)