forked from github/server
slow but working solution for getspell. rebuilding that radix tree for every call is insanity.
This commit is contained in:
parent
998549e687
commit
8619bd74a8
|
@ -507,18 +507,6 @@ sc_mage *create_mage(unit * u, magic_t mtyp)
|
||||||
/* ------------------------------------------------------------- */
|
/* ------------------------------------------------------------- */
|
||||||
/* Funktionen für die Bearbeitung der List-of-known-spells */
|
/* Funktionen für die Bearbeitung der List-of-known-spells */
|
||||||
|
|
||||||
void add_spellname(sc_mage * mage, const spell * sp)
|
|
||||||
{
|
|
||||||
spell_names * names = mage->spellnames;
|
|
||||||
while (names) {
|
|
||||||
variant token;
|
|
||||||
const char *n = spell_name(sp, names->lang);
|
|
||||||
token.v = (void *)sp;
|
|
||||||
addtoken(&names->tokens, n, token);
|
|
||||||
names = names->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int u_hasspell(const unit *u, const struct spell *sp)
|
int u_hasspell(const unit *u, const struct spell *sp)
|
||||||
{
|
{
|
||||||
spellbook * book = unit_get_spellbook(u);
|
spellbook * book = unit_get_spellbook(u);
|
||||||
|
@ -2877,19 +2865,12 @@ spell *unit_getspell(struct unit *u, const char *name, const struct locale * lan
|
||||||
sc_mage * mage = get_mage(u);
|
sc_mage * mage = get_mage(u);
|
||||||
if (mage) {
|
if (mage) {
|
||||||
variant token;
|
variant token;
|
||||||
struct spell_names * names = mage->spellnames;
|
void * tokens = 0;
|
||||||
for (;names;names=names->next) {
|
|
||||||
if (names->lang==lang) break;
|
|
||||||
}
|
|
||||||
if (!names) {
|
|
||||||
spellbook *sb = unit_get_spellbook(u);
|
spellbook *sb = unit_get_spellbook(u);
|
||||||
|
|
||||||
if (sb) {
|
if (sb) {
|
||||||
quicklist * ql;
|
quicklist * ql;
|
||||||
int qi;
|
int qi;
|
||||||
names = (spell_names *)calloc(1, sizeof(spell_names));
|
|
||||||
names->next = mage->spellnames;
|
|
||||||
names->lang = lang;
|
|
||||||
names->tokens = 0;
|
|
||||||
|
|
||||||
for (qi = 0, ql = sb->spells; ql; ql_advance(&ql, &qi, 1)) {
|
for (qi = 0, ql = sb->spells; ql; ql_advance(&ql, &qi, 1)) {
|
||||||
spellbook_entry *sbe = (spellbook_entry *)ql_get(ql, qi);
|
spellbook_entry *sbe = (spellbook_entry *)ql_get(ql, qi);
|
||||||
|
@ -2899,16 +2880,18 @@ spell *unit_getspell(struct unit *u, const char *name, const struct locale * lan
|
||||||
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), sp->sname);
|
||||||
} else {
|
} else {
|
||||||
token.v = sp;
|
token.v = sp;
|
||||||
addtoken(&names->tokens, n, token);
|
addtoken(&tokens, n, token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mage->spellnames = names;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (names && findtoken(names->tokens, name, &token) != E_TOK_NOMATCH) {
|
if (tokens) {
|
||||||
|
if (findtoken(tokens, name, &token) != E_TOK_NOMATCH) {
|
||||||
|
freetokens(tokens);
|
||||||
return (spell *) token.v;
|
return (spell *) token.v;
|
||||||
}
|
}
|
||||||
|
freetokens(tokens);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,7 +118,6 @@ typedef struct sc_mage {
|
||||||
int spellcount;
|
int spellcount;
|
||||||
combatspell combatspells[MAXCOMBATSPELLS];
|
combatspell combatspells[MAXCOMBATSPELLS];
|
||||||
struct spellbook *spellbook;
|
struct spellbook *spellbook;
|
||||||
struct spell_names * spellnames;
|
|
||||||
} sc_mage;
|
} sc_mage;
|
||||||
|
|
||||||
/* ------------------------------------------------------------- */
|
/* ------------------------------------------------------------- */
|
||||||
|
@ -250,7 +249,6 @@ typedef struct sc_mage {
|
||||||
/* setzt Kampfzauber */
|
/* setzt Kampfzauber */
|
||||||
void unset_combatspell(struct unit *u, struct spell * sp);
|
void unset_combatspell(struct unit *u, struct spell * sp);
|
||||||
/* löscht Kampfzauber */
|
/* löscht Kampfzauber */
|
||||||
void add_spellname(sc_mage * mage, const struct spell * sp);
|
|
||||||
/* fügt den Spruch mit der Id spellid der Spruchliste der Einheit hinzu. */
|
/* fügt den Spruch mit der Id spellid der Spruchliste der Einheit hinzu. */
|
||||||
int u_hasspell(const struct unit *u, const struct spell *sp);
|
int u_hasspell(const struct unit *u, const struct spell *sp);
|
||||||
/* prüft, ob der Spruch in der Spruchliste der Einheit steht. */
|
/* prüft, ob der Spruch in der Spruchliste der Einheit steht. */
|
||||||
|
|
|
@ -180,6 +180,7 @@ void test_getspell_unit(CuTest * tc)
|
||||||
r = findregion(0, 0);
|
r = findregion(0, 0);
|
||||||
f = test_create_faction(0);
|
f = test_create_faction(0);
|
||||||
u = test_create_unit(f, r);
|
u = test_create_unit(f, r);
|
||||||
|
create_mage(u, M_GRAY);
|
||||||
skill_enabled[SK_MAGIC] = 1;
|
skill_enabled[SK_MAGIC] = 1;
|
||||||
|
|
||||||
set_level(u, SK_MAGIC, 1);
|
set_level(u, SK_MAGIC, 1);
|
||||||
|
@ -206,7 +207,9 @@ void test_getspell_faction(CuTest * tc)
|
||||||
test_create_world();
|
test_create_world();
|
||||||
r = findregion(0, 0);
|
r = findregion(0, 0);
|
||||||
f = test_create_faction(0);
|
f = test_create_faction(0);
|
||||||
|
f->magiegebiet = M_TYBIED;
|
||||||
u = test_create_unit(f, r);
|
u = test_create_unit(f, r);
|
||||||
|
create_mage(u, f->magiegebiet);
|
||||||
skill_enabled[SK_MAGIC] = 1;
|
skill_enabled[SK_MAGIC] = 1;
|
||||||
|
|
||||||
set_level(u, SK_MAGIC, 1);
|
set_level(u, SK_MAGIC, 1);
|
||||||
|
@ -237,6 +240,7 @@ void test_getspell_school(CuTest * tc)
|
||||||
f = test_create_faction(0);
|
f = test_create_faction(0);
|
||||||
f->magiegebiet = M_TYBIED;
|
f->magiegebiet = M_TYBIED;
|
||||||
u = test_create_unit(f, r);
|
u = test_create_unit(f, r);
|
||||||
|
create_mage(u, f->magiegebiet);
|
||||||
skill_enabled[SK_MAGIC] = 1;
|
skill_enabled[SK_MAGIC] = 1;
|
||||||
set_level(u, SK_MAGIC, 1);
|
set_level(u, SK_MAGIC, 1);
|
||||||
|
|
||||||
|
|
|
@ -1740,7 +1740,6 @@ void unit_add_spell(unit * u, sc_mage * m, struct spell * sp, int level)
|
||||||
mage->spellbook = create_spellbook(0);
|
mage->spellbook = create_spellbook(0);
|
||||||
}
|
}
|
||||||
spellbook_add(mage->spellbook, sp, level);
|
spellbook_add(mage->spellbook, sp, level);
|
||||||
add_spellname(mage, sp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct spellbook * unit_get_spellbook(const struct unit * u)
|
struct spellbook * unit_get_spellbook(const struct unit * u)
|
||||||
|
|
|
@ -212,8 +212,10 @@ void freetokens(void * root)
|
||||||
tnode * node = (tnode *)root;
|
tnode * node = (tnode *)root;
|
||||||
int i;
|
int i;
|
||||||
for (i=0;node && i!=NODEHASHSIZE;++i) {
|
for (i=0;node && i!=NODEHASHSIZE;++i) {
|
||||||
|
if (node->next[i]) {
|
||||||
freetokens(node->next[i]->node);
|
freetokens(node->next[i]->node);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
free(node);
|
free(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,6 @@ static void test_umlaut(CuTest * tc)
|
||||||
variant id;
|
variant id;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
memset(&tokens, 0, sizeof(tokens));
|
|
||||||
/* don't crash on an empty set */
|
/* don't crash on an empty set */
|
||||||
result = findtoken(tokens, "herpderp", &id);
|
result = findtoken(tokens, "herpderp", &id);
|
||||||
CuAssertIntEquals(tc, E_TOK_NOMATCH, result);
|
CuAssertIntEquals(tc, E_TOK_NOMATCH, result);
|
||||||
|
@ -65,6 +64,8 @@ static void test_umlaut(CuTest * tc)
|
||||||
|
|
||||||
result = findtoken(tokens, "herp-a-derp", &id);
|
result = findtoken(tokens, "herp-a-derp", &id);
|
||||||
CuAssertIntEquals(tc, E_TOK_NOMATCH, result);
|
CuAssertIntEquals(tc, E_TOK_NOMATCH, result);
|
||||||
|
|
||||||
|
freetokens(tokens);
|
||||||
}
|
}
|
||||||
|
|
||||||
CuSuite *get_umlaut_suite(void)
|
CuSuite *get_umlaut_suite(void)
|
||||||
|
|
Loading…
Reference in New Issue