diff --git a/src/common/items/items.vcproj b/src/common/items/items.vcproj index 45591affd..5bd4f69d8 100644 --- a/src/common/items/items.vcproj +++ b/src/common/items/items.vcproj @@ -201,6 +201,9 @@ + + diff --git a/src/common/kernel/magic.c b/src/common/kernel/magic.c index dba157d5a..d2b8d5f2a 100644 --- a/src/common/kernel/magic.c +++ b/src/common/kernel/magic.c @@ -211,7 +211,9 @@ read_mage(attrib * a, FILE * F) if (global.data_versioncombatspells[i].level); - if (spid>=0) mage->combatspells[i].sp = find_spellbyid((spellid_t)spid); + if (spid>=0) { + mage->combatspells[i].sp = find_spellbyid(mage->magietyp, (spellid_t)spid); + } } else { fscanf (F, "%s %d", spname, &mage->combatspells[i].level); if (strcmp("none", spname)!=0) { @@ -226,7 +228,7 @@ read_mage(attrib * a, FILE * F) if (global.data_versionmagietyp, (spellid_t)i); } else { fscanf(F, "%s", spname); if (strcmp(spname, "end")==0) break; @@ -367,7 +369,7 @@ read_seenspell(attrib * a, FILE * f) fscanf(f, "%s", buf); i = atoi(buf); if (i!=0) { - sp = find_spellbyid((spellid_t)i); + sp = find_spellbyid(M_GRAU, (spellid_t)i); } else { int mtype; fscanf(f, "%d", &mtype); @@ -410,9 +412,9 @@ updatespelllist(unit * u) boolean ismonster = u->faction->no==MONSTER_FACTION; /* Nur Wyrm-Magier bekommen den Wyrmtransformationszauber */ - sp = find_spellbyid(SPL_BECOMEWYRM); + sp = find_spellbyid(M_GRAU, SPL_BECOMEWYRM); if (fspecial(u->faction, FS_WYRM) && !has_spell(u, sp) && sp->level<=sk) { - add_spell(mage, find_spellbyid(SPL_BECOMEWYRM)); + add_spell(mage, find_spellbyid(M_GRAU, SPL_BECOMEWYRM)); } /* Transformierte Wyrm-Magier bekommen Drachenodem */ @@ -421,17 +423,17 @@ updatespelllist(unit * u) switch (urc) { /* keine breaks! Wyrme sollen alle drei Zauber können.*/ case RC_WYRM: - sp = find_spellbyid(SPL_WYRMODEM); + sp = find_spellbyid(M_GRAU, SPL_WYRMODEM); if (sp!=NULL && !has_spell(u, sp) && sp->level<=sk) { add_spell(mage, sp); } case RC_DRAGON: - sp = find_spellbyid(SPL_DRAGONODEM); + sp = find_spellbyid(M_GRAU, SPL_DRAGONODEM); if (sp!=NULL && !has_spell(u, sp) && sp->level<=sk) { add_spell(mage, sp); } case RC_FIREDRAGON: - sp = find_spellbyid(SPL_FIREDRAGONODEM); + sp = find_spellbyid(M_GRAU, SPL_FIREDRAGONODEM); if (sp!=NULL && !has_spell(u, sp) && sp->level<=sk) { add_spell(mage, sp); } diff --git a/src/common/kernel/magic.h b/src/common/kernel/magic.h index bb6f54070..ecb367110 100644 --- a/src/common/kernel/magic.h +++ b/src/common/kernel/magic.h @@ -270,9 +270,6 @@ boolean is_familiar(const struct unit *u); spell *get_spellfromtoken(struct unit *u, const char *s, const struct locale * lang); /* versucht einen Spruch über den Namen zu identifizieren, gibt * ansonsten NULL zurück */ -spell *find_spellbyid(spellid_t i); -/* versucht einen Spruch über seine Id zu identifizieren, gibt -* ansonsten NULL zurück */ int get_combatspelllevel(const struct unit *u, int nr); /* versucht, eine eingestellte maximale Kampfzauberstufe * zurückzugeben. 0 = Maximum, -1 u ist kein Magier. */ diff --git a/src/common/kernel/save.c b/src/common/kernel/save.c index f26141b57..4c2e1c4f7 100644 --- a/src/common/kernel/save.c +++ b/src/common/kernel/save.c @@ -1170,12 +1170,12 @@ readunit(FILE * F) mage->spellpoints = ri(F); mage->spchange = ri(F); while ((i = ri(F)) != -1) { - mage->combatspells[csp].sp = find_spellbyid((spellid_t)i); + mage->combatspells[csp].sp = find_spellbyid(mage->magietyp, (spellid_t)i); mage->combatspells[csp].level = ri(F); csp++; } while ((i = ri(F)) != -1) { - add_spell(mage, find_spellbyid((spellid_t)i)); + add_spell(mage, find_spellbyid(mage->magietyp, (spellid_t)i)); } mage->spellcount = 0; a = a_add(&u->attribs, a_new(&at_mage)); diff --git a/src/common/kernel/spell.c b/src/common/kernel/spell.c index b9cf7b42c..44fd7c528 100644 --- a/src/common/kernel/spell.c +++ b/src/common/kernel/spell.c @@ -165,7 +165,7 @@ get_spellfromtoken(unit *u, const char *name, const struct locale * lang) } spell * -find_spellbyid(spellid_t id) +find_spellbyid(magic_t mtype, spellid_t id) { spell_list * slist; @@ -181,8 +181,12 @@ find_spellbyid(spellid_t id) } for (slist=spells;slist!=NULL;slist=slist->next) { spell* sp = slist->data; - int hashid = hashstring(sp->sname); - if (hashid == id) return sp; + unsigned int hashid = hashstring(sp->sname); + if (hashid==id) { + if (sp->magietyp==mtype || mtype==M_GRAU) { + return sp; + } + } } log_warning(("cannot find spell by id: %u\n", id)); diff --git a/src/common/kernel/spell.h b/src/common/kernel/spell.h index 249cd668e..42c7bdda2 100644 --- a/src/common/kernel/spell.h +++ b/src/common/kernel/spell.h @@ -44,6 +44,7 @@ extern "C" { extern void init_spells(void); extern void register_spell(struct spell * sp); extern struct spell * find_spell(magic_t mtype, const char * name); + extern struct spell * find_spellbyid(magic_t mtype, spellid_t i); #ifdef __cplusplus } diff --git a/src/common/spells/spells.c b/src/common/spells/spells.c index 22d11ca21..441526a63 100644 --- a/src/common/spells/spells.c +++ b/src/common/spells/spells.c @@ -7088,7 +7088,7 @@ sp_becomewyrm(castorder *co) } u->race = new_race[RC_WYRM]; - add_spell(get_mage(u), find_spellbyid(SPL_WYRMODEM)); + add_spell(get_mage(u), find_spellbyid(M_GRAU, SPL_WYRMODEM)); ADDMSG(&u->faction->msgs, msg_message("becomewyrm", "u", u)); diff --git a/src/eressea/korrektur.c b/src/eressea/korrektur.c index d2a82361a..6b2fcaefe 100644 --- a/src/eressea/korrektur.c +++ b/src/eressea/korrektur.c @@ -268,55 +268,6 @@ attrib_type at_roadfix = { ATF_UNIQUE }; -/* ************************************************************ */ -/* GANZ WICHTIG! ALLE GEÄNDERTEN SPRÜCHE NEU ANZEIGEN */ -/* GANZ WICHTIG! FÜGT AUCH NEUE ZAUBER IN DIE LISTE DER BEKANNTEN EIN */ -/* ************************************************************ */ -static void -show_newspells(void) -{ - region *r; - /* Alle geänderten Zauber in das array newspellids[]. mit SPL_NOSPELL - * terminieren */ - - spellid_t newspellids[] = { - SPL_NOSPELL - }; - - /* die id's der neuen oder veränderten Sprüche werden in newspellids[] - * abgelegt */ - - for(r=regions; r; r=r->next) { - unit *u; - for(u=r->units;u;u=u->next) { - sc_mage *m = get_mage(u); - if (u->faction->no == MONSTER_FACTION) continue; - if (m != NULL) { - int i; - - if (m->magietyp == M_GRAU) continue; - - for (i = 0; newspellids[i] != SPL_NOSPELL; i++) { - spell *sp = find_spellbyid(newspellids[i]); - - if (!sp) continue; - - if (m->magietyp == sp->magietyp || has_spell(u, sp)) { - attrib * a = a_find(u->faction->attribs, &at_reportspell); - while (a && a->data.v != sp) a = a->nexttype; - if (!a) { - /* spell is not being shown yet. if seen before, remove to show again */ - a = a_find(u->faction->attribs, &at_seenspell); - while (a && a->data.v != sp) a = a->nexttype; - if (a) a_remove(&u->faction->attribs, a); - } - } - } - } - } - } -} - extern plane * arena; static void @@ -1086,7 +1037,6 @@ korrektur(void) /* immer ausführen, wenn neue Sprüche dazugekommen sind, oder sich * Beschreibungen geändert haben */ - show_newspells(); fix_age(); /* Immer ausführen! Erschafft neue Teleport-Regionen, wenn nötig */