reduce code duplication: itemcloak code was copied between NR and CR.

This commit is contained in:
Enno Rehling 2016-08-29 19:37:47 +01:00
parent 5a73fc80d8
commit 40d9ebfa94
5 changed files with 33 additions and 64 deletions

View File

@ -742,13 +742,10 @@ void cr_output_unit(stream *out, const region * r, const faction * f,
const char *str;
const item_type *lasttype;
int pr;
item *itm, *show;
item *itm, *show = NULL;
building *b;
const char *pzTmp;
skill *sv;
bool itemcloak = false;
static const curse_type *itemcloak_ct = 0;
static bool init = false;
item result[MAX_INVENTORY];
const faction *sf;
const char *prefix;
@ -758,15 +755,6 @@ void cr_output_unit(stream *out, const region * r, const faction * f,
if (fval(u_race(u), RCF_INVISIBLE))
return;
if (!init) {
init = true;
itemcloak_ct = ct_find("itemcloak");
}
if (itemcloak_ct != NULL) {
curse * cu = get_curse(u->attribs, itemcloak_ct);
itemcloak = cu && curse_active(cu);
}
stream_printf(out, "EINHEIT %d\n", u->no);
stream_printf(out, "\"%s\";Name\n", unit_getname(u));
str = u_description(u, f->locale);
@ -970,16 +958,14 @@ void cr_output_unit(stream *out, const region * r, const faction * f,
if (f == u->faction || omniscient(f)) {
show = u->items;
}
else if (!itemcloak && mode >= see_unit) {
int n = report_items(u->items, result, MAX_INVENTORY, u, f);
assert(n >= 0);
if (n > 0)
show = result;
else
show = NULL;
}
else {
show = NULL;
if (mode >= see_unit) {
int n = report_items(u, result, MAX_INVENTORY, u, f);
assert(n >= 0);
if (n > 0) {
show = result;
}
}
}
lasttype = NULL;
for (itm = show; itm; itm = itm->next) {

View File

@ -897,18 +897,10 @@ default_wage(const region * r, const faction * f, const race * rc, int in_turn)
{
building *b = largestbuilding(r, &cmp_wage, false);
int esize = 0;
curse *c;
double wage;
attrib *a;
const building_type *artsculpture_type = bt_find("artsculpture");
static const curse_type *drought_ct, *blessedharvest_ct;
static bool init;
if (!init) {
init = true;
drought_ct = ct_find("drought");
blessedharvest_ct = ct_find("blessedharvest");
}
const struct curse_type *ctype;
if (b != NULL) {
/* TODO: this reveals imaginary castles */
@ -937,7 +929,7 @@ default_wage(const region * r, const faction * f, const race * rc, int in_turn)
}
if (rule_blessed_harvest() == HARVEST_WORK) {
/* E1 rules */
wage += curse_geteffect(get_curse(r->attribs, blessedharvest_ct));
wage += curse_geteffect(get_curse(r->attribs, ct_find("blessedharvest")));
}
}
@ -954,8 +946,9 @@ default_wage(const region * r, const faction * f, const race * rc, int in_turn)
}
/* Bei einer Dürre verdient man nur noch ein Viertel */
if (drought_ct) {
c = get_curse(r->attribs, drought_ct);
ctype = ct_find("drought");
if (ctype) {
curse *c = get_curse(r->attribs, ctype);
if (curse_active(c))
wage /= curse_geteffect(c);
}

View File

@ -265,16 +265,24 @@ static size_t buforder(char *buffer, size_t size, const order * ord, int mode)
* \param viewer: the faction looking at the items
*/
int
report_items(const item * items, item * result, int size, const unit * owner,
const faction * viewer)
report_items(const unit *u, item * result, int size, const unit * owner,
const faction * viewer)
{
const item *itm;
const item *itm, *items = u->items;
int n = 0; /* number of results */
bool itemcloak = false;
const curse_type *itemcloak_ct = ct_find("itemcloak");
assert(owner == NULL || viewer != owner->faction
|| !"not required for owner=viewer!");
assert(owner == NULL || viewer != owner->faction);
assert(size);
if (itemcloak_ct) {
curse * cu = get_curse(u->attribs, itemcloak_ct);
itemcloak = cu && curse_active(cu);
}
if (itemcloak) {
return 0;
}
for (itm = items; itm; itm = itm->next) {
item *ishow;
const char *ic;
@ -455,20 +463,12 @@ size_t size)
const char *pzTmp, *str;
building *b;
bool isbattle = (bool)(mode == see_battle);
item *itm;
item *show;
item *itm, *show = NULL;
faction *fv = visible_faction(f, u);
char *bufp = buf;
bool itemcloak = false;
const curse_type *itemcloak_ct = 0;
int result = 0;
item results[MAX_INVENTORY];
itemcloak_ct = ct_find("itemcloak");
if (itemcloak_ct) {
itemcloak = curse_active(get_curse(u->attribs, itemcloak_ct));
}
bufp = STRLCPY(bufp, unitname(u), size);
if (!isbattle) {
@ -599,16 +599,12 @@ size_t size)
if (f == u->faction || omniscient(f)) {
show = u->items;
}
else if (!itemcloak && mode >= see_unit) {
int n = report_items(u->items, results, MAX_INVENTORY, u, f);
else if (mode >= see_unit) {
int n = report_items(u, results, MAX_INVENTORY, u, f);
assert(n >= 0);
if (n > 0)
if (n > 0) {
show = results;
else
show = NULL;
}
else {
show = NULL;
}
}
for (itm = show; itm; itm = itm->next) {
const char *ic;

View File

@ -107,7 +107,7 @@ extern "C" {
void view_neighbours(struct seen_region **seen, struct region * r, struct faction * f);
int report_resources(const struct seen_region *sr,
struct resource_report *result, int size, const struct faction *viewer);
int report_items(const struct item *items, struct item *result, int size,
int report_items(const struct unit *u, struct item *result, int size,
const struct unit *owner, const struct faction *viewer);
void report_item(const struct unit *owner, const struct item *i,
const struct faction *viewer, const char **name, const char **basename,

View File

@ -959,13 +959,7 @@ int sp_strong_wall(struct castorder * co)
unit *mage = fi->unit;
building *burg;
double effect;
static bool init = false;
message *msg;
static const curse_type *strongwall_ct;
if (!init) {
init = true;
strongwall_ct = ct_find("strongwall");
}
if (!mage->building) {
return 0;
@ -973,7 +967,7 @@ int sp_strong_wall(struct castorder * co)
burg = mage->building;
effect = power / 4;
create_curse(mage, &burg->attribs, strongwall_ct, power, 1, effect, 0);
create_curse(mage, &burg->attribs, ct_find("strongwall"), power, 1, effect, 0);
msg =
msg_message("sp_strongwalls_effect", "mage building", mage, mage->building);