diff --git a/res/e3a/spells.xml b/res/e3a/spells.xml
index 498777952..4bb3470d8 100644
--- a/res/e3a/spells.xml
+++ b/res/e3a/spells.xml
@@ -585,7 +585,7 @@
-
+
diff --git a/res/eressea/spells.xml b/res/eressea/spells.xml
index 6bd5fc9c4..015d64a7e 100644
--- a/res/eressea/spells.xml
+++ b/res/eressea/spells.xml
@@ -313,7 +313,7 @@
-
+
@@ -332,7 +332,7 @@
-
+
diff --git a/src/kernel/xmlreader.c b/src/kernel/xmlreader.c
index 28a351a72..d5aba590b 100644
--- a/src/kernel/xmlreader.c
+++ b/src/kernel/xmlreader.c
@@ -1484,6 +1484,16 @@ static int parse_spells(xmlDocPtr doc)
sp->sptyp |= FARCASTING;
if (xml_bvalue(node, "variable", false))
sp->sptyp |= SPELLLEVEL;
+
+ if (xml_bvalue(node, "buildingtarget", false))
+ sp->sptyp |= BUILDINGSPELL;
+ if (xml_bvalue(node, "shiptarget", false))
+ sp->sptyp |= SHIPSPELL;
+ if (xml_bvalue(node, "unittarget", false))
+ sp->sptyp |= UNITSPELL;
+ if (xml_bvalue(node, "regiontarget", false))
+ sp->sptyp |= REGIONSPELL;
+
k = xml_ivalue(node, "combat", 0);
if (k >= 0 && k <= 3)
sp->sptyp |= modes[k];
diff --git a/src/report.c b/src/report.c
index 42a9e8cdf..6cafe1d9d 100644
--- a/src/report.c
+++ b/src/report.c
@@ -305,7 +305,7 @@ void nr_spell(stream *out, spellbook_entry * sbe, const struct locale *lang)
if (sp->sptyp & SPELLLEVEL) {
bytes =
_snprintf(bufp, size, " %d %s", itemanz, LOC(lang, resourcename(rtype,
- itemanz != 1)));
+ itemanz != 1)));
if (wrptr(&bufp, &size, bytes) != 0)
WARN_STATIC_BUFFER();
if (costtyp == SPC_LEVEL || costtyp == SPC_LINEAR) {
@@ -464,24 +464,24 @@ void nr_spell(stream *out, spellbook_entry * sbe, const struct locale *lang)
if (sp->sptyp & targetp->flag)
++maxparam;
}
- if (maxparam > 1) {
+ if (!maxparam || maxparam > 1) {
bytes = (int)strlcpy(bufp, " (", size);
if (wrptr(&bufp, &size, bytes) != 0)
WARN_STATIC_BUFFER();
}
i = 0;
for (targetp = targets; targetp->flag; ++targetp) {
- if (sp->sptyp & targetp->flag) {
+ if (!maxparam || sp->sptyp & targetp->flag) {
if (i++ != 0) {
bytes = (int)strlcpy(bufp, " |", size);
if (wrptr(&bufp, &size, bytes) != 0)
WARN_STATIC_BUFFER();
}
- if (targetp->param) {
+ if (targetp->param && targetp->vars) {
locp = LOC(lang, targetp->vars);
bytes =
(int)_snprintf(bufp, size, " %s <%s>", parameters[targetp->param],
- locp);
+ locp);
if (*params == '+') {
++params;
if (wrptr(&bufp, &size, bytes) != 0)
@@ -497,7 +497,7 @@ void nr_spell(stream *out, spellbook_entry * sbe, const struct locale *lang)
WARN_STATIC_BUFFER();
}
}
- if (maxparam > 1) {
+ if (!maxparam || maxparam > 1) {
bytes = (int)strlcpy(bufp, " )", size);
if (wrptr(&bufp, &size, bytes) != 0)
WARN_STATIC_BUFFER();