diff --git a/conf/e3/config.json b/conf/e3/config.json
index 0cd2c1606..c1fa2725c 100644
--- a/conf/e3/config.json
+++ b/conf/e3/config.json
@@ -7,7 +7,6 @@
"config://conf/e3/terrains.json",
"config://conf/e3/items.json",
"config://conf/e3/races.json",
- "config://res/e3a/familiars.xml",
"config://res/e3a/ships.xml",
"config://res/e3a/buildings.xml",
"config://res/e3a/spells.xml",
diff --git a/res/e3a/familiars.xml b/res/e3a/familiars.xml
deleted file mode 100644
index b30c733ed..000000000
--- a/res/e3a/familiars.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/scripts/eressea/e3/familiars.lua b/scripts/eressea/e3/familiars.lua
new file mode 100644
index 000000000..00f3b537d
--- /dev/null
+++ b/scripts/eressea/e3/familiars.lua
@@ -0,0 +1,127 @@
+eressea.log.debug("rules for game E3")
+
+local equipment = require('eressea.equipment')
+local sets = {
+ ['fam_lynx'] = {
+ ['skills'] = {
+ ['magic'] = 1,
+ }
+ },
+ ['fam_eagle'] = {
+ ['skills'] = {
+ ['magic'] = 1,
+ }
+ },
+ ['fam_direwolf'] = {
+ ['skills'] = {
+ ['magic'] = 1,
+ }
+ },
+ ['fam_owl'] = {
+ ['skills'] = {
+ ['magic'] = 1,
+ }
+ },
+ ['fam_hellcat'] = {
+ ['skills'] = {
+ ['magic'] = 1,
+ }
+ },
+ ['fam_tiger'] = {
+ ['skills'] = {
+ ['magic'] = 1,
+ }
+ },
+ ['fam_rat'] = {
+ ['skills'] = {
+ ['magic'] = 1,
+ ['stamina'] = 6,
+ }
+ },
+ ['fam_tunnelworm'] = {
+ ['skills'] = {
+ ['magic'] = 1,
+ ['mining'] = 1,
+ ['forestry'] = 1,
+ ['stamina'] = 1,
+ }
+ },
+ ['fam_dreamcat'] = {
+ ['skills'] = {
+ ['magic'] = 1,
+ },
+ ['spells'] = {
+ ['shapeshift'] = 3,
+ ['transferauratraum'] = 3,
+ }
+ },
+ ['fam_imp'] = {
+ ['skills'] = {
+ ['magic'] = 1,
+ },
+ ['spells'] = {
+ ['shapeshift'] = 3,
+ ['seduction'] = 6,
+ ['steal_aura'] = 6,
+ }
+ },
+ ['fam_ghost'] = {
+ ['skills'] = {
+ ['magic'] = 1,
+ },
+ ['spells'] = {
+ ['steal_aura'] = 6,
+ ['summonundead'] = 6,
+ ['frighten'] = 8,
+ }
+ },
+ ['fam_fairy'] = {
+ ['skills'] = {
+ ['magic'] = 1,
+ },
+ ['spells'] = {
+ ['appeasement'] = 1,
+ ['seduction'] = 6,
+ ['calm_monster'] = 6,
+ }
+ },
+ ['fam_songdragon'] = {
+ ['skills'] = {
+ ['magic'] = 1,
+ },
+ ['spells'] = {
+ ['flee'] = 2,
+ ['sleep'] = 7,
+ ['frighten'] = 8,
+ }
+ },
+ ['fam_unicorn'] = {
+ ['skills'] = {
+ ['magic'] = 1,
+ },
+ ['spells'] = {
+ ['appeasement'] = 1,
+ ['song_of_healing'] = 2,
+ ['resist_magic'] = 3,
+ ['heroic_song'] = 5,
+ ['calm_monster'] = 6,
+ ['song_of_peace'] = 12,
+ }
+ },
+ ['fam_nymph'] = {
+ ['skills'] = {
+ ['magic'] = 1,
+ ['bow'] = 1,
+ ['training'] = 1,
+ ['riding'] = 1,
+ },
+ ['spells'] = {
+ ['appeasement'] = 1,
+ ['song_of_confusion'] = 4,
+ ['calm_monster'] = 6,
+ ['seduction'] = 6,
+ }
+ },
+}
+
+equipment.add_multiple(sets)
diff --git a/scripts/eressea/e3/init.lua b/scripts/eressea/e3/init.lua
index a19049512..b72d569aa 100644
--- a/scripts/eressea/e3/init.lua
+++ b/scripts/eressea/e3/init.lua
@@ -17,5 +17,6 @@ return {
require('eressea'),
require('eressea.xmasitems'),
require('eressea.frost'),
- require('eressea.ents')
+ require('eressea.ents'),
+ require('eressea.e3.familiars'),
}
diff --git a/src/battle.c b/src/battle.c
index 1e6692a68..b69bab5d6 100644
--- a/src/battle.c
+++ b/src/battle.c
@@ -916,17 +916,13 @@ void kill_troop(troop dt)
rmtroop(dt);
if (!df->alive) {
char eqname[64];
- const struct equipment *eq;
const race *rc = u_race(du);
item *drops = item_spoil(rc, du->number - df->run.number);
if (drops != NULL) {
i_merge(&du->items, &drops);
}
sprintf(eqname, "spo_%s", rc->_name);
- eq = get_equipment(eqname);
- if (eq != NULL) {
- equip_items(&du->items, eq);
- }
+ equip_unit_mask(du, eqname, EQUIP_ITEMS);
}
}
diff --git a/src/bind_monsters.c b/src/bind_monsters.c
index 76afffc15..af630bb41 100644
--- a/src/bind_monsters.c
+++ b/src/bind_monsters.c
@@ -7,7 +7,6 @@
#include
-#include
#include
#include
#include
diff --git a/src/helpers.c b/src/helpers.c
index 170ca2969..8acabd97c 100644
--- a/src/helpers.c
+++ b/src/helpers.c
@@ -31,7 +31,6 @@ without prior permission by the authors of Eressea.
#include
#include
#include
-#include
#include
#include
#include
diff --git a/src/kernel/config.c b/src/kernel/config.c
index 8c7e64afe..54d030b76 100644
--- a/src/kernel/config.c
+++ b/src/kernel/config.c
@@ -30,7 +30,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "connection.h"
#include "building.h"
#include "direction.h"
-#include "equipment.h"
#include "faction.h"
#include "group.h"
#include "item.h"
@@ -564,7 +563,6 @@ void kernel_done(void)
attrib_done();
item_done();
message_done();
- equipment_done();
reports_done();
curses_done();
crmessage_done();
diff --git a/src/kernel/equipment.c b/src/kernel/equipment.c
index 7b1af07f9..39e59bf43 100644
--- a/src/kernel/equipment.c
+++ b/src/kernel/equipment.c
@@ -41,59 +41,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include
#include
-void equipment_setskill(equipment * eq, skill_t sk, const char *value)
-{
- if (eq != NULL) {
- if (value != NULL) {
- eq->skills[sk] = str_strdup(value);
- }
- else if (eq->skills[sk]) {
- free(eq->skills[sk]);
- }
- }
-}
-
-typedef struct lazy_spell {
- struct spellref *spref;
- int level;
-} lazy_spell;
-
-void equipment_addspell(equipment * eq, const char * name, int level)
-{
- if (eq) {
- lazy_spell *ls = malloc(sizeof(lazy_spell));
- ls->spref = spellref_create(NULL, name);
- ls->level = level;
- selist_push(&eq->spells, ls);
- }
-}
-
-void
-equipment_setitem(equipment * eq, const item_type * itype, const char *value)
-{
- if (eq != NULL) {
- if (itype != NULL) {
- itemdata *idata = eq->items;
- while (idata && idata->itype != itype) {
- idata = idata->next;
- }
- if (idata == NULL) {
- idata = (itemdata *)malloc(sizeof(itemdata));
- idata->itype = itype;
- idata->value = str_strdup(value);
- idata->next = eq->items;
- eq->items = idata;
- }
- }
- }
-}
-
-void
-equipment_setcallback(struct equipment *eq, equip_callback_fun callback)
-{
- eq->callback = callback;
-}
-
bool equip_unit(struct unit *u, const char *eqname)
{
return equip_unit_mask(u, eqname, EQUIP_ALL);
@@ -101,228 +48,8 @@ bool equip_unit(struct unit *u, const char *eqname)
bool equip_unit_mask(struct unit *u, const char *eqname, int mask)
{
- const equipment * eq = get_equipment(eqname);
- if (eq) {
- equip_unit_set(u, eq, mask);
- return true;
- }
if (callbacks.equip_unit) {
return callbacks.equip_unit(u, eqname, mask);
}
return false;
}
-
-void equip_unit_set(struct unit *u, const equipment *eq, int mask)
-{
- if (mask & EQUIP_SKILLS) {
- int sk;
- for (sk = 0; sk != MAXSKILLS; ++sk) {
- if (eq->skills[sk] != NULL) {
- int i = dice_rand(eq->skills[sk]);
- if (i > 0) {
- set_level(u, (skill_t)sk, i);
- if (sk == SK_STAMINA) {
- u->hp = unit_max_hp(u) * u->number;
- }
- }
- }
- }
- }
-
- if (mask & EQUIP_SPELLS) {
- if (eq->spells) {
- selist * ql = eq->spells;
- int qi;
- sc_mage * mage = get_mage_depr(u);
-
- for (qi = 0; ql; selist_advance(&ql, &qi, 1)) {
- lazy_spell *sbe = (lazy_spell *)selist_get(ql, qi);
- spell *sp = spellref_get(sbe->spref);
- unit_add_spell(u, mage, sp, sbe->level);
- }
- }
- }
-
- if (eq->items && mask & EQUIP_ITEMS) {
- itemdata *idata;
- for (idata = eq->items; idata != NULL; idata = idata->next) {
- int i = u->number * dice_rand(idata->value);
- if (i > 0) {
- i_add(&u->items, i_new(idata->itype, i));
- }
- }
- }
-
- if (eq->subsets) {
- int i;
- for (i = 0; eq->subsets[i].sets; ++i) {
- if (chance(eq->subsets[i].chance)) {
- double rnd = (1 + rng_int() % 1000) / 1000.0;
- int k;
- for (k = 0; eq->subsets[i].sets[k].set; ++k) {
- if (rnd <= eq->subsets[i].sets[k].chance) {
- equip_unit_set(u, eq->subsets[i].sets[k].set, mask);
- break;
- }
- rnd -= eq->subsets[i].sets[k].chance;
- }
- }
- }
- }
-
- if (mask & EQUIP_SPECIAL) {
- if (eq->callback) {
- eq->callback(eq, u);
- }
- }
-}
-
-void equip_items(struct item **items, const struct equipment *eq)
-{
- if (eq) {
- itemdata *idata;
-
- for (idata = eq->items; idata != NULL; idata = idata->next) {
- int i = dice_rand(idata->value);
- if (i > 0) {
- i_add(items, i_new(idata->itype, i));
- }
- }
- if (eq->subsets) {
- int i;
- for (i = 0; eq->subsets[i].sets; ++i) {
- if (chance(eq->subsets[i].chance)) {
- double rnd = (1 + rng_int() % 1000) / 1000.0;
- int k;
- for (k = 0; eq->subsets[i].sets[k].set; ++k) {
- if (rnd <= eq->subsets[i].sets[k].chance) {
- equip_items(items, eq->subsets[i].sets[k].set);
- break;
- }
- rnd -= eq->subsets[i].sets[k].chance;
- }
- }
- }
- }
- }
-}
-
-void free_ls(void *arg) {
- lazy_spell *ls = (lazy_spell*)arg;
- spellref_free(ls->spref);
- free(ls);
-}
-
-static critbit_tree cb_equipments = { 0 };
-
-#define EQNAMELEN 24
-
-typedef struct eq_entry {
- char key[EQNAMELEN];
- equipment *value;
-} eq_entry;
-
-typedef struct name_cb_data {
- const equipment *find;
- const char *result;
-} name_cb_data;
-
-
-static int equipment_name_cb(const void * match, const void * key, size_t keylen, void *cbdata) {
- const eq_entry *ent = (const eq_entry *)match;
- name_cb_data *query = (name_cb_data *)cbdata;
- if (ent->value == query->find) {
- query->result = ent->key;
- return 1;
- }
- return 0;
-}
-
-const char *equipment_name(const struct equipment *eq)
-{
- name_cb_data data;
-
- data.find = eq;
- data.result = NULL;
- cb_foreach(&cb_equipments, "", 0, equipment_name_cb, &data);
- return data.result;
-}
-
-equipment *get_equipment(const char *eqname)
-{
- const void *match;
-
- if (strlen(eqname) >= EQNAMELEN) {
- log_warning("equipment name is longer than %d bytes: %s", EQNAMELEN - 1, eqname);
- return NULL;
- }
-
- match = cb_find_str(&cb_equipments, eqname);
- if (match) {
- const eq_entry *ent = (const eq_entry *)match;
- return ent->value;
- }
- return NULL;
-}
-
-equipment *create_equipment(const char *eqname)
-{
- size_t len = strlen(eqname);
- eq_entry ent;
-
- if (len >= EQNAMELEN) {
- log_error("equipment name is longer than %d bytes: %s", EQNAMELEN-1, eqname);
- len = EQNAMELEN-1;
- }
- memset(ent.key, 0, EQNAMELEN);
- memcpy(ent.key, eqname, len);
-
- ent.value = (equipment *)calloc(1, sizeof(equipment));
-
- cb_insert(&cb_equipments, &ent, sizeof(ent));
- return ent.value;
-}
-
-equipment *get_or_create_equipment(const char *eqname)
-{
- equipment *eq = get_equipment(eqname);
- if (!eq) {
- return create_equipment(eqname);
- }
- return eq;
-}
-
-static void free_equipment(equipment *eq) {
- int i;
- if (eq->spells) {
- selist_foreach(eq->spells, free_ls);
- selist_free(eq->spells);
- }
- while (eq->items) {
- itemdata *next = eq->items->next;
- free(eq->items->value);
- free(eq->items);
- eq->items = next;
- }
- if (eq->subsets) {
- for (i = 0; eq->subsets[i].sets; ++i) {
- free(eq->subsets[i].sets);
- }
- free(eq->subsets);
- }
- for (i = 0; i != MAXSKILLS; ++i) {
- free(eq->skills[i]);
- }
-}
-
-static int free_equipment_cb(const void * match, const void * key, size_t keylen, void *cbdata) {
- const eq_entry * ent = (const eq_entry *)match;
- free_equipment(ent->value);
- free(ent->value);
- return 0;
-}
-
-void equipment_done(void) {
- cb_foreach(&cb_equipments, "", 0, free_equipment_cb, 0);
- cb_clear(&cb_equipments);
-}
diff --git a/src/kernel/equipment.h b/src/kernel/equipment.h
index 5ba1a4182..7c95b8f67 100644
--- a/src/kernel/equipment.h
+++ b/src/kernel/equipment.h
@@ -19,64 +19,18 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#ifndef H_KRNL_EQUIPMENT_H
#define H_KRNL_EQUIPMENT_H
-#include "skill.h"
-
#include
#ifdef __cplusplus
extern "C" {
#endif
- struct spell;
- struct item;
struct unit;
- typedef struct itemdata {
- const struct item_type *itype;
- char *value;
- struct itemdata *next;
- } itemdata;
-
- typedef struct subsetitem {
- struct equipment *set;
- float chance;
- } subsetitem;
-
- typedef struct subset {
- float chance;
- subsetitem *sets;
- } subset;
-
- typedef void(*equip_callback_fun) (const struct equipment *, struct unit *);
-
- typedef struct equipment {
- struct itemdata *items;
- char *skills[MAXSKILLS];
- struct selist *spells;
- struct subset *subsets;
- equip_callback_fun callback;
- } equipment;
-
- void equipment_done(void);
-
- const char *equipment_name(const struct equipment *eq);
- struct equipment *get_or_create_equipment(const char *eqname);
- struct equipment *get_equipment(const char *eqname);
- struct equipment *create_equipment(const char *eqname);
-
- void equipment_setitem(struct equipment *eq,
- const struct item_type *itype, const char *value);
- void equipment_setskill(struct equipment *eq, skill_t sk,
- const char *value);
- void equipment_addspell(struct equipment *eq, const char *name, int level);
- void equipment_setcallback(struct equipment *eq, equip_callback_fun callback);
-
#define EQUIP_SKILLS (1<<1)
#define EQUIP_SPELLS (1<<2)
#define EQUIP_ITEMS (1<<3)
#define EQUIP_SPECIAL (1<<4)
#define EQUIP_ALL (0xFF)
- void equip_items(struct item **items, const struct equipment *eq);
- void equip_unit_set(struct unit *u, const struct equipment *eq, int mask);
bool equip_unit_mask(struct unit *u, const char *eqname, int mask);
bool equip_unit(struct unit *u, const char *eqname);
diff --git a/src/kernel/equipment.test.c b/src/kernel/equipment.test.c
index c09945865..331625c14 100644
--- a/src/kernel/equipment.test.c
+++ b/src/kernel/equipment.test.c
@@ -11,86 +11,40 @@
#include
#include
+static unit *eq_unit;
+static const char *eq_name;
+static int eq_mask;
+
+static bool equip_callback(unit *u, const char *eqname, int mask) {
+ eq_unit = u;
+ eq_name = eqname;
+ eq_mask = mask;
+ return true;
+}
+
static void test_equipment(CuTest * tc)
{
- equipment * eq;
+ callbacks.equip_unit = equip_callback;
unit * u;
- const item_type * it_horses;
- spell *sp;
- sc_mage * mage;
test_setup();
- test_create_race("human");
- enable_skill(SK_MAGIC, true);
- it_horses = test_create_itemtype("horse");
- CuAssertPtrNotNull(tc, it_horses);
- sp = create_spell("testspell");
- CuAssertPtrNotNull(tc, sp);
-
- CuAssertPtrEquals(tc, 0, get_equipment("herpderp"));
- eq = get_or_create_equipment("herpderp");
- CuAssertPtrEquals(tc, eq, get_equipment("herpderp"));
-
- equipment_setitem(eq, it_horses, "1");
- equipment_setskill(eq, SK_MAGIC, "5");
- equipment_addspell(eq, sp->sname, 1);
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
- equip_unit_set(u, eq, EQUIP_ALL);
- CuAssertIntEquals(tc, 1, i_get(u->items, it_horses));
- CuAssertIntEquals(tc, 5, get_level(u, SK_MAGIC));
+ CuAssertIntEquals(tc, true, equip_unit_mask(u, "hodor", EQUIP_ALL));
+ CuAssertIntEquals(tc, EQUIP_ALL, eq_mask);
+ CuAssertPtrEquals(tc, u, eq_unit);
+ CuAssertStrEquals(tc, "hodor", eq_name);
- mage = get_mage_depr(u);
- CuAssertPtrNotNull(tc, mage);
- CuAssertPtrNotNull(tc, mage->spellbook);
- CuAssertTrue(tc, u_hasspell(u, sp));
- test_teardown();
-}
+ CuAssertIntEquals(tc, true, equip_unit_mask(u, "foobar", EQUIP_ITEMS));
+ CuAssertIntEquals(tc, EQUIP_ITEMS, eq_mask);
+ CuAssertPtrEquals(tc, u, eq_unit);
+ CuAssertStrEquals(tc, "foobar", eq_name);
-static void test_get_equipment(CuTest * tc)
-{
- equipment * eq;
+ CuAssertIntEquals(tc, true, equip_unit(u, "unknown"));
+ CuAssertIntEquals(tc, EQUIP_ALL, eq_mask);
+ CuAssertPtrEquals(tc, u, eq_unit);
+ CuAssertStrEquals(tc, "unknown", eq_name);
- test_setup();
- eq = create_equipment("catapultammo123");
- CuAssertPtrNotNull(tc, eq);
- CuAssertStrEquals(tc, "catapultammo123", equipment_name(eq));
- eq = get_equipment("catapultammo123");
- CuAssertPtrNotNull(tc, eq);
- CuAssertStrEquals(tc, "catapultammo123", equipment_name(eq));
- eq = get_equipment("catapult");
- CuAssertPtrEquals(tc, NULL, eq);
- eq = create_equipment("catapult");
- CuAssertPtrNotNull(tc, eq);
- CuAssertPtrEquals(tc, eq, get_equipment("catapult"));
- CuAssertStrEquals(tc, "catapult", equipment_name(eq));
- eq = get_equipment("catapultammo123");
- CuAssertPtrNotNull(tc, eq);
- CuAssertStrEquals(tc, "catapultammo123", equipment_name(eq));
- test_teardown();
-}
-
-static bool equip_test(unit *u, const char *name, int mask) {
- if (mask & EQUIP_ITEMS) {
- i_change(&u->items, it_find("horse"), 1);
- return true;
- }
- return false;
-}
-
-static void test_equipment_callback(CuTest *tc) {
- unit *u;
- item_type *itype;
- test_setup();
- itype = test_create_horse();
- u = test_create_unit(test_create_faction(NULL), test_create_plain(0, 0));
- CuAssertTrue(tc, !equip_unit_mask(u, "horse", EQUIP_ITEMS));
- CuAssertPtrEquals(tc, NULL, u->items);
- callbacks.equip_unit = equip_test;
- CuAssertTrue(tc, equip_unit(u, "horse"));
- CuAssertIntEquals(tc, 1, i_get(u->items, itype));
- CuAssertTrue(tc, !equip_unit_mask(u, "horse", EQUIP_SPELLS));
- CuAssertIntEquals(tc, 1, i_get(u->items, itype));
test_teardown();
}
@@ -98,7 +52,5 @@ CuSuite *get_equipment_suite(void)
{
CuSuite *suite = CuSuiteNew();
SUITE_ADD_TEST(suite, test_equipment);
- SUITE_ADD_TEST(suite, test_get_equipment);
- SUITE_ADD_TEST(suite, test_equipment_callback);
return suite;
}
diff --git a/src/kernel/faction.c b/src/kernel/faction.c
index 43c25d440..bc08ba010 100755
--- a/src/kernel/faction.c
+++ b/src/kernel/faction.c
@@ -285,7 +285,6 @@ unit *addplayer(region * r, faction * f)
{
unit *u;
const char * name;
- const struct equipment* eq;
assert(r->land);
if (rpeasants(r) < PEASANT_MIN) {
@@ -296,10 +295,7 @@ unit *addplayer(region * r, faction * f)
faction_setorigin(f, 0, r->x, r->y);
u = create_unit(r, f, 1, f->race, 0, NULL, NULL);
name = config_get("rules.equip_first");
- eq = get_equipment(name ? name : "first_unit");
- if (eq) {
- equip_items(&u->items, eq);
- }
+ equip_unit(u, name ? name : "first_unit");
u->hp = unit_max_hp(u) * u->number;
fset(u, UFL_ISNEW);
if (f->race == get_race(RC_DAEMON)) {
diff --git a/src/kernel/save.c b/src/kernel/save.c
index c1c8010d1..b43d9bd5d 100644
--- a/src/kernel/save.c
+++ b/src/kernel/save.c
@@ -27,7 +27,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "building.h"
#include "calendar.h"
#include "connection.h"
-#include "equipment.h"
#include "faction.h"
#include "group.h"
#include "item.h"
@@ -1331,29 +1330,7 @@ static void fix_familiars(void) {
/* unit is potentially a familiar */
attrib * a = a_find(u->attribs, &at_mage);
attrib * am = a_find(u->attribs, &at_familiarmage);
- if (am) {
- sc_mage *mage = a ? (sc_mage *)a->data.v : NULL;
- /* a familiar */
- if (!mage) {
- log_error("%s seems to be a familiar with no magic.",
- unitname(u));
- mage = create_mage(u, M_GRAY);
- }
- if (!mage->spellbook) {
- char eqname[32];
- equipment *eq;
-
- snprintf(eqname, sizeof(eqname), "fam_%s", u->_race->_name);
- eq = get_equipment(eqname);
- if (eq && eq->spells) {
- log_error("%s seems to be a familiar with no spells.",
- unitname(u));
- /* magical familiar, no spells */
- equip_unit_set(u, eq, EQUIP_SPELLS);
- }
- }
- }
- else if (a) {
+ if (!am && a) {
/* not a familiar, but magical */
attrib * ae = a_find(u->attribs, &at_eventhandler);
if (ae) {
diff --git a/src/magic.test.c b/src/magic.test.c
index 5533d93ec..95c2d250d 100644
--- a/src/magic.test.c
+++ b/src/magic.test.c
@@ -4,6 +4,7 @@
#include "teleport.h"
#include "give.h"
+#include
#include
#include
#include
@@ -556,39 +557,32 @@ static void test_familiar_age(CuTest *tc) {
test_teardown();
}
+static unit *eq_unit;
+static char *eq_name;
+static int eq_mask;
+
+static bool equip_callback(unit *u, const char *eqname, int mask) {
+ eq_unit = u;
+ eq_name = str_strdup(eqname);
+ eq_mask = mask;
+ return true;
+}
+
static void test_familiar_equip(CuTest *tc) {
unit *mag, *u;
- equipment *eq;
- const item_type * itype;
- spell *sp;
- sc_mage * mage;
test_setup();
-
- itype = test_create_itemtype("horse");
- CuAssertPtrNotNull(tc, itype);
- sp = create_spell("testspell");
- CuAssertPtrNotNull(tc, sp);
-
- eq = get_or_create_equipment("fam_human");
- equipment_setitem(eq, itype, "1");
- equipment_setskill(eq, SK_ENTERTAINMENT, "5");
- equipment_addspell(eq, sp->sname, 1);
-
+ callbacks.equip_unit = equip_callback;
mag = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
u = test_create_unit(mag->faction, test_create_region(0, 0, NULL));
+ CuAssertStrEquals(tc, "human", u->_race->_name);
set_familiar(mag, u);
create_newfamiliar(mag, u);
- CuAssertIntEquals(tc, 1, i_get(u->items, itype));
- CuAssertIntEquals(tc, 5, get_level(u, SK_ENTERTAINMENT));
- CuAssertIntEquals(tc, 0, get_level(u, SK_MAGIC));
- mage = get_mage(u);
- CuAssertPtrNotNull(tc, mage);
- CuAssertPtrNotNull(tc, mage->spellbook);
- set_level(u, SK_MAGIC, 1);
- CuAssertPtrEquals(tc, mage, get_mage_depr(u));
- CuAssertTrue(tc, u_hasspell(u, sp));
+ CuAssertIntEquals(tc, EQUIP_ALL, eq_mask);
+ CuAssertPtrEquals(tc, u, eq_unit);
+ CuAssertStrEquals(tc, "fam_human", eq_name);
+ free(eq_name);
test_teardown();
}
diff --git a/src/tests.c b/src/tests.c
index 336cb5231..d69651b82 100644
--- a/src/tests.c
+++ b/src/tests.c
@@ -212,7 +212,6 @@ static void test_reset(void) {
free_config();
default_locale = 0;
calendar_cleanup();
- equipment_done();
close_orders();
free_special_directions();
free_locales();
diff --git a/src/xmlreader.c b/src/xmlreader.c
index cbae06f58..c3f3ac5fd 100644
--- a/src/xmlreader.c
+++ b/src/xmlreader.c
@@ -16,7 +16,6 @@ without prior permission by the authors of Eressea.
#include "xmlreader.h"
#include "kernel/building.h"
-#include "kernel/equipment.h"
#include "kernel/item.h"
#include "kernel/messages.h"
#include "kernel/race.h"
@@ -838,198 +837,6 @@ static int parse_resources(xmlDocPtr doc)
return results;
}
-static void add_items(equipment * eq, xmlNodeSetPtr nsetItems)
-{
- if (nsetItems != NULL && nsetItems->nodeNr > 0) {
- int i;
- for (i = 0; i != nsetItems->nodeNr; ++i) {
- xmlNodePtr node = nsetItems->nodeTab[i];
- xmlChar *propValue;
- const struct item_type *itype;
-
- propValue = xmlGetProp(node, BAD_CAST "name");
- assert(propValue != NULL);
- itype = it_find((const char *)propValue);
- xmlFree(propValue);
- if (itype != NULL) {
- propValue = xmlGetProp(node, BAD_CAST "amount");
- if (propValue != NULL) {
- equipment_setitem(eq, itype, (const char *)propValue);
- xmlFree(propValue);
- }
- }
- }
- }
-}
-
-static void add_spells(equipment * eq, xmlNodeSetPtr nsetItems)
-{
- if (nsetItems != NULL && nsetItems->nodeNr > 0) {
- int i;
- for (i = 0; i != nsetItems->nodeNr; ++i) {
- xmlNodePtr node = nsetItems->nodeTab[i];
- xmlChar *propValue;
- int level;
- const char *name;
-
- propValue = xmlGetProp(node, BAD_CAST "name");
- assert(propValue != NULL);
- name = (const char *)propValue;
- level = xml_ivalue(node, "level", 0);
- if (level > 0) {
- equipment_addspell(eq, name, level);
- }
- else {
- log_error("spell '%s' for equipment-set '%s' has no level\n", name, equipment_name(eq));
- }
- xmlFree(propValue);
- }
- }
-}
-
-static void add_skills(equipment * eq, xmlNodeSetPtr nsetSkills)
-{
- if (nsetSkills != NULL && nsetSkills->nodeNr > 0) {
- int i;
- for (i = 0; i != nsetSkills->nodeNr; ++i) {
- xmlNodePtr node = nsetSkills->nodeTab[i];
- xmlChar *propValue;
- skill_t sk;
-
- propValue = xmlGetProp(node, BAD_CAST "name");
- assert(propValue != NULL);
- sk = findskill((const char *)propValue);
- if (sk == NOSKILL) {
- log_error("unknown skill '%s' in equipment-set %s\n", (const char *)propValue, equipment_name(eq));
- xmlFree(propValue);
- }
- else {
- xmlFree(propValue);
- propValue = xmlGetProp(node, BAD_CAST "level");
- if (propValue != NULL) {
- equipment_setskill(eq, sk, (const char *)propValue);
- xmlFree(propValue);
- }
- }
- }
- }
-}
-
-static void
-add_subsets(xmlDocPtr doc, equipment * eq, xmlNodeSetPtr nsetSubsets)
-{
- xmlXPathContextPtr xpath = xmlXPathNewContext(doc);
- if (nsetSubsets != NULL && nsetSubsets->nodeNr > 0) {
- int i;
-
- eq->subsets = calloc(nsetSubsets->nodeNr + 1, sizeof(subset));
- for (i = 0; i != nsetSubsets->nodeNr; ++i) {
- xmlXPathObjectPtr xpathResult;
- xmlNodePtr node = nsetSubsets->nodeTab[i];
- xmlChar *propValue;
-
- eq->subsets[i].chance = 1.0f;
- propValue = xmlGetProp(node, BAD_CAST "chance");
- if (propValue != NULL) {
- eq->subsets[i].chance = (float)atof((const char *)propValue);
- xmlFree(propValue);
- }
- xpath->node = node;
- xpathResult = xmlXPathEvalExpression(BAD_CAST "set", xpath);
- if (xpathResult->nodesetval) {
- xmlNodeSetPtr nsetSets = xpathResult->nodesetval;
- float totalChance = 0.0f;
-
- if (nsetSets->nodeNr > 0) {
- int set;
- eq->subsets[i].sets =
- calloc(nsetSets->nodeNr + 1, sizeof(subsetitem));
- for (set = 0; set != nsetSets->nodeNr; ++set) {
- xmlNodePtr nodeSet = nsetSets->nodeTab[set];
- float chance = 1.0f;
-
- propValue = xmlGetProp(nodeSet, BAD_CAST "chance");
- if (propValue != NULL) {
- chance = (float)atof((const char *)propValue);
- xmlFree(propValue);
- }
- totalChance += chance;
-
- propValue = xmlGetProp(nodeSet, BAD_CAST "name");
- assert(propValue != NULL);
- eq->subsets[i].sets[set].chance = chance;
- eq->subsets[i].sets[set].set =
- get_or_create_equipment((const char *)propValue);
- xmlFree(propValue);
- }
- }
- if (totalChance > 1.0f) {
- log_error("total chance exceeds 1.0: %f in equipment set %s.\n", totalChance, equipment_name(eq));
- }
- }
- xmlXPathFreeObject(xpathResult);
- }
- }
- xmlXPathFreeContext(xpath);
-}
-
-static int parse_equipment(xmlDocPtr doc)
-{
- xmlXPathContextPtr xpath = xmlXPathNewContext(doc);
- xmlXPathObjectPtr xpathRaces;
- int result = 0;
-
- /* reading eressea/equipment/set */
- xpathRaces = xmlXPathEvalExpression(BAD_CAST "/eressea/equipment/set", xpath);
- if (xpathRaces->nodesetval) {
- xmlNodeSetPtr nsetRaces = xpathRaces->nodesetval;
- int i;
-
- result += nsetRaces->nodeNr;
- for (i = 0; i != nsetRaces->nodeNr; ++i) {
- xmlNodePtr node = nsetRaces->nodeTab[i];
- xmlChar *propName = xmlGetProp(node, BAD_CAST "name");
-
- if (propName != NULL) {
- equipment *eq = get_equipment((const char *)propName);
- xmlXPathObjectPtr xpathResult;
-
- if (!eq) {
- eq = create_equipment((const char *)propName);
- }
-
- xpath->node = node;
-
- xpathResult = xmlXPathEvalExpression(BAD_CAST "item", xpath);
- assert(!eq->items);
- add_items(eq, xpathResult->nodesetval);
- xmlXPathFreeObject(xpathResult);
-
- xpathResult = xmlXPathEvalExpression(BAD_CAST "spell", xpath);
- assert(!eq->spells);
- add_spells(eq, xpathResult->nodesetval);
- xmlXPathFreeObject(xpathResult);
-
- xpathResult = xmlXPathEvalExpression(BAD_CAST "skill", xpath);
- add_skills(eq, xpathResult->nodesetval);
- xmlXPathFreeObject(xpathResult);
-
- xpathResult = xmlXPathEvalExpression(BAD_CAST "subset", xpath);
- assert(!eq->subsets);
- add_subsets(doc, eq, xpathResult->nodesetval);
- xmlXPathFreeObject(xpathResult);
-
- xmlFree(propName);
- }
- }
- }
-
- xmlXPathFreeObject(xpathRaces);
- xmlXPathFreeContext(xpath);
-
- return result;
-}
-
static int parse_spellbooks(xmlDocPtr doc)
{
xmlXPathContextPtr xpath = xmlXPathNewContext(doc);
@@ -1670,7 +1477,6 @@ void register_xmlreader(void)
xml_register_callback(parse_buildings); /* requires resources */
xml_register_callback(parse_ships); /* requires resources, terrains */
- xml_register_callback(parse_equipment); /* requires resources */
xml_register_callback(parse_spellbooks); /* requires spells */
xml_register_callback(parse_spells); /* requires resources */