find_spellbyid() kriegt nen magietyp für den fall wo zwei zauber gleich heissen, und nicht über ihre 'alte' id erkannt werden, sondern den hash des namens (für seenspell)

This commit is contained in:
Enno Rehling 2006-01-01 20:11:09 +00:00
parent 88ea1b27b7
commit c60502bfc8
8 changed files with 24 additions and 67 deletions

View File

@ -201,6 +201,9 @@
<File <File
RelativePath=".\itemtypes.c"> RelativePath=".\itemtypes.c">
</File> </File>
<File
RelativePath=".\phoenixcompass.c">
</File>
<File <File
RelativePath=".\seed.c"> RelativePath=".\seed.c">
</File> </File>

View File

@ -211,7 +211,9 @@ read_mage(attrib * a, FILE * F)
if (global.data_version<SPELLNAME_VERSION) { if (global.data_version<SPELLNAME_VERSION) {
int spid; int spid;
fscanf (F, "%d %d", &spid, &mage->combatspells[i].level); fscanf (F, "%d %d", &spid, &mage->combatspells[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 { } else {
fscanf (F, "%s %d", spname, &mage->combatspells[i].level); fscanf (F, "%s %d", spname, &mage->combatspells[i].level);
if (strcmp("none", spname)!=0) { if (strcmp("none", spname)!=0) {
@ -226,7 +228,7 @@ read_mage(attrib * a, FILE * F)
if (global.data_version<SPELLNAME_VERSION) { if (global.data_version<SPELLNAME_VERSION) {
fscanf (F, "%d", &i); fscanf (F, "%d", &i);
if (i < 0) break; if (i < 0) break;
sp = find_spellbyid((spellid_t)i); sp = find_spellbyid(mage->magietyp, (spellid_t)i);
} else { } else {
fscanf(F, "%s", spname); fscanf(F, "%s", spname);
if (strcmp(spname, "end")==0) break; if (strcmp(spname, "end")==0) break;
@ -367,7 +369,7 @@ read_seenspell(attrib * a, FILE * f)
fscanf(f, "%s", buf); fscanf(f, "%s", buf);
i = atoi(buf); i = atoi(buf);
if (i!=0) { if (i!=0) {
sp = find_spellbyid((spellid_t)i); sp = find_spellbyid(M_GRAU, (spellid_t)i);
} else { } else {
int mtype; int mtype;
fscanf(f, "%d", &mtype); fscanf(f, "%d", &mtype);
@ -410,9 +412,9 @@ updatespelllist(unit * u)
boolean ismonster = u->faction->no==MONSTER_FACTION; boolean ismonster = u->faction->no==MONSTER_FACTION;
/* Nur Wyrm-Magier bekommen den Wyrmtransformationszauber */ /* 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) { 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 */ /* Transformierte Wyrm-Magier bekommen Drachenodem */
@ -421,17 +423,17 @@ updatespelllist(unit * u)
switch (urc) { switch (urc) {
/* keine breaks! Wyrme sollen alle drei Zauber können.*/ /* keine breaks! Wyrme sollen alle drei Zauber können.*/
case RC_WYRM: 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) { if (sp!=NULL && !has_spell(u, sp) && sp->level<=sk) {
add_spell(mage, sp); add_spell(mage, sp);
} }
case RC_DRAGON: 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) { if (sp!=NULL && !has_spell(u, sp) && sp->level<=sk) {
add_spell(mage, sp); add_spell(mage, sp);
} }
case RC_FIREDRAGON: 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) { if (sp!=NULL && !has_spell(u, sp) && sp->level<=sk) {
add_spell(mage, sp); add_spell(mage, sp);
} }

View File

@ -270,9 +270,6 @@ boolean is_familiar(const struct unit *u);
spell *get_spellfromtoken(struct unit *u, const char *s, const struct locale * lang); spell *get_spellfromtoken(struct unit *u, const char *s, const struct locale * lang);
/* versucht einen Spruch über den Namen zu identifizieren, gibt /* versucht einen Spruch über den Namen zu identifizieren, gibt
* ansonsten NULL zurück */ * 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); int get_combatspelllevel(const struct unit *u, int nr);
/* versucht, eine eingestellte maximale Kampfzauberstufe /* versucht, eine eingestellte maximale Kampfzauberstufe
* zurückzugeben. 0 = Maximum, -1 u ist kein Magier. */ * zurückzugeben. 0 = Maximum, -1 u ist kein Magier. */

View File

@ -1170,12 +1170,12 @@ readunit(FILE * F)
mage->spellpoints = ri(F); mage->spellpoints = ri(F);
mage->spchange = ri(F); mage->spchange = ri(F);
while ((i = ri(F)) != -1) { 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); mage->combatspells[csp].level = ri(F);
csp++; csp++;
} }
while ((i = ri(F)) != -1) { 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; mage->spellcount = 0;
a = a_add(&u->attribs, a_new(&at_mage)); a = a_add(&u->attribs, a_new(&at_mage));

View File

@ -165,7 +165,7 @@ get_spellfromtoken(unit *u, const char *name, const struct locale * lang)
} }
spell * spell *
find_spellbyid(spellid_t id) find_spellbyid(magic_t mtype, spellid_t id)
{ {
spell_list * slist; spell_list * slist;
@ -181,8 +181,12 @@ find_spellbyid(spellid_t id)
} }
for (slist=spells;slist!=NULL;slist=slist->next) { for (slist=spells;slist!=NULL;slist=slist->next) {
spell* sp = slist->data; spell* sp = slist->data;
int hashid = hashstring(sp->sname); unsigned int hashid = hashstring(sp->sname);
if (hashid == id) return sp; if (hashid==id) {
if (sp->magietyp==mtype || mtype==M_GRAU) {
return sp;
}
}
} }
log_warning(("cannot find spell by id: %u\n", id)); log_warning(("cannot find spell by id: %u\n", id));

View File

@ -44,6 +44,7 @@ extern "C" {
extern void init_spells(void); extern void init_spells(void);
extern void register_spell(struct spell * sp); extern void register_spell(struct spell * sp);
extern struct spell * find_spell(magic_t mtype, const char * name); extern struct spell * find_spell(magic_t mtype, const char * name);
extern struct spell * find_spellbyid(magic_t mtype, spellid_t i);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -7088,7 +7088,7 @@ sp_becomewyrm(castorder *co)
} }
u->race = new_race[RC_WYRM]; 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)); ADDMSG(&u->faction->msgs, msg_message("becomewyrm", "u", u));

View File

@ -268,55 +268,6 @@ attrib_type at_roadfix = {
ATF_UNIQUE 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; extern plane * arena;
static void static void
@ -1086,7 +1037,6 @@ korrektur(void)
/* immer ausführen, wenn neue Sprüche dazugekommen sind, oder sich /* immer ausführen, wenn neue Sprüche dazugekommen sind, oder sich
* Beschreibungen geändert haben */ * Beschreibungen geändert haben */
show_newspells();
fix_age(); fix_age();
/* Immer ausführen! Erschafft neue Teleport-Regionen, wenn nötig */ /* Immer ausführen! Erschafft neue Teleport-Regionen, wenn nötig */