Bug #173 » 0043-Unhardcode-wld.map-from-action_hard_reqs_actor.patch
common/actions.c | ||
---|---|---|
may or may not be legal depending on the action.
|
||
**************************************************************************/
|
||
static enum fc_tristate
|
||
action_hard_reqs_actor(const struct action *paction,
|
||
action_hard_reqs_actor(const struct civ_map *nmap,
|
||
const struct action *paction,
|
||
const struct req_context *actor,
|
||
const bool omniscient,
|
||
const struct city *homecity)
|
||
{
|
||
enum action_result result = paction->result;
|
||
const struct civ_map *nmap = &(wld.map);
|
||
if (actor == NULL) {
|
||
actor = req_context_empty();
|
||
... | ... | |
}
|
||
/* Actor specific hard requirements. */
|
||
out = action_hard_reqs_actor(paction, actor, omniscient, homecity);
|
||
out = action_hard_reqs_actor(nmap, paction, actor, omniscient, homecity);
|
||
if (out == TRI_NO) {
|
||
/* Illegal because of a hard actor requirement. */
|
||
... | ... | |
/**********************************************************************//**
|
||
Returns the action probability for when a target is unseen.
|
||
**************************************************************************/
|
||
static struct act_prob act_prob_unseen_target(action_id act_id,
|
||
static struct act_prob act_prob_unseen_target(const struct civ_map *nmap,
|
||
action_id act_id,
|
||
const struct unit *actor_unit)
|
||
{
|
||
if (action_maybe_possible_actor_unit(act_id, actor_unit)) {
|
||
if (action_maybe_possible_actor_unit(nmap, act_id, actor_unit)) {
|
||
/* Unknown because the target is unseen. */
|
||
return ACTPROB_NOT_KNOWN;
|
||
} else {
|
||
... | ... | |
const struct impr_type *target_building;
|
||
const struct unit_type *target_utype;
|
||
const struct action *act = action_by_number(act_id);
|
||
const struct civ_map *nmap = &(wld.map);
|
||
if (actor_unit == NULL || target_city == NULL) {
|
||
/* Can't do an action when actor or target are missing. */
|
||
... | ... | |
if (!player_can_see_city_externals(unit_owner(actor_unit), target_city)) {
|
||
/* The invisible city at this tile may, as far as the player knows, not
|
||
* exist anymore. */
|
||
return act_prob_unseen_target(act_id, actor_unit);
|
||
return act_prob_unseen_target(nmap, act_id, actor_unit);
|
||
}
|
||
target_building = tgt_city_local_building(target_city);
|
||
... | ... | |
struct act_prob prob_all;
|
||
const struct req_context *actor_ctxt;
|
||
const struct action *act = action_by_number(act_id);
|
||
const struct civ_map *nmap = &(wld.map);
|
||
if (actor_unit == NULL || target_tile == NULL) {
|
||
/* Can't do an action when actor or target are missing. */
|
||
... | ... | |
return ACTPROB_IMPOSSIBLE;
|
||
} else {
|
||
/* The player doesn't know that the tile is empty. */
|
||
return act_prob_unseen_target(act_id, actor_unit);
|
||
return act_prob_unseen_target(nmap, act_id, actor_unit);
|
||
}
|
||
}
|
||
... | ... | |
performed right now by the specified actor unit if an approriate target
|
||
is provided.
|
||
**************************************************************************/
|
||
bool action_maybe_possible_actor_unit(const action_id act_id,
|
||
bool action_maybe_possible_actor_unit(const struct civ_map *nmap,
|
||
const action_id act_id,
|
||
const struct unit *actor_unit)
|
||
{
|
||
const struct player *actor_player = unit_owner(actor_unit);
|
||
... | ... | |
return FALSE;
|
||
}
|
||
result = action_hard_reqs_actor(paction, &actor_ctxt, FALSE,
|
||
result = action_hard_reqs_actor(nmap, paction, &actor_ctxt, FALSE,
|
||
unit_home(actor_unit));
|
||
if (result == TRI_NO) {
|
common/actions.h | ||
---|---|---|
/* common */
|
||
#include "actres.h"
|
||
#include "fc_types.h"
|
||
#include "map_types.h"
|
||
#include "requirements.h"
|
||
#ifdef __cplusplus
|
||
... | ... | |
const struct player *actor_player,
|
||
const struct city *target_city);
|
||
bool action_maybe_possible_actor_unit(const action_id wanted_action,
|
||
bool action_maybe_possible_actor_unit(const struct civ_map *nmap,
|
||
const action_id wanted_action,
|
||
const struct unit *actor_unit);
|
||
bool action_mp_full_makes_legal(const struct unit *actor,
|
common/unit.c | ||
---|---|---|
**************************************************************************/
|
||
bool can_unit_teleport(const struct unit *punit)
|
||
{
|
||
const struct civ_map *nmap = &(wld.map);
|
||
action_by_result_iterate(paction, ACTRES_TELEPORT) {
|
||
if (action_maybe_possible_actor_unit(action_id(paction), punit)) {
|
||
if (action_maybe_possible_actor_unit(nmap, action_id(paction), punit)) {
|
||
return TRUE;
|
||
}
|
||
} action_by_result_iterate_end;
|
||
... | ... | |
**************************************************************************/
|
||
bool can_unit_paradrop(const struct unit *punit)
|
||
{
|
||
const struct civ_map *nmap = &(wld.map);
|
||
action_by_result_iterate(paction, ACTRES_PARADROP) {
|
||
if (action_maybe_possible_actor_unit(action_id(paction), punit)) {
|
||
if (action_maybe_possible_actor_unit(nmap, action_id(paction), punit)) {
|
||
return TRUE;
|
||
}
|
||
} action_by_result_iterate_end;
|
||
action_by_result_iterate(paction, ACTRES_PARADROP_CONQUER) {
|
||
if (action_maybe_possible_actor_unit(action_id(paction), punit)) {
|
||
if (action_maybe_possible_actor_unit(nmap, action_id(paction), punit)) {
|
||
return TRUE;
|
||
}
|
||
} action_by_result_iterate_end;
|
server/unithand.c | ||
---|---|---|
int actor_target_distance;
|
||
const struct player_tile *plrtile;
|
||
int target_extra_id = target_extra_id_client;
|
||
const struct civ_map *nmap = &(wld.map);
|
||
/* No potentially legal action is known yet. If none is found the player
|
||
* should get an explanation. */
|
||
... | ... | |
actor_player = pc->playing;
|
||
actor_unit = game_unit_by_number(actor_unit_id);
|
||
target_tile = index_to_tile(&(wld.map), target_tile_id);
|
||
target_tile = index_to_tile(nmap, target_tile_id);
|
||
/* Initialize the action probabilities. */
|
||
action_iterate(act) {
|
||
... | ... | |
probabilities[act] = action_prob_vs_city(actor_unit, act,
|
||
target_city);
|
||
} else if (!tile_is_seen(target_tile, actor_player)
|
||
&& action_maybe_possible_actor_unit(act, actor_unit)
|
||
&& action_maybe_possible_actor_unit(nmap, act, actor_unit)
|
||
&& action_id_distance_accepted(act,
|
||
actor_target_distance)) {
|
||
/* The target city is non existing. The player isn't aware of this
|