diff --git a/src/creport.c b/src/creport.c index 53c542470..345aaf0bc 100644 --- a/src/creport.c +++ b/src/creport.c @@ -719,7 +719,7 @@ static void cr_output_spells(stream *out, const unit * u, int maxlevel) spellbook_entry * sbe = (spellbook_entry *)selist_get(ql, qi); if (sbe->level <= maxlevel) { // TODO: no need to deref spref here, spref->name == sp->sname - spell * sp = spellref_get(sbe->spref); + spell * sp = sbe->sp; const char *name = translate(mkname("spell", sp->sname), spell_name(sp, f->locale)); if (!header) { stream_printf(out, "SPRUECHE\n"); @@ -1622,7 +1622,7 @@ report_computer(const char *filename, report_context * ctx, const char *bom) a = a_find(f->attribs, &at_reportspell); while (a && a->type == &at_reportspell) { spellbook_entry *sbe = (spellbook_entry *)a->data.v; - cr_reportspell(F, spellref_get(sbe->spref), sbe->level, f->locale); + 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/kernel/spell.c b/src/kernel/spell.c index f950918e0..212b0a7d2 100644 --- a/src/kernel/spell.c +++ b/src/kernel/spell.c @@ -146,12 +146,18 @@ spell *find_spellbyid(unsigned int id) return NULL; } -struct spellref *spellref_create(const char *name) +struct spellref *spellref_create(spell *sp, const char *name) { spellref *spref = malloc(sizeof(spellref)); - spref->name = strdup(name); - spref->sp = NULL; + if (sp) { + spref->sp = sp; + spref->name = strdup(sp->sname); + } + else if (name) { + spref->name = strdup(name); + spref->sp = NULL; + } return spref; } @@ -166,16 +172,12 @@ void spellref_free(spellref *spref) struct spell *spellref_get(struct spellref *spref) { if (!spref->sp) { + assert(spref->name); spref->sp = find_spell(spref->name); + if (spref->sp) { + free(spref->name); + spref->name = NULL; + } } return spref->sp; } - -spellref *spellref_copy(spellref *spref) -{ - spellref *result = spellref_create(spref->name); - if (spref->sp) { - result->sp = spref->sp; - } - return result; -} diff --git a/src/kernel/spell.h b/src/kernel/spell.h index 116816e26..e7592f082 100644 --- a/src/kernel/spell.h +++ b/src/kernel/spell.h @@ -50,9 +50,8 @@ extern "C" { struct spell *sp; } spellref; - struct spellref *spellref_create(const char *name); + struct spellref *spellref_create(struct spell *sp, const char *name); void spellref_free(struct spellref *spref); - struct spellref *spellref_copy(struct spellref *spref); struct spell *spellref_get(struct spellref *spref); int sp_antimagiczone(struct castorder *co); diff --git a/src/kernel/spell.test.c b/src/kernel/spell.test.c index 4a8cd617a..b500f94cc 100644 --- a/src/kernel/spell.test.c +++ b/src/kernel/spell.test.c @@ -74,13 +74,14 @@ static void test_spellref(CuTest *tc) spellref *ref; spell *sp; test_setup(); - ref = spellref_create("hodor"); + ref = spellref_create(NULL, "hodor"); CuAssertPtrNotNull(tc, ref); + CuAssertPtrEquals(tc, NULL, ref->sp); + CuAssertStrEquals(tc, "hodor", ref->name); CuAssertPtrEquals(tc, NULL, spellref_get(ref)); sp = create_spell("hodor", 0); CuAssertPtrNotNull(tc, sp); CuAssertPtrEquals(tc, sp, spellref_get(ref)); - CuAssertPtrEquals(tc, NULL, ref->name); spellref_free(ref); test_cleanup(); } diff --git a/src/kernel/spellbook.c b/src/kernel/spellbook.c index 919142585..b7f65420c 100644 --- a/src/kernel/spellbook.c +++ b/src/kernel/spellbook.c @@ -50,7 +50,7 @@ void read_spellbook(spellbook **bookp, gamedata *data, int(*get_level)(const spe sb = *bookp; } if (level > 0 && (data->version >= SPELLBOOK_VERSION || !spellbook_get(sb, sp))) { - spellbook_add_spell(sb, sp, level); + spellbook_add(sb, sp, level); } } } @@ -64,43 +64,25 @@ void write_spellbook(const struct spellbook *book, struct storage *store) if (book) { for (ql = book->spells, qi = 0; ql; selist_advance(&ql, &qi, 1)) { spellbook_entry *sbe = (spellbook_entry *)selist_get(ql, qi); - WRITE_TOK(store, sbe->spref->name); + WRITE_TOK(store, sbe->sp->sname); WRITE_INT(store, sbe->level); } } WRITE_TOK(store, "end"); } -void spellbook_add(spellbook *sb, spellref *spref, int level) +void spellbook_add(spellbook *sb, spell *sp, int level) { spellbook_entry * sbe; - assert(sb && spref && level > 0); -#ifndef NDEBUG - if (spellbook_get(sb, spellref_get(spref))) { - log_error("duplicate spell in spellbook '%s': '%s'\n", sb->name, spref->name); - } -#endif - sbe = (spellbook_entry *)malloc(sizeof(spellbook_entry)); - sbe->spref = spellref_copy(spref); - sbe->level = level; - selist_push(&sb->spells, sbe); -} - -void spellbook_add_spell(spellbook *sb, spell *sp, int level) -{ - spellbook_entry * sbe; - - assert(sb && sp->sname && level > 0); + assert(sb && sp && level > 0); #ifndef NDEBUG if (spellbook_get(sb, sp)) { log_error("duplicate spell in spellbook '%s': '%s'\n", sb->name, sp->sname); } #endif sbe = (spellbook_entry *)malloc(sizeof(spellbook_entry)); - // FIXME: create a better API to create spellref from spell - sbe->spref = spellref_create(sp->sname); - sbe->spref->sp = sp; + sbe->sp = sp; sbe->level = level; selist_push(&sb->spells, sbe); } @@ -113,7 +95,6 @@ void spellbook_clear(spellbook *sb) assert(sb); for (qi = 0, ql = sb->spells; ql; selist_advance(&ql, &qi, 1)) { spellbook_entry *sbe = (spellbook_entry *)selist_get(ql, qi); - spellref_free(sbe->spref); free(sbe); } selist_free(sb->spells); @@ -135,7 +116,7 @@ int spellbook_foreach(spellbook *sb, int(*callback)(spellbook_entry *, void *), return 0; } -spellbook_entry * spellbook_get(spellbook *sb, const struct spell * sp) +spellbook_entry * spellbook_get(spellbook *sb, const struct spell *sp) { if (sb) { selist *ql; @@ -143,7 +124,7 @@ spellbook_entry * spellbook_get(spellbook *sb, const struct spell * sp) for (qi = 0, ql = sb->spells; ql; selist_advance(&ql, &qi, 1)) { spellbook_entry *sbe = (spellbook_entry *)selist_get(ql, qi); - if (sp == spellref_get(sbe->spref)) { + if (sbe->sp==sp) { return sbe; } } diff --git a/src/kernel/spellbook.h b/src/kernel/spellbook.h index 858240f54..fb3438a8b 100644 --- a/src/kernel/spellbook.h +++ b/src/kernel/spellbook.h @@ -29,7 +29,7 @@ extern "C" { struct selist; typedef struct spellbook_entry { - struct spellref * spref; + struct spell *sp; int level; } spellbook_entry; @@ -44,11 +44,10 @@ extern "C" { void read_spellbook(struct spellbook **bookp, struct gamedata *data, int(*get_level)(const struct spell * sp, void *), void * cbdata); void write_spellbook(const struct spellbook *book, struct storage *store); - void spellbook_add(spellbook *sbp, struct spellref *spref, int level); - void spellbook_add_spell(spellbook *sb, struct spell *sp, int level); + void spellbook_add(spellbook *sbp, struct spell *sp, int level); int spellbook_foreach(spellbook *sb, int(*callback)(spellbook_entry *, void *), void * data); void spellbook_clear(spellbook *sb); - spellbook_entry * spellbook_get(spellbook *sb, const struct spell * sp); + spellbook_entry * spellbook_get(spellbook *sb, const struct spell *sp); #ifdef __cplusplus } diff --git a/src/kernel/xmlreader.c b/src/kernel/xmlreader.c index f9d0912da..4225858ee 100644 --- a/src/kernel/xmlreader.c +++ b/src/kernel/xmlreader.c @@ -79,7 +79,7 @@ static spellref *xml_spellref(xmlNode * node, const char *name) { xmlChar *propValue = xmlGetProp(node, BAD_CAST name); if (propValue != NULL) { - spellref *ref = spellref_create((const char *)propValue); + spellref *ref = spellref_create(NULL, (const char *)propValue); xmlFree(propValue); return ref; } @@ -2075,10 +2075,10 @@ void register_xmlreader(void) xml_register_callback(parse_buildings); /* requires resources */ xml_register_callback(parse_ships); /* requires terrains */ - xml_register_callback(parse_races); /* requires spells */ - xml_register_callback(parse_spellbooks); /* requires spells */ - xml_register_callback(parse_equipment); /* requires spells */ - xml_register_callback(parse_spells); /* requires resources */ + xml_register_callback(parse_races); xml_register_callback(parse_calendar); + xml_register_callback(parse_spells); /* requires resources */ + xml_register_callback(parse_equipment); /* requires spells */ + xml_register_callback(parse_spellbooks); /* requires spells */ } #endif diff --git a/src/laws.c b/src/laws.c index f543fc78f..6b0bfda8d 100644 --- a/src/laws.c +++ b/src/laws.c @@ -3458,8 +3458,8 @@ static void copy_spells(const spellbook * src, spellbook * dst, int maxlevel) for (qi = 0, ql = src->spells; ql; selist_advance(&ql, &qi, 1)) { spellbook_entry * sbe = (spellbook_entry *)selist_get(ql, qi); if (sbe->level <= maxlevel) { - if (!spellbook_get(dst, spellref_get(sbe->spref))) { - spellbook_add(dst, sbe->spref, sbe->level); + if (!spellbook_get(dst, sbe->sp)) { + spellbook_add(dst, sbe->sp, sbe->level); } } } diff --git a/src/magic.c b/src/magic.c index bdac11df8..7e820f9c3 100644 --- a/src/magic.c +++ b/src/magic.c @@ -430,14 +430,13 @@ void show_new_spells(faction * f, int level, const spellbook *book) for (qi = 0; ql; selist_advance(&ql, &qi, 1)) { spellbook_entry *sbe = (spellbook_entry *)selist_get(ql, qi); if (sbe->level <= level) { - spell *sp = spellref_get(sbe->spref); - if (!already_seen(f, sp)) { + if (!already_seen(f, sbe->sp)) { attrib * a = a_new(&at_reportspell); spellbook_entry * entry = (spellbook_entry *)a->data.v; entry->level = sbe->level; - entry->spref = spellref_copy(sbe->spref); + entry->sp = sbe->sp; a_add(&f->attribs, a); - a_add(&f->attribs, a_new(&at_seenspell))->data.v = sp; + a_add(&f->attribs, a_new(&at_seenspell))->data.v = sbe->sp; } } } @@ -482,8 +481,7 @@ void pick_random_spells(faction * f, int level, spellbook * book, int num_spells sbe = 0; } else { - spell *sp = spellref_get(sbe->spref); - if (f->spellbook && spellbook_get(f->spellbook, sp)) { + if (f->spellbook && spellbook_get(f->spellbook, sbe->sp)) { // already have this spell, remove it from the list of candidates commonspells[spellno] = commonspells[--numspells]; if (maxspell > numspells) { @@ -498,7 +496,7 @@ void pick_random_spells(faction * f, int level, spellbook * book, int num_spells if (!f->spellbook) { f->spellbook = create_spellbook(0); } - spellbook_add(f->spellbook, sbe->spref, sbe->level); + spellbook_add(f->spellbook, sbe->sp, sbe->level); commonspells[spellno] = commonspells[--numspells]; } } @@ -2971,15 +2969,14 @@ static void select_spellbook(void **tokens, spellbook *sb, const struct locale * for (qi = 0, ql = sb->spells; ql; selist_advance(&ql, &qi, 1)) { spellbook_entry *sbe = (spellbook_entry *)selist_get(ql, qi); - spell *sp = spellref_get(sbe->spref); - const char *n = spell_name(sp, lang); + const char *n = spell_name(sbe->sp, lang); if (!n) { - log_error("no translation in locale %s for spell %s\n", locale_name(lang), sp->sname); + log_error("no translation in locale %s for spell %s\n", locale_name(lang), sbe->sp->sname); } else { variant token; - token.v = sp; + token.v = sbe->sp; addtoken((struct tnode **)tokens, n, token); } } diff --git a/src/report.c b/src/report.c index fa1222f90..06244c70c 100644 --- a/src/report.c +++ b/src/report.c @@ -255,7 +255,7 @@ void nr_spell_syntax(struct stream *out, spellbook_entry * sbe, const struct loc char buf[4096]; char *bufp = buf; size_t size = sizeof(buf) - 1; - const spell * sp = spellref_get(sbe->spref); + const spell * sp = sbe->sp; const char *params = sp->parameter; if (sp->sptyp & ISCOMBATSPELL) { @@ -445,7 +445,7 @@ void nr_spell(struct stream *out, spellbook_entry * sbe, const struct locale *la char buf[4096]; char *startp, *bufp = buf; size_t size = sizeof(buf) - 1; - const spell * sp = spellref_get(sbe->spref); + const spell * sp = sbe->sp; newline(out); centre(out, spell_name(sp, lang), true); diff --git a/src/reports.c b/src/reports.c index bb727083e..318660024 100644 --- a/src/reports.c +++ b/src/reports.c @@ -681,7 +681,7 @@ size_t size) WARN_STATIC_BUFFER(); } // TODO: no need to deref the spellref here (spref->name is good) - bufp = STRLCPY(bufp, spell_name(spellref_get(sbe->spref), f->locale), size); + bufp = STRLCPY(bufp, spell_name(sbe->sp, f->locale), size); } }