diff --git a/src/magic.c b/src/magic.c index d59503def..8fc5072f6 100644 --- a/src/magic.c +++ b/src/magic.c @@ -2903,40 +2903,56 @@ const char *curse_name(const curse_type * ctype, const struct locale *lang) return LOC(lang, mkname("spell", ctype->cname)); } -spell *unit_getspell(struct unit *u, const char *name, const struct locale * lang) -{ - sc_mage * mage = get_mage(u); - if (mage) { - variant token; - void * tokens = 0; - spellbook *sb = unit_get_spellbook(u); +static void select_spellbook(void **tokens, spellbook *sb, const struct locale * lang) { + quicklist * ql; + int qi; - if (sb) { - quicklist * ql; - int qi; + assert(sb); + assert(lang); - for (qi = 0, ql = sb->spells; ql; ql_advance(&ql, &qi, 1)) { - spellbook_entry *sbe = (spellbook_entry *)ql_get(ql, qi); - spell *sp = sbe->sp; - const char *n = spell_name(sp, lang); - if (!n) { - log_error("no translation in locale %s for spell %s\n", locale_name(lang), sp->sname); - } - else { - token.v = sp; - addtoken(&tokens, n, token); - } - } + for (qi = 0, ql = sb->spells; ql; ql_advance(&ql, &qi, 1)) { + spellbook_entry *sbe = (spellbook_entry *)ql_get(ql, qi); + spell *sp = sbe->sp; + + const char *n = spell_name(sp, lang); + if (!n) { + log_error("no translation in locale %s for spell %s\n", locale_name(lang), sp->sname); } - - if (tokens) { - if (findtoken(tokens, name, &token) != E_TOK_NOMATCH) { - freetokens(tokens); - return (spell *)token.v; - } - freetokens(tokens); + else { + variant token; + token.v = sp; + addtoken(tokens, n, token); } } +} + +spell *unit_getspell(struct unit *u, const char *name, const struct locale * lang) +{ + void * tokens = 0; + spellbook *sb; + + sb = unit_get_spellbook(u); + if (sb) { + select_spellbook(&tokens, sb, lang); + } + + u = get_familiar_mage(u); + if (u) { + sb = unit_get_spellbook(u); + if (sb) { + select_spellbook(&tokens, sb, lang); + } + } + + if (tokens) { + variant token; + if (findtoken(tokens, name, &token) != E_TOK_NOMATCH) { + freetokens(tokens); + return (spell *)token.v; + } + freetokens(tokens); + } + return 0; }