recalculate [first,last) after lighthouses aand trvelthru

This commit is contained in:
Enno Rehling 2016-09-13 09:09:35 +02:00
parent 652ead4f60
commit 71fa3600f7
6 changed files with 40 additions and 36 deletions

View File

@ -96,7 +96,6 @@ set (ERESSEA_SRC
guard.c guard.c
prefix.c prefix.c
donations.c donations.c
seen.c
eressea.c eressea.c
callback.c callback.c
direction.c direction.c
@ -197,7 +196,6 @@ set(TESTS_SRC
tests.test.c tests.test.c
volcano.test.c volcano.test.c
reports.test.c reports.test.c
seen.test.c
summary.test.c summary.test.c
travelthru.test.c travelthru.test.c
callback.test.c callback.test.c

View File

@ -170,7 +170,8 @@ static int potion_luck(unit *u, region *r, attrib_type *atype, int amount) {
} }
static int potion_truth(unit *u) { static int potion_truth(unit *u) {
fset(u, UFL_DISBELIEVES); // TODO: this potion does nothing!
// fset(u, UFL_DISBELIEVES);
return 1; return 1;
} }

View File

@ -23,7 +23,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "chaos.h" #include "chaos.h"
#include "move.h" #include "move.h"
#include "laws.h" #include "laws.h"
#include "seen.h"
#include "skill.h" #include "skill.h"
#include "monster.h" #include "monster.h"
@ -2884,7 +2883,7 @@ static void battle_punit(unit * u, battle * b)
faction *f = bf->faction; faction *f = bf->faction;
strlist *S = 0, *x; strlist *S = 0, *x;
spunit(&S, f, u, 4, see_battle); spunit(&S, f, u, 4, seen_battle);
for (x = S; x; x = x->next) { for (x = S; x; x = x->next) {
fbattlerecord(b, f, x->s); fbattlerecord(b, f, x->s);
if (bdebug && u->faction == f) { if (bdebug && u->faction == f) {

View File

@ -11,7 +11,6 @@ without prior permission by the authors of Eressea.
#include <kernel/config.h> #include <kernel/config.h>
#include <kernel/version.h> #include <kernel/version.h>
#include "creport.h" #include "creport.h"
#include "seen.h"
#include "travelthru.h" #include "travelthru.h"
/* tweakable features */ /* tweakable features */

View File

@ -1372,6 +1372,31 @@ void reorder_units(region * r)
} }
} }
static region *lastregion(faction * f)
{
#ifdef SMART_INTERVALS
return f->last->next;
#else
return NULL;
#endif
}
static region *firstregion(faction * f)
{
#ifdef SMART_INTERVALS
region *r = f->first;
if (f->units == NULL)
return NULL;
if (r != NULL)
return r;
return f->first = regions;
#else
return regions;
#endif
}
static void cb_add_seen(region *r, unit *u, void *cbdata) { static void cb_add_seen(region *r, unit *u, void *cbdata) {
unused_arg(cbdata); unused_arg(cbdata);
faction_add_seen(u->faction, r, seen_travel); faction_add_seen(u->faction, r, seen_travel);
@ -1391,6 +1416,9 @@ void prepare_seen(report_context *ctx)
static bool rule_region_owners; static bool rule_region_owners;
const struct building_type *bt_lighthouse = bt_find("lighthouse"); const struct building_type *bt_lighthouse = bt_find("lighthouse");
// [fast,last) interval of regions with a unit in it
ctx->first = firstregion(f);
ctx->last = lastregion(f);
if (config_changed(&config)) { if (config_changed(&config)) {
rule_region_owners = config_token("rules.region_owner_pay_building", bt_lighthouse->_name); rule_region_owners = config_token("rules.region_owner_pay_building", bt_lighthouse->_name);
} }
@ -1421,7 +1449,7 @@ void prepare_seen(report_context *ctx)
if (u_race(u) != get_race(RC_SPELL) || u->number == RS_FARVISION) { if (u_race(u) != get_race(RC_SPELL) || u->number == RS_FARVISION) {
faction_add_seen(f, r, seen_unit); faction_add_seen(f, r, seen_unit);
} }
if (fval(r, RF_LIGHTHOUSE) { if (fval(r, RF_LIGHTHOUSE)) {
// TODO: is the building big enough for the unit? // TODO: is the building big enough for the unit?
if (u->building && u->building->type == bt_lighthouse) { if (u->building && u->building->type == bt_lighthouse) {
/* we are in a lighthouse. add the regions we can see from here! */ /* we are in a lighthouse. add the regions we can see from here! */
@ -1435,6 +1463,11 @@ void prepare_seen(report_context *ctx)
travelthru_map(r, cb_add_seen, ctx); travelthru_map(r, cb_add_seen, ctx);
} }
} }
// [fast,last) interval of seen regions (with lighthouses and travel)
// TODO: what about neighbours? when are they included? do we need
// them outside of the CR?
ctx->first = firstregion(f);
ctx->last = lastregion(f);
} }
static void cb_set_last(region *r, unit *u, void *cbdata) { static void cb_set_last(region *r, unit *u, void *cbdata) {
@ -1444,40 +1477,13 @@ static void cb_set_last(region *r, unit *u, void *cbdata) {
} }
} }
static region *lastregion(faction * f)
{
#ifdef SMART_INTERVALS
return f->last->next;
#else
return NULL;
#endif
}
static region *firstregion(faction * f)
{
#ifdef SMART_INTERVALS
region *r = f->first;
if (f->units == NULL)
return NULL;
if (r != NULL)
return r;
return f->first = regions;
#else
return regions;
#endif
}
static void prepare_report(report_context *ctx, faction *f) static void prepare_report(report_context *ctx, faction *f)
{ {
ctx->f = f; ctx->f = f;
ctx->report_time = time(NULL); ctx->report_time = time(NULL);
ctx->addresses = NULL; ctx->addresses = NULL;
ctx->userdata = NULL; ctx->userdata = NULL;
ctx->first = firstregion(f); prepare_seen(ctx);
ctx->last = lastregion(f);
prepare_seen(&ctx);
} }
static void finish_reports(report_context *ctx) { static void finish_reports(report_context *ctx) {

View File

@ -56,7 +56,6 @@ extern "C" {
void spunit(struct strlist **SP, const struct faction *f, void spunit(struct strlist **SP, const struct faction *f,
const struct unit *u, unsigned int indent, seen_mode mode); const struct unit *u, unsigned int indent, seen_mode mode);
void prepare_seen(struct faction *f);
int reports(void); int reports(void);
int write_reports(struct faction *f, time_t ltime); int write_reports(struct faction *f, time_t ltime);
int init_reports(void); int init_reports(void);
@ -75,6 +74,8 @@ extern "C" {
time_t report_time; time_t report_time;
} report_context; } report_context;
void prepare_seen(struct report_context *ctx);
typedef int(*report_fun) (const char *filename, report_context * ctx, typedef int(*report_fun) (const char *filename, report_context * ctx,
const char *charset); const char *charset);
void register_reporttype(const char *extension, report_fun write, void register_reporttype(const char *extension, report_fun write,