forked from github/server
move seen_region logic to a separate seen.[hc] module for testing.
currently failing test: 1) Failure (tests.report.test_lighthouse): ./scripts/tests/common.lua:1051: true expected but was false
This commit is contained in:
parent
d64948f0fc
commit
9312b44f8e
|
@ -86,6 +86,7 @@ set (ERESSEA_SRC
|
||||||
names.c
|
names.c
|
||||||
lighthouse.c
|
lighthouse.c
|
||||||
reports.c
|
reports.c
|
||||||
|
seen.c
|
||||||
eressea.c
|
eressea.c
|
||||||
callback.c
|
callback.c
|
||||||
direction.c
|
direction.c
|
||||||
|
|
|
@ -23,6 +23,7 @@ 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"
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ without prior permission by the authors of Eressea.
|
||||||
#include "bindings.h"
|
#include "bindings.h"
|
||||||
#include "move.h"
|
#include "move.h"
|
||||||
#include "reports.h"
|
#include "reports.h"
|
||||||
|
#include "seen.h"
|
||||||
|
|
||||||
/* attributes includes */
|
/* attributes includes */
|
||||||
#include <attributes/racename.h>
|
#include <attributes/racename.h>
|
||||||
|
|
|
@ -25,6 +25,7 @@ without prior permission by the authors of Eressea.
|
||||||
#include "helpers.h"
|
#include "helpers.h"
|
||||||
#include "console.h"
|
#include "console.h"
|
||||||
#include "reports.h"
|
#include "reports.h"
|
||||||
|
#include "seen.h"
|
||||||
|
|
||||||
#include <kernel/config.h>
|
#include <kernel/config.h>
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ without prior permission by the authors of Eressea.
|
||||||
#include <kernel/config.h>
|
#include <kernel/config.h>
|
||||||
#include "buildno.h"
|
#include "buildno.h"
|
||||||
#include "creport.h"
|
#include "creport.h"
|
||||||
|
#include "seen.h"
|
||||||
#include "travelthru.h"
|
#include "travelthru.h"
|
||||||
|
|
||||||
/* tweakable features */
|
/* tweakable features */
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "reports.h"
|
#include "reports.h"
|
||||||
#include "jsreport.h"
|
#include "jsreport.h"
|
||||||
|
#include "seen.h"
|
||||||
#include <kernel/faction.h>
|
#include <kernel/faction.h>
|
||||||
#include <kernel/region.h>
|
#include <kernel/region.h>
|
||||||
#include <kernel/terrain.h>
|
#include <kernel/terrain.h>
|
||||||
|
|
|
@ -22,6 +22,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
#include <kernel/config.h>
|
#include <kernel/config.h>
|
||||||
|
|
||||||
#include "reports.h"
|
#include "reports.h"
|
||||||
|
#include "seen.h"
|
||||||
#include "laws.h"
|
#include "laws.h"
|
||||||
#include "travelthru.h"
|
#include "travelthru.h"
|
||||||
#include "monster.h"
|
#include "monster.h"
|
||||||
|
|
119
src/reports.c
119
src/reports.c
|
@ -20,6 +20,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
#include <kernel/config.h>
|
#include <kernel/config.h>
|
||||||
#include "reports.h"
|
#include "reports.h"
|
||||||
#include "laws.h"
|
#include "laws.h"
|
||||||
|
#include "seen.h"
|
||||||
#include "travelthru.h"
|
#include "travelthru.h"
|
||||||
#include "lighthouse.h"
|
#include "lighthouse.h"
|
||||||
|
|
||||||
|
@ -1090,121 +1091,6 @@ static void get_addresses(report_context * ctx)
|
||||||
ctx->addresses = flist;
|
ctx->addresses = flist;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MAXSEEHASH 0x1000
|
|
||||||
seen_region *reuse;
|
|
||||||
|
|
||||||
seen_region **seen_init(void)
|
|
||||||
{
|
|
||||||
return (seen_region **)calloc(MAXSEEHASH, sizeof(seen_region *));
|
|
||||||
}
|
|
||||||
|
|
||||||
void seen_done(seen_region * seehash[])
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i != MAXSEEHASH; ++i) {
|
|
||||||
seen_region *sd = seehash[i];
|
|
||||||
if (sd == NULL)
|
|
||||||
continue;
|
|
||||||
while (sd->nextHash != NULL)
|
|
||||||
sd = sd->nextHash;
|
|
||||||
sd->nextHash = reuse;
|
|
||||||
reuse = seehash[i];
|
|
||||||
seehash[i] = NULL;
|
|
||||||
}
|
|
||||||
/* free(seehash); */
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_seen(void)
|
|
||||||
{
|
|
||||||
while (reuse) {
|
|
||||||
seen_region *r = reuse;
|
|
||||||
reuse = reuse->nextHash;
|
|
||||||
free(r);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
link_seen(seen_region * seehash[], const region * first, const region * last)
|
|
||||||
{
|
|
||||||
const region *r = first;
|
|
||||||
seen_region *sr = NULL;
|
|
||||||
|
|
||||||
if (first == last)
|
|
||||||
return;
|
|
||||||
|
|
||||||
do {
|
|
||||||
sr = find_seen(seehash, r);
|
|
||||||
r = r->next;
|
|
||||||
} while (sr == NULL && r != last);
|
|
||||||
|
|
||||||
while (r != last) {
|
|
||||||
seen_region *sn = find_seen(seehash, r);
|
|
||||||
if (sn != NULL) {
|
|
||||||
sr->next = sn;
|
|
||||||
sr = sn;
|
|
||||||
}
|
|
||||||
r = r->next;
|
|
||||||
}
|
|
||||||
if (sr) sr->next = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
seen_region *find_seen(struct seen_region *seehash[], const region * r)
|
|
||||||
{
|
|
||||||
unsigned int index = reg_hashkey(r) & (MAXSEEHASH - 1);
|
|
||||||
seen_region *find = seehash[index];
|
|
||||||
while (find) {
|
|
||||||
if (find->r == r)
|
|
||||||
return find;
|
|
||||||
find = find->nextHash;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void get_seen_interval(report_context * ctx)
|
|
||||||
{
|
|
||||||
/* this is required to find the neighbour regions of the ones we are in,
|
|
||||||
* which may well be outside of [firstregion, lastregion) */
|
|
||||||
int i;
|
|
||||||
|
|
||||||
assert(ctx->f->seen);
|
|
||||||
for (i = 0; i != MAXSEEHASH; ++i) {
|
|
||||||
seen_region *sr = ctx->f->seen[i];
|
|
||||||
while (sr != NULL) {
|
|
||||||
if (ctx->first == NULL || sr->r->index < ctx->first->index) {
|
|
||||||
ctx->first = sr->r;
|
|
||||||
}
|
|
||||||
if (ctx->last != NULL && sr->r->index >= ctx->last->index) {
|
|
||||||
ctx->last = sr->r->next;
|
|
||||||
}
|
|
||||||
sr = sr->nextHash;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
link_seen(ctx->f->seen, ctx->first, ctx->last);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
add_seen(struct seen_region *seehash[], struct region *r, unsigned char mode,
|
|
||||||
bool dis)
|
|
||||||
{
|
|
||||||
seen_region *find = find_seen(seehash, r);
|
|
||||||
if (find == NULL) {
|
|
||||||
unsigned int index = reg_hashkey(r) & (MAXSEEHASH - 1);
|
|
||||||
if (!reuse)
|
|
||||||
reuse = (seen_region *)calloc(1, sizeof(struct seen_region));
|
|
||||||
find = reuse;
|
|
||||||
reuse = reuse->nextHash;
|
|
||||||
find->nextHash = seehash[index];
|
|
||||||
seehash[index] = find;
|
|
||||||
find->r = r;
|
|
||||||
}
|
|
||||||
else if (find->mode >= mode) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
find->mode = mode;
|
|
||||||
find->disbelieves |= dis;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct report_type {
|
typedef struct report_type {
|
||||||
struct report_type *next;
|
struct report_type *next;
|
||||||
report_fun write;
|
report_fun write;
|
||||||
|
@ -1653,7 +1539,8 @@ static void prepare_report(struct report_context *ctx, faction *f)
|
||||||
view(f->seen, r, f);
|
view(f->seen, r, f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
get_seen_interval(ctx);
|
get_seen_interval(ctx->f->seen, &ctx->first, &ctx->last);
|
||||||
|
link_seen(ctx->f->seen, ctx->first, ctx->last);
|
||||||
}
|
}
|
||||||
|
|
||||||
int write_reports(faction * f, time_t ltime)
|
int write_reports(faction * f, time_t ltime)
|
||||||
|
|
|
@ -26,7 +26,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
#include <kernel/types.h>
|
#include <kernel/types.h>
|
||||||
|
|
||||||
struct stream;
|
struct stream;
|
||||||
|
struct seen_region;
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
@ -64,35 +64,8 @@ extern "C" {
|
||||||
const struct unit *ucansee(const struct faction *f,
|
const struct unit *ucansee(const struct faction *f,
|
||||||
const struct unit *u, const struct unit *x);
|
const struct unit *u, const struct unit *x);
|
||||||
|
|
||||||
enum {
|
|
||||||
see_none,
|
|
||||||
see_neighbour,
|
|
||||||
see_lighthouse,
|
|
||||||
see_travel,
|
|
||||||
see_far,
|
|
||||||
see_unit,
|
|
||||||
see_battle
|
|
||||||
};
|
|
||||||
int stealth_modifier(int seen_mode);
|
int stealth_modifier(int seen_mode);
|
||||||
|
|
||||||
typedef struct seen_region {
|
|
||||||
struct seen_region *nextHash;
|
|
||||||
struct seen_region *next;
|
|
||||||
struct region *r;
|
|
||||||
unsigned char mode;
|
|
||||||
bool disbelieves;
|
|
||||||
} seen_region;
|
|
||||||
|
|
||||||
struct seen_region *find_seen(struct seen_region *seehash[],
|
|
||||||
const struct region *r);
|
|
||||||
bool add_seen(struct seen_region *seehash[], struct region *r,
|
|
||||||
unsigned char mode, bool dis);
|
|
||||||
struct seen_region **seen_init(void);
|
|
||||||
void seen_done(struct seen_region *seehash[]);
|
|
||||||
void free_seen(void);
|
|
||||||
void link_seen(seen_region * seehash[], const struct region *first,
|
|
||||||
const struct region *last);
|
|
||||||
|
|
||||||
typedef struct report_context {
|
typedef struct report_context {
|
||||||
struct faction *f;
|
struct faction *f;
|
||||||
struct quicklist *addresses;
|
struct quicklist *addresses;
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include "report.h"
|
#include "report.h"
|
||||||
#include "creport.h"
|
#include "creport.h"
|
||||||
#include "move.h"
|
#include "move.h"
|
||||||
|
#include "seen.h"
|
||||||
#include "travelthru.h"
|
#include "travelthru.h"
|
||||||
|
|
||||||
#include <kernel/building.h>
|
#include <kernel/building.h>
|
||||||
|
|
|
@ -0,0 +1,142 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) 1998-2015, Enno Rehling <enno@eressea.de>
|
||||||
|
Katja Zedel <katze@felidae.kn-bremen.de
|
||||||
|
Christian Schlittchen <corwin@amber.kn-bremen.de>
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
**/
|
||||||
|
|
||||||
|
#include <platform.h>
|
||||||
|
#include <kernel/config.h>
|
||||||
|
#include "seen.h"
|
||||||
|
|
||||||
|
#include <kernel/region.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define MAXSEEHASH 0x1000
|
||||||
|
seen_region *reuse;
|
||||||
|
|
||||||
|
seen_region **seen_init(void)
|
||||||
|
{
|
||||||
|
return (seen_region **)calloc(MAXSEEHASH, sizeof(seen_region *));
|
||||||
|
}
|
||||||
|
|
||||||
|
void seen_done(seen_region * seehash[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i != MAXSEEHASH; ++i) {
|
||||||
|
seen_region *sd = seehash[i];
|
||||||
|
if (sd == NULL)
|
||||||
|
continue;
|
||||||
|
while (sd->nextHash != NULL)
|
||||||
|
sd = sd->nextHash;
|
||||||
|
sd->nextHash = reuse;
|
||||||
|
reuse = seehash[i];
|
||||||
|
seehash[i] = NULL;
|
||||||
|
}
|
||||||
|
/* free(seehash); */
|
||||||
|
}
|
||||||
|
|
||||||
|
void free_seen(void)
|
||||||
|
{
|
||||||
|
while (reuse) {
|
||||||
|
seen_region *r = reuse;
|
||||||
|
reuse = reuse->nextHash;
|
||||||
|
free(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
link_seen(seen_region * seehash[], const region * first, const region * last)
|
||||||
|
{
|
||||||
|
const region *r = first;
|
||||||
|
seen_region *sr = NULL;
|
||||||
|
|
||||||
|
if (first == last)
|
||||||
|
return;
|
||||||
|
|
||||||
|
do {
|
||||||
|
sr = find_seen(seehash, r);
|
||||||
|
r = r->next;
|
||||||
|
} while (sr == NULL && r != last);
|
||||||
|
|
||||||
|
while (r != last) {
|
||||||
|
seen_region *sn = find_seen(seehash, r);
|
||||||
|
if (sn != NULL) {
|
||||||
|
sr->next = sn;
|
||||||
|
sr = sn;
|
||||||
|
}
|
||||||
|
r = r->next;
|
||||||
|
}
|
||||||
|
if (sr) sr->next = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
seen_region *find_seen(struct seen_region *seehash[], const region * r)
|
||||||
|
{
|
||||||
|
unsigned int index = reg_hashkey(r) & (MAXSEEHASH - 1);
|
||||||
|
seen_region *find = seehash[index];
|
||||||
|
while (find) {
|
||||||
|
if (find->r == r) {
|
||||||
|
return find;
|
||||||
|
}
|
||||||
|
find = find->nextHash;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void get_seen_interval(struct seen_region *seen[], struct region **firstp, struct region **lastp)
|
||||||
|
{
|
||||||
|
/* this is required to find the neighbour regions of the ones we are in,
|
||||||
|
* which may well be outside of [firstregion, lastregion) */
|
||||||
|
int i;
|
||||||
|
region *first, *last;
|
||||||
|
|
||||||
|
assert(seen && firstp && lastp);
|
||||||
|
first = *firstp;
|
||||||
|
last = *lastp;
|
||||||
|
for (i = 0; i != MAXSEEHASH; ++i) {
|
||||||
|
seen_region *sr = seen[i];
|
||||||
|
while (sr != NULL) {
|
||||||
|
if (first == NULL || sr->r->index < first->index) {
|
||||||
|
first = sr->r;
|
||||||
|
}
|
||||||
|
if (last != NULL && sr->r->index >= last->index) {
|
||||||
|
last = sr->r->next;
|
||||||
|
}
|
||||||
|
sr = sr->nextHash;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool add_seen(struct seen_region *seehash[], struct region *r, int mode, bool dis)
|
||||||
|
{
|
||||||
|
seen_region *find = find_seen(seehash, r);
|
||||||
|
if (find == NULL) {
|
||||||
|
unsigned int index = reg_hashkey(r) & (MAXSEEHASH - 1);
|
||||||
|
if (!reuse)
|
||||||
|
reuse = (seen_region *)calloc(1, sizeof(struct seen_region));
|
||||||
|
find = reuse;
|
||||||
|
reuse = reuse->nextHash;
|
||||||
|
find->nextHash = seehash[index];
|
||||||
|
seehash[index] = find;
|
||||||
|
find->r = r;
|
||||||
|
}
|
||||||
|
else if (find->mode >= mode) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
find->mode = mode;
|
||||||
|
find->disbelieves |= dis;
|
||||||
|
return true;
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
#pragma once
|
||||||
|
/*
|
||||||
|
Copyright (c) 1998-2015, Enno Rehling <enno@eressea.de>
|
||||||
|
Katja Zedel <katze@felidae.kn-bremen.de
|
||||||
|
Christian Schlittchen <corwin@amber.kn-bremen.de>
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef H_SEEN_REGION
|
||||||
|
#define H_SEEN_REGION
|
||||||
|
|
||||||
|
struct region;
|
||||||
|
struct seen_region;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
enum {
|
||||||
|
see_none,
|
||||||
|
see_neighbour,
|
||||||
|
see_lighthouse,
|
||||||
|
see_travel,
|
||||||
|
see_far,
|
||||||
|
see_unit,
|
||||||
|
see_battle
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct seen_region {
|
||||||
|
struct seen_region *nextHash;
|
||||||
|
struct seen_region *next;
|
||||||
|
struct region *r;
|
||||||
|
unsigned char mode;
|
||||||
|
bool disbelieves;
|
||||||
|
} seen_region;
|
||||||
|
|
||||||
|
struct seen_region **seen_init(void);
|
||||||
|
void seen_done(struct seen_region *seehash[]);
|
||||||
|
void free_seen(void);
|
||||||
|
void link_seen(struct seen_region *seehash[], const struct region * first, const struct region * last);
|
||||||
|
struct seen_region *find_seen(struct seen_region *seehash[], const struct region * r);
|
||||||
|
void get_seen_interval(struct seen_region *seen[], struct region **firstp, struct region **lastp);
|
||||||
|
bool add_seen(struct seen_region *seehash[], struct region *r, int mode, bool dis);
|
||||||
|
void link_seen(struct seen_region *seehash[], const struct region *first, const struct region *last);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
Loading…
Reference in New Issue