Feature #247 ยป 0033-Unhardcode-wld.map-from-tri_req_present.patch
| common/requirements.c | ||
|---|---|---|
|
static universal_found universal_found_function[VUT_COUNT] = {NULL};
|
||
|
static
|
||
|
enum fc_tristate tri_req_present(const struct req_context *context,
|
||
|
enum fc_tristate tri_req_present(const struct civ_map *nmap,
|
||
|
const struct req_context *context,
|
||
|
const struct player *other_player,
|
||
|
const struct requirement *req);
|
||
| ... | ... | |
|
ruleset objects passed in the context.
|
||
|
**************************************************************************/
|
||
|
static enum req_unchanging_status
|
||
|
unchanging_local(enum req_unchanging_status def,
|
||
|
unchanging_local(const struct civ_map *nmap,
|
||
|
enum req_unchanging_status def,
|
||
|
const struct req_context *context,
|
||
|
const struct requirement *req)
|
||
|
{
|
||
| ... | ... | |
|
}
|
||
|
#define REQUC_LOCAL unchanging_local
|
||
|
/**********************************************************************//**
|
||
|
If not present, may appear; but once becomes present, never goes absent
|
||
|
**************************************************************************/
|
||
|
static enum req_unchanging_status
|
||
|
unchanging_present(enum req_unchanging_status def,
|
||
|
unchanging_present(const struct civ_map *nmap,
|
||
|
enum req_unchanging_status def,
|
||
|
const struct req_context *context,
|
||
|
const struct requirement *req)
|
||
|
{
|
||
|
if (TRI_YES != tri_req_present(context, NULL, req)) {
|
||
|
if (TRI_YES != tri_req_present(nmap, context, NULL, req)) {
|
||
|
return REQUCH_NO;
|
||
|
}
|
||
|
return def;
|
||
| ... | ... | |
|
Equals ..._present(), but never changes in World range
|
||
|
**************************************************************************/
|
||
|
static enum req_unchanging_status
|
||
|
unchanging_world(enum req_unchanging_status def,
|
||
|
unchanging_world(const struct civ_map *nmap,
|
||
|
enum req_unchanging_status def,
|
||
|
const struct req_context *context,
|
||
|
const struct requirement *req)
|
||
|
{
|
||
|
return
|
||
|
unchanging_present(req->range == REQ_RANGE_WORLD ? REQUCH_YES : def,
|
||
|
unchanging_present(nmap, req->range == REQ_RANGE_WORLD ? REQUCH_YES : def,
|
||
|
context, req);
|
||
|
}
|
||
|
#define REQUC_WORLD unchanging_world
|
||
| ... | ... | |
|
Alliances may break, team members may be destroyed or reassigned
|
||
|
**************************************************************************/
|
||
|
static enum req_unchanging_status
|
||
|
unchanging_noally(enum req_unchanging_status def,
|
||
|
unchanging_noally(const struct civ_map *nmap,
|
||
|
enum req_unchanging_status def,
|
||
|
const struct req_context *context,
|
||
|
const struct requirement *req)
|
||
|
{
|
||
| ... | ... | |
|
req_copy(&preq, req);
|
||
|
preq.range = REQ_RANGE_PLAYER;
|
||
|
if (TRI_YES != tri_req_present(context, NULL, &preq)) {
|
||
|
if (TRI_YES != tri_req_present(nmap, context, NULL, &preq)) {
|
||
|
return REQ_RANGE_TEAM == req->range ? REQUCH_ACT : REQUCH_NO;
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
Special CityTile case handler
|
||
|
**************************************************************************/
|
||
|
static enum req_unchanging_status
|
||
|
unchanging_citytile(enum req_unchanging_status def,
|
||
|
unchanging_citytile(const struct civ_map *nmap,
|
||
|
enum req_unchanging_status def,
|
||
|
const struct req_context *context,
|
||
|
const struct requirement *req)
|
||
|
{
|
||
| ... | ... | |
|
Special CityStatus case handler. Changes easily save for owner.
|
||
|
**************************************************************************/
|
||
|
static enum req_unchanging_status
|
||
|
unchanging_citystatus(enum req_unchanging_status def,
|
||
|
unchanging_citystatus(const struct civ_map *nmap,
|
||
|
enum req_unchanging_status def,
|
||
|
const struct req_context *context,
|
||
|
const struct requirement *req)
|
||
|
{
|
||
| ... | ... | |
|
it subjects to wonder building rules. Also, there is obsoletion...
|
||
|
**************************************************************************/
|
||
|
static enum req_unchanging_status
|
||
|
unchanging_building(enum req_unchanging_status def,
|
||
|
unchanging_building(const struct civ_map *nmap,
|
||
|
enum req_unchanging_status def,
|
||
|
const struct req_context *context,
|
||
|
const struct requirement *req)
|
||
|
{
|
||
| ... | ... | |
|
if (great_wonder_is_destroyed(b)
|
||
|
|| (!great_wonder_is_available(b)
|
||
|
&& (req->range <= REQ_RANGE_CITY && TRI_YES
|
||
|
== tri_req_present(context, NULL, req)))) {
|
||
|
== tri_req_present(nmap, context, NULL, req)))) {
|
||
|
/* If the wonder stays somewhere, it may either remain there
|
||
|
* or be destroyed. If it is destroyed, it is nowhere. */
|
||
|
return REQUCH_SCRIPTS;
|
||
| ... | ... | |
|
const struct requirement *req,
|
||
|
const enum req_problem_type prob_type)
|
||
|
{
|
||
|
enum fc_tristate eval = tri_req_present(context, other_player, req);
|
||
|
const struct civ_map *nmap = &(wld.map);
|
||
|
enum fc_tristate eval = tri_req_present(nmap, context, other_player, req);
|
||
|
if (eval == TRI_MAYBE) {
|
||
|
if (prob_type == RPT_POSSIBLE) {
|
||
| ... | ... | |
|
and will produce TRI_MAYBE if req needs them to evaluate.
|
||
|
**************************************************************************/
|
||
|
static
|
||
|
enum fc_tristate tri_req_present(const struct req_context *context,
|
||
|
enum fc_tristate tri_req_present(const struct civ_map *nmap,
|
||
|
const struct req_context *context,
|
||
|
const struct player *other_player,
|
||
|
const struct requirement *req)
|
||
|
{
|
||
| ... | ... | |
|
fc_assert_ret_val(req_definitions[req->source.kind].cb != NULL, TRI_NO);
|
||
|
return req_definitions[req->source.kind].cb(&(wld.map), context,
|
||
|
return req_definitions[req->source.kind].cb(nmap, context,
|
||
|
other_player, req);
|
||
|
}
|
||
| ... | ... | |
|
const struct player *other_player,
|
||
|
const struct requirement *req)
|
||
|
{
|
||
|
enum fc_tristate eval = tri_req_present(context, other_player, req);
|
||
|
const struct civ_map *nmap = &(wld.map);
|
||
|
enum fc_tristate eval = tri_req_present(nmap, context, other_player, req);
|
||
|
if (!req->present) {
|
||
|
if (TRI_NO == eval) {
|
||
| ... | ... | |
|
const struct requirement *req)
|
||
|
{
|
||
|
enum req_unchanging_status s;
|
||
|
const struct civ_map *nmap = &(wld.map);
|
||
|
fc_assert_ret_val(req, REQUCH_NO);
|
||
|
fc_assert_ret_val_msg(universals_n_is_valid(req->source.kind), REQUCH_NO,
|
||
| ... | ... | |
|
}
|
||
|
}
|
||
|
}
|
||
|
s = unchanging_present(s, context, req);
|
||
|
s = unchanging_present(nmap, s, context, req);
|
||
|
if (s != REQUCH_NO) {
|
||
|
return unchanging_noally(s, context, req);
|
||
|
return unchanging_noally(nmap, s, context, req);
|
||
|
}
|
||
|
} else {
|
||
|
req_unchanging_cond_cb cond
|
||
|
= req_definitions[req->source.kind].unchanging_cond;
|
||
|
if (cond) {
|
||
|
return cond(s, context, req);
|
||
|
return cond(nmap, s, context, req);
|
||
|
}
|
||
|
}
|
||
| common/requirements.h | ||
|---|---|---|
|
/* common */
|
||
|
#include "fc_types.h"
|
||
|
#include "map_types.h"
|
||
|
struct astring;
|
||
| ... | ... | |
|
* to another one (usually higher but not always)
|
||
|
* Passing other_player is just not needed for it in any known cases */
|
||
|
typedef enum req_unchanging_status
|
||
|
(*req_unchanging_cond_cb)(enum req_unchanging_status def,
|
||
|
(*req_unchanging_cond_cb)(const struct civ_map *nmap,
|
||
|
enum req_unchanging_status def,
|
||
|
const struct req_context *context,
|
||
|
const struct requirement *req);
|
||