Project

General

Profile

Feature #247 ยป 0033-Unhardcode-wld.map-from-tri_req_present.patch

Marko Lindqvist, 02/10/2024 03:42 PM

View differences:

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);
    (1-1/1)