diff --git a/src/gamecode/creport.c b/src/gamecode/creport.c index bdeddc230..cbf0d3564 100644 --- a/src/gamecode/creport.c +++ b/src/gamecode/creport.c @@ -49,6 +49,7 @@ without prior permission by the authors of Eressea. #include #include #include +#include #include #include #include @@ -1012,7 +1013,7 @@ static void cr_find_address(FILE * F, const faction * uf, quicklist * addresses) /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ -static void cr_reportspell(FILE * F, spell * sp, const struct locale *lang) +static void cr_reportspell(FILE * F, spell * sp, int level, const struct locale *lang) { int k; const char *name = @@ -1020,7 +1021,7 @@ static void cr_reportspell(FILE * F, spell * sp, const struct locale *lang) fprintf(F, "ZAUBER %d\n", hashstring(sp->sname)); fprintf(F, "\"%s\";name\n", name); - fprintf(F, "%d;level\n", sp->level); + fprintf(F, "%d;level\n", level); fprintf(F, "%d;rank\n", sp->rank); fprintf(F, "\"%s\";info\n", spell_info(sp, lang)); if (sp->parameter) @@ -1567,8 +1568,8 @@ report_computer(const char *filename, report_context * ctx, const char *charset) cr_find_address(F, f, ctx->addresses); a = a_find(f->attribs, &at_reportspell); while (a && a->type == &at_reportspell) { - spell *sp = (spell *) a->data.v; - cr_reportspell(F, sp, f->locale); + spellbook_entry *sbe = (spellbook_entry *) a->data.v; + cr_reportspell(F, sbe->sp, sbe->level, f->locale); a = a->next; } for (a = a_find(f->attribs, &at_showitem); a && a->type == &at_showitem; diff --git a/src/gamecode/report.c b/src/gamecode/report.c index c1bd48acc..fe58bf568 100644 --- a/src/gamecode/report.c +++ b/src/gamecode/report.c @@ -59,6 +59,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include +#include #include #include #include @@ -214,13 +215,14 @@ rparagraph(FILE * F, const char *str, ptrdiff_t indent, int hanging_indent, } while (*begin); } -static void nr_spell(FILE * F, spell * sp, const struct locale *lang) +static void nr_spell(FILE * F, spellbook_entry * sbe, const struct locale *lang) { int bytes, k, itemanz, costtyp; int dh = 0; char buf[4096]; char *bufp = buf; size_t size = sizeof(buf) - 1; + spell * sp = sbe->sp; const char *params = sp->parameter; rnl(F); @@ -251,7 +253,7 @@ static void nr_spell(FILE * F, spell * sp, const struct locale *lang) *bufp = 0; rparagraph(F, buf, 0, 0, 0); - sprintf(buf, "%s %d", LOC(lang, "nr_spell_level"), sp->level); + sprintf(buf, "%s %d", LOC(lang, "nr_spell_level"), sbe->level); rparagraph(F, buf, 0, 0, 0); sprintf(buf, "%s %d", LOC(lang, "nr_spell_rank"), sp->rank); @@ -278,7 +280,7 @@ static void nr_spell(FILE * F, spell * sp, const struct locale *lang) } } else { if (costtyp == SPC_LEVEL || costtyp == SPC_LINEAR) { - itemanz *= sp->level; + itemanz *= sbe->level; } bytes = snprintf(bufp, size, "%d %s", itemanz, LOC(lang, resourcename(rtype, @@ -2301,8 +2303,8 @@ report_plaintext(const char *filename, report_context * ctx, rnl(F); centre(F, LOC(f->locale, "section_newspells"), true); while (a && a->type == &at_reportspell) { - spell *sp = (spell *) a->data.v; - nr_spell(F, sp, f->locale); + spellbook_entry *sbe = (spellbook_entry *) a->data.v; + nr_spell(F, sbe, f->locale); a = a->next; } } diff --git a/src/kernel/magic.c b/src/kernel/magic.c index 69166f220..fff5008e3 100644 --- a/src/kernel/magic.c +++ b/src/kernel/magic.c @@ -86,10 +86,20 @@ const char *magic_school[MAXMAGIETYP] = { "common" }; -attrib_type at_reportspell = { - "reportspell", NULL, NULL, NULL, NO_WRITE, NO_READ -}; +static void a_init_reportspell(struct attrib *a) { + a->data.v = calloc(1, sizeof(spellbook_entry)); +} +static void a_finalize_reportspell(struct attrib *a) { + free(a->data.v); +} + +attrib_type at_reportspell = { + "reportspell", + a_init_reportspell, + a_finalize_reportspell, + 0, NO_WRITE, NO_READ +}; /** ** at_icastle ** TODO: separate castle-appearance from illusion-effects